Testleri yazma ve çalıştırma

MRTK 'nin güvenilir olduğundan emin olmak için MRTK, koddaki değişikliklerin mevcut davranışa giriş olmamasını sağlamak için bir test kümesine sahiptir. MRTK gibi büyük bir kod tabanında iyi test kapsamı olması, kararlılık açısından önemlidir ve değişiklik yaparken güvenle yapılır.

MRTK, NUnit'in Unity tümleştirmesini kullanan Unity Test Çalıştırıcısı 'nı kullanır. Bu kılavuz, MRTK 'a testlerin nasıl ekleneceği üzerine bir başlangıç noktası sağlar. Unity Test Çalıştırıcısı ve NUnit , belirtilen bağlantılarda aranmayacak şekilde açıklanmaz.

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

  1. Testlerinizi yerel olarak çalıştırın, böylece değişikliklerinizin mevcut davranışa giriş yapmayın (herhangi bir test başarısız olursa PR 'ler ' i tamamlamada izin verilmez).

  2. Bir hatayı düzelttiğinde, düzeltmeyi test etmek için bir test yazın ve gelecekteki kod değişikliklerinin yeniden kesilmesini olmamasını sağlayın.

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

Şu anda PlayMode testlerinin Unity 2018,4 ' de çalıştırılması amaçlanmıştır ve diğer Unity sürümlerinde başarısız olabilir

Testleri çalıştırma

Unity Düzenleyicisi

Unity Test Çalıştırıcısı , penceregenelTest Çalıştırıcısı altında bulunabilir ve tüm kullanılabilir mrtk Play ve düzenleme modu testlerini gösterir.

Komut satırı

Testler, konumunda bulunan bir PowerShell betiği tarafından da çalıştırılabilir . Bu işlem, GitHub/CI üzerinde yürütüldüğü (aşağıya bakın) ve sonuçları yazdırırken PlayMode testlerini tam olarak çalıştırır. Betiği çalıştırmaya ilişkin bazı örnekler aşağıda verilmiştir

Unity 2018,4 ile H:\mrtk.exe dev konumundaki proje üzerinde testleri çalıştırın (örneğin Unity 2018.4.26 F1)

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

H:\mrtk.exe dev konumundaki proje üzerinde testleri çalıştırın, Unity 2018,4, çıkış sonuçları için 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 komut dosyası aracılığıyla birden çok kez çalıştırmak da mümkündür run_repeat_tests.ps1 . ' De kullanılan tüm parametreler run_playmode_tests.ps1 kullanılabilir.

.\run_repeat_tests.ps1 -Times 5

Çekme isteği doğrulaması

MRTK 'nin CI, tüm yapılandırmalarda MRTK oluşturur ve tüm düzenleme ve yürütme modu testlerini çalıştırır. /azp run mrtk_prKullanıcının yeterli haklara sahip olması halinde, GITHUB PR üzerinde bir yorum NAKLEDEREK CI tetiklenebilir. CI çalıştırmaları, PR 'nin ' denetimler ' sekmesinde görülebilir.

Yalnızca tüm testler başarıyla başarılı olduktan sonra çekme isteği ana ile birleştirilebilir.

Stres testleri/toplu testler

Bazen testler hata ayıklamada sinir bozucu olabilecek zaman zaman başarısız olur.

Birden çok testin yerel olarak çalışmasını sağlamak için, uygun test betiklerini değiştirin. Aşağıdaki Python betiği bu senaryoyu daha kolay hale getirir.

Python betiğini çalıştırmaya yönelik önkoşul, Python 3. X' in yüklü olmasına sahiptir.

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 testi çalıştırmak içindir:

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

Yeni test dosyası şu anda şunu içermelidir

[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ık sürekli olarak çağrılabilen yeni testleri gözlemleyin.

Testleri 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 Play modu sınamaları, yeni özelliğinizi eller veya gözleri gibi farklı giriş kaynaklarına nasıl yanıt vereceğini test etme özelliğine sahiptir.

Yeni Play modu testleri, Baseplaymodetests 'ı veya aşağıdaki iskelet kullanılabilir.

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

  • Varlıklara git > mrtk > Testleri > playmodetests
  • Sağ tıklayın, > test etme > C# test betiği oluştur
  • Varsayılan şablonu aşağıdaki iskelet ile 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 araç seti deposunda mrtkTestlerieditmodetests klasörü altına 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()
        {

        }
    }
}

Test adlandırma kuralları

Testler, genellikle test ettikleri sınıfa veya test ettikleri senaryoya göre adlandırılmalıdır. Örneğin, bir test edilebilir sınıfı verildiğinde:

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

Testi adlandırmayı düşünün

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

Testi karşılık gelen test olmayan dosyaya 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, bir test sınıfı varsa, her bir sınıfın karşılık gelen test sınıfını bulmanın belirgin bir yolunun açık olmasını sağlamaktır.

Senaryo tabanlı testlerin yerleştirilmesi daha az tanımlıysa-test, genel giriş sistemini tercih ediyor, örneğin, karşılık gelen düzenleme modundaki veya yürütme modu test klasöründeki bir "ınputsystem" klasörüne yerleştirmeyi düşünün.

Test betiği simgeleri

Yeni bir test eklenirken 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 git
  2. Yardımcı programlar ' a ve ardından Güncelleştir ' e tıklayıp simgeleri
  3. Testler ' e tıklayın ve Güncelleştirici otomatik olarak çalışır ve tüm test betikleri simgeleri eksik olarak güncelleştirilmeyecektir

MRTK yardımcı program yöntemleri

Bu bölümde, MRTK için testler yazılırken yaygın olarak kullanılan kod parçacıklarının/yöntemlerinin bazıları gösterilmektedir.

Mrtk 'yi ayarlamaya ve MRTK içindeki bileşenlerle etkileşimi test etmenize yardımcı olan iki yardımcı program sınıfı vardır

TestUtilities, MRTK sahneyi ve GameObjects 'i 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();

Lütfen, TestUtilitiesPlayModeTestUtilities yeni testler mrtk 'a eklendiğinde düzenli olarak genişletildiklerinden, bu yardımcı sınıfların daha fazla yöntemi IÇIN ve API belgelerine bakın.