Zápis a spouštění testů

Aby bylo zajištěno, že MRTK je spolehlivý, má MRTK sadu testů, aby se zajistilo, že změny kódu nevrátí stávající chování. Dobrým pokrytím testů ve velkém základu kódu, jako je MRTK, je zásadní pro stabilitu a při provádění změn je nutné mít důvěru.

MRTK využívá nástroj pro testování Unity , který využívá integraci Unity nunit. Tato příručka obsahuje výchozí bod, jak přidat testy do MRTK. Nevysvětlí se tak Test Runner a nunit , který se dá vyhledat v zadaných odkazech.

Před odesláním žádosti o přijetí změn se ujistěte, že:

  1. Spustit testy místně, aby vaše změny nezměnily stávající chování (když se pr žádné testy nepovolí).

  2. Pokud opravujete chybu, zapište test pro otestování opravy a zajistěte, aby budoucí úpravy kódu nenarušily.

  3. Pokud zapisujete funkci, zapište nové testy, aby se zabránilo nadcházejícím změnám kódu pro tuto funkci.

V současné době jsou testy PlayMode spouštěné v Unity 2018,4 a v jiných verzích Unity můžou selhat.

Spouštění testů

Editor Unity

Test runneru Unity můžete najít v části oknoObecnéTest Runner a zobrazí se všechny dostupné testy MRTK Play a režim úprav.

Příkazový řádek

Testy lze spustit také pomocí skriptu prostředí PowerShell , který se nachází na adrese . Tím se testy PlayMode spustí přesně tak, jak jsou spouštěny na GitHubu/CI (viz níže), a vytiskněte výsledky. Tady je několik příkladů, jak skript spustit.

Spusťte testy na projektu, který se nachází na H:\mrtk.dev, s Unity 2018,4 (například 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"

Spusťte testy na projektu, který se nachází na H:\mrtk.dev, s Unity 2018,4, výstupní výsledky do 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\"

Testy PlayMode je také možné spustit několikrát prostřednictvím run_repeat_tests.ps1 skriptu. Lze použít všechny parametry používané v nástroji run_playmode_tests.ps1 .

.\run_repeat_tests.ps1 -Times 5

Ověření žádosti o získání dat

CI MRTK vytvoří MRTK ve všech konfiguracích a spustí všechny testy režimu úprav a přehrání. CI se dá aktivovat publikováním komentáře na GitHubu žádosti o přijetí změn, /azp run mrtk_pr Pokud má uživatel dostatečná oprávnění. Spuštění CI lze zobrazit na kartě kontroly žádosti o přijetí změn.

Až budou všechny testy úspěšně úspěšné, může se žádost o přijetí změn sloučit do hlavní.

Zátěžové testy/hromadné testy

Někdy testy selžou jenom občas, což se dá frustrující ladit.

Chcete-li mít více spuštěných testů místně, upravte testovací skripty v závislosti na nich. Následující skript jazyka Python by měl tento scénář lépe využít.

Předpokladem pro spuštění skriptu Pythonu je nainstalován Python 3. X.

Pro jeden test, který je třeba provést několikrát:

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

Spusťte následující příkaz z příkazového řádku (doporučuje sePowerShell ).

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

Zkopírujte a vložte výstup do testovacího souboru. Následující skript slouží pro spuštění více testů v posloupnosti:

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

Nový testovací soubor by teď měl obsahovat

[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() {...}

Otevřete Test Runner a sledujte nové testy, které se teď dají volat opakovaně.

Zápis testů

Existují dva typy testů, které lze přidat pro nový kód.

  • Testy režimu přehrávání
  • Testy režimu úprav

Testy režimu přehrávání

Testy režimu MRTK Play mají možnost testovat, jak vaše nová funkce reaguje na různé vstupní zdroje, jako jsou například ruce nebo oči.

Nové testy režimu přehrávání můžou zdědit BasePlayModeTests nebo můžete použít kostru níže.

Postup vytvoření nového testu režimu přehrávání:

  • Přechod k Assetům > MRTK > Tests > PlayModeTests
  • Klikněte pravým tlačítkem na vytvořit > testování > testovacího skriptu C#.
  • Nahraďte výchozí šablonu následujícím kostrou.
#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

Testy režimu úprav

testy režimu úprav se spouštějí v režimu úprav Unity a dají se přidat do složky EditModeTeststestsMRTK v úložišti Mixed Reality Toolkit. Chcete-li vytvořit nový test, lze použít následující šablonu:

// 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()
        {

        }
    }
}

Konvence pojmenování testů

Testy by se měly obecně pojmenovat na základě zkoušené třídy nebo scénáře, ve kterém jsou testovány. Například pro danou třídu, která je zkoušena:

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

Zvažte pojmenování testu

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

Zvažte umístění testu do hierarchie složek, která je podobná odpovídajícímu souboru, který není testovací. Například:

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

Účelem je zajistit, aby existoval jasný způsob, jak najít odpovídající testovací třídu každé třídy, pokud taková testovací třída existuje.

Umístění testů založených na scénářích je méně definováno – Pokud test vykonává celkový vstupní systém, například zvažte jeho umístění do složky "InputSystem" v odpovídajícím režimu úprav nebo v testovací složce režimu přehrávání.

Ikony testovacího skriptu

Když přidáváte nový test, upravte prosím skript tak, aby měl správnou ikonu MRTK. K tomu je k dispozici jednoduchý nástroj MRTK:

  1. přejít na položku nabídky Toolkit Mixed reality
  2. Klikněte na nástroje, pak na tlačítko Aktualizovat a pak na ikony.
  3. Klikněte na testy a aktualizace se spustí automaticky, aktualizace všech testovaných skriptů chybějící jejich ikony.

Metody MRTK Utility

V této části jsou uvedeny některé běžně používané fragmenty nebo metody kódu při psaní testů pro MRTK.

Existují dvě obslužné třídy, které vám pomůžou s nastavením MRTK a testování interakcí s komponentami v MRTK.

TestUtilities zadejte následující metody pro nastavení scény MRTK a GameObjects:

/// 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();

Pokud se nové testy přidají do MRTK, přečtěte si prosím v dokumentaci k rozhraní API TestUtilities a PlayModeTestUtilities Další metody těchto tříd, jak jsou pravidelně rozšířené.