Aracılığıyla paylaş


Test yazma ve çalıştırma — MRTK2

MRTK'nin güvenilir olduğundan emin olmak için, MRTK'nin kodda yapılan değişikliklerin mevcut davranışı gerilemediğinden emin olmak için bir dizi testi vardır. MRTK gibi büyük bir kod tabanında iyi bir test kapsamına sahip olmak, kararlılık ve değişiklik yaparken güven açısından çok önemlidir.

MRTK, NUnit'in Unity tümleştirmesini kullanan Unity Test Çalıştırıcısını kullanır. Bu kılavuz, MRTK'ye test ekleme konusunda bir başlangıç noktası sağlar. Sağlanan bağlantılarda aranabilecek Unity Test Çalıştırıcısı ve NUnit açıklanmaz.

Çekme isteği göndermeden önce şunları yaptığınızdan emin olun:

  1. Değişikliklerinizin mevcut davranışı geriletmemesi için testleri yerel olarak çalıştırın (herhangi bir test başarısız olursa PR'leri tamamlamaya izin verilmez).

  2. Bir hatayı düzeltiyorsanız, düzeltmeyi test etmek için bir test yazın ve gelecekteki kod değişikliklerinin bunu yeniden bozmayeceğinden emin olun.

  3. Bir özellik yazıyorsanız, yaklaşan kod değişikliklerinin bu özelliği bozmasını önlemek için yeni testler yazın.

Şu anda playmode testlerinin Unity 2018.4'te çalıştırılması amaçlanıyor ve Unity'nin diğer sürümlerinde başarısız olabilir

Testleri çalıştırma

Unity düzenleyicisi

Unity Test ÇalıştırıcısıPencere>Genel>Test Çalıştırıcısı altında bulunabilir ve kullanılabilir tüm MRTK yürütme ve düzenleme modu testlerini gösterir.

Komut satırı

Testler, konumunda Scripts\test\run_playmode_tests.ps1bulunan bir powershell betiği tarafından da çalıştırılabilir. Bu işlem, playmode testlerini github / CI üzerinde yürütüldükleri gibi çalıştırır (aşağıya bakın) ve sonuçları yazdırır. Aşağıda betiği çalıştırmaya ilişkin bazı örnekler verilmiştir

Testleri H:\mrtk.dev konumunda, Unity 2018.4 ile (örneğin Unity 2018.4.26f1) bulunan projede çalıştırın

.\run_playmode_tests.ps1 H:\mrtk.dev -unityExePath "C:\Program Files\Unity\Hub\Editor\2018.4.26f1\Editor\Unity.exe"

Testleri H:\mrtk.dev konumunda, Unity 2018.4 ile bulunan projede çalıştırın, sonuçları C:\playmode_test_out

.\run_playmode_tests.ps1 H:\mrtk.dev -unityExePath "C:\Program Files\Unity\Hub\Editor\2018.4.26f1\Editor\Unity.exe" -outFolder "C:\playmode_test_out\"

Playmode testlerini betik aracılığıyla run_repeat_tests.ps1 birden çok kez çalıştırmak da mümkündür. içinde run_playmode_tests.ps1 kullanılan tüm parametreler kullanılabilir.

.\run_repeat_tests.ps1 -Times 5

Çekme isteği doğrulama

MRTK'nin CI'sı tüm yapılandırmalarda MRTK oluşturacak ve tüm düzenleme ve yürütme modu testlerini çalıştıracaktır. Ci, kullanıcı yeterli haklara sahipse github pr'sine /azp run mrtk_pr bir yorum gönderilerek tetiklenebilir. CI çalıştırmaları, çekme isteğinin 'denetimler' sekmesinde görülebilir.

Ancak tüm testler başarıyla geçtikten sonra pr main ile birleştirilebilir.

Stres testleri / toplu testler

Bazen testler yalnızca zaman zaman başarısız olur ve bu da hata ayıklamayı sinir bozucu olabilir.

Yerel olarak birden çok test çalıştırması yapmak için, test betiklerini değiştirin. Aşağıdaki Python betiği bu senaryoyu daha kullanışlı hale getirmelidir.

Python betiğini çalıştırma önkoşulu , Python 3.X'in yüklü olmasıdır.

Birden çok kez yürütülmesi gereken tek bir test için:

[UnityTest]
public IEnumerator MyTest() {...}

Komut satırından aşağıdakileri çalıştırın (PowerShell önerilir)

cd scripts\tests
# Repeat the test 5 times. Default is 100
python .\generate_repeat_tests.py -n 5 -t MyTest

Çıktıyı kopyalayıp test dosyanıza yapıştırın. Aşağıdaki betik, sırayla birden çok test çalıştırmaya yöneliktir:

cd scripts\tests
# Repeat the test 5 times. Default is 100
python .\generate_repeat_tests.py -n 5 -t MyTest MySecondTest

Yeni test dosyası artık

[UnityTest]
public IEnumerator A1MyTest0(){ yield return MyTest();}
[UnityTest]
public IEnumerator A2MyTest0(){ yield return MyTest();}
[UnityTest]
public IEnumerator A3MyTest0(){ yield return MyTest();}
[UnityTest]
public IEnumerator A4MyTest0(){ yield return MyTest();}
[UnityTest]
public IEnumerator MyTest() {...}

Test çalıştırıcısını açın ve art arda çağrılabilecek yeni testleri gözlemleyin.

Test yazma

Yeni kod için eklenebilecek iki tür test vardır

  • Yürütme modu testleri
  • Düzenleme modu testleri

Yürütme modu testleri

MRTK oynatma modu testleri, yeni özelliğinizin eller veya gözler gibi farklı giriş kaynaklarına nasıl yanıt verdiğini test etme özelliğine sahiptir.

Yeni yürütme modu testleri BasePlayModeTests'i devralabilir veya aşağıdaki iskelet kullanılabilir.

Yeni bir yürütme modu testi oluşturmak için:

  • Varlıklar > MRTK > Testleri > PlayModeTests'e gidin
  • Sağ tıklayın, Test > Oluştur > C# Test Betiği
  • Varsayılan şablonu aşağıdaki iskeletle değiştirin
#if !WINDOWS_UWP
// When the .NET scripting backend is enabled and C# projects are built
// The assembly that this file is part of is still built for the player,
// even though the assembly itself is marked as a test assembly (this is not
// expected because test assemblies should not be included in player builds).
// Because the .NET backend is deprecated in 2018 and removed in 2019 and this
// issue will likely persist for 2018, this issue is worked around by wrapping all
// play mode tests in this check.

using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
using NUnit.Framework;
using System;
using System.Collections;
using System.Linq;
using UnityEngine;
using UnityEngine.TestTools;

namespace Microsoft.MixedReality.Toolkit.Tests
{
    class ExamplePlayModeTests
    {
        // This method is called once before we enter play mode and execute any of the tests
        // do any kind of setup here that can't be done in playmode
        public void Setup()
        {
            // eg installing unity packages is only possible in edit mode
            // so if a test requires TextMeshPro we will need to check for the package before entering play mode
            PlayModeTestUtilities.InstallTextMeshProEssentials();
        }

        // Do common setup for each of your tests here - this will be called for each individual test after entering playmode
        // Note that this uses UnitySetUp instead of [SetUp] because the init function needs to await a frame passing
        // to ensure that the MRTK system has had the chance to fully set up before the test runs.
        [UnitySetUp]
        public IEnumerator Init()
        {
            // in most play mode test cases you would want to at least create an MRTK GameObject using the default profile
            TestUtilities.InitializeMixedRealityToolkit(true);
            yield return null;
        }

        // Destroy the scene - this method is called after each test listed below has completed
        // Note that this uses UnityTearDown instead of [TearDown] because the init function needs to await a frame passing
        // to ensure that the MRTK system has fully torn down before the next test setup->run cycle starts.
        [UnityTearDown]
        public IEnumerator TearDown()
        {
            PlayModeTestUtilities.TearDown();
            yield return null;
        }

        #region Tests

        /// <summary>
        /// Skeleton for a new MRTK play mode test.
        /// </summary>
        [UnityTest]
        public IEnumerator TestMyFeature()
        {
            // ----------------------------------------------------------
            // EXAMPLE PLAY MODE TEST METHODS
            // ----------------------------------------------------------
            // Getting the input system
            // var inputSystem = PlayModeTestUtilities.GetInputSystem();

            // Creating a new test hand for input
            // var rightHand = new TestHand(Handedness.Right);
            // yield return rightHand.Show(new Vector3(0, 0, 0.5f));

            // Moving the new test hand
            // We are doing a yield return here because moving the hand to a new position
            // requires multiple frames to complete the action.
            // yield return rightHand.MoveTo(new Vector3(0, 0, 2.0f));

            // Getting a specific pointer from the hand
            // var linePointer = PointerUtils.GetPointer<LinePointer>(Handedness.Right);
            // Assert.IsNotNull(linePointer);
            // ---------------------------------------------------------

            // Your new test here
            yield return null;
        }
        #endregion
    }
}
#endif

Düzenleme modu testleri

Düzenleme modu testleri Unity'nin düzenleme modunda yürütülür ve Karma Gerçeklik Toolkit deposundaki MRTK>Testleri>EditModeTests klasörüne eklenebilir. Yeni bir test oluşturmak için aşağıdaki şablon kullanılabilir:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using NUnit.Framework;

namespace Microsoft.MixedReality.Toolkit.Tests
{
    class EditModeExampleTest
    {
        [Test]
        /// the name of this method will be used as test name in the unity test runner
        public void TestEditModeExampleFeature()
        {

        }
    }
}

Adlandırma kurallarını test edin

Testler genellikle test ettikleri sınıfa veya test ettikleri senaryoya göre adlandırılmalıdır. Örneğin, test edilecek bir sınıf verilmiştir:

namespace Microsoft.MixedReality.Toolkit.Input
{
    class InterestingInputClass
    {
    }
}

Testi adlandırmayı göz önünde bulundurun

namespace Microsoft.MixedReality.Toolkit.Tests.Input
{
    class InterestingInputClassTest
    {
    }
}

Testi, karşılık gelen test olmayan dosyasına benzer bir klasör hiyerarşisine yerleştirmeyi göz önünde bulundurun. Örnek:

Non-Test: Assets/MRTK/Core/Utilities/InterestingUtilityClass.cs
Test: Assets/MRTK/Tests/EditModeTests/Core/Utilities/InterestingUtilityClassTest.cs

Bu, böyle bir test sınıfı varsa her sınıfın karşılık gelen test sınıfını bulmanın açık bir yolunun olduğundan emin olmaktır.

Senaryo tabanlı testlerin yerleşimi daha az tanımlanmıştır. Örneğin, test genel giriş sistemini kullanırsa, bunu ilgili düzenleme modunda veya yürütme modu test klasöründe bir "InputSystem" klasörüne yerleştirmeyi göz önünde bulundurun.

Test betiği simgeleri

Yeni bir test eklerken lütfen betiği doğru MRTK simgesine sahip olacak şekilde değiştirin. Bunu yapmak için kolay bir MRTK aracı vardır:

  1. Karma Gerçeklik Araç Seti menü öğesine gidin.
  2. Yardımcı Programlar'a, ardından Güncelleştir'e ve ardından Simgeler'e tıklayın.
  3. Testler'e tıklayın; güncelleştirici otomatik olarak çalışır ve simgeleri eksik olan test betiklerini güncelleştirir.

MRTK Yardımcı Program yöntemleri

Bu bölümde MRTK için test yazarken yaygın olarak kullanılan kod parçacıkları / yöntemlerinden bazıları gösterilmektedir.

MRTK'nin ayarlanmasına ve MRTK'daki bileşenlerle etkileşimlerin test edilmesine yardımcı olan iki Yardımcı Program sınıfı vardır

TestUtilities, MRTK sahnenizi ve GameObjects'inizi ayarlamak için aşağıdaki yöntemleri sağlar:

/// creates the mrtk GameObject and sets the default profile if passed param is true
TestUtilities.InitializeMixedRealityToolkit()

/// creates an empty scene prior to adding the mrtk GameObject to it
TestUtilities.InitializeMixedRealityToolkitAndCreateScenes();

/// sets the initial playspace transform and camera position
TestUtilities.InitializePlayspace();

/// destroys previously created mrtk GameObject and playspace
TestUtilities.ShutdownMixedRealityToolkit();

MrTK'ya yeni testler eklenirken bu yardımcı sınıfların düzenli aralıklarla genişletildikleri için ve PlayModeTestUtilities api belgelerine TestUtilities bakın.