Psaní a spouštění testů – MRTK2

Aby byla sada MRTK spolehlivá, obsahuje sada testů, které zajistí, že změny kódu nebudou regrese stávajícího chování. Dobré pokrytí testů ve velkém základu kódu, jako je MRTK, je zásadní pro stabilitu a jistotu při provádění změn.

MRTK používá Unity Test Runner , který používá integraci Unity NUnit. Tato příručka poskytuje výchozí bod pro přidání testů do MRTK. Nebude vysvětlovat Runner a NUnit Unity Test Runner a NUnit , které lze vyhledat v uvedených odkazech.

Před odesláním žádosti o přijetí změn nezapomeňte:

  1. Spusťte testy místně, aby vaše změny nezpochybnily stávající chování (dokončení žádostí o přijetí změn nebude povoleno, pokud některé testy selžou).

  2. Pokud opravíte chybu, napište test, který opravu otestuje a zajistí, aby ji budoucí úpravy kódu znovu neporušily.

  3. Při psaní funkce napište nové testy, abyste zabránili nadcházejícím změnám kódu, které tuto funkci porušují.

V současné době se mají testy playmode spouštět v Unity 2018.4 a můžou selhat v jiných verzích Unity.

Spouštění testů

Editor Unity

Nástroj Unity Test Runner najdete v části Windows>General>Test Runner a zobrazí všechny dostupné testy režimu přehrávání a úprav MRTK.

Příkazový řádek

Testy je možné spouštět také pomocí powershellového skriptu umístěného na adrese Scripts\test\run_playmode_tests.ps1. Tím se testy playmode spustí přesně tak, jak se spouštějí na GitHubu / CI (viz níže) a vytisknou výsledky. Tady je několik příkladů spuštění skriptu.

Spusťte testy v projektu umístěném na adrese H:\mrtk.dev s Unity 2018.4 (například Unity 2018.4.26f1).

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

Spusťte testy v projektu umístěném v umístění H:\mrtk.dev s Unity 2018.4 a výstupem výsledků 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. Je možné použít všechny parametry použité v run_playmode_tests.ps1 .

.\run_repeat_tests.ps1 -Times 5

Ověření žádosti o přijetí změn

CI MRTK vytvoří sadu MRTK ve všech konfiguracích a spustí všechny testy režimu úprav a přehrávání. CI se dá aktivovat publikováním komentáře k žádosti o přijetí /azp run mrtk_pr změn na GitHubu, pokud má uživatel dostatečná práva. Spuštění CI můžete vidět na kartě Kontroly žádosti o přijetí změn.

Teprve poté, co všechny testy úspěšně projdou, je možné žá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ž může být frustrující při ladění.

Pokud chcete mít místně více testovacích spuštění, upravte odpovídající testovací skripty. Následující skript pythonu by měl tento scénář usnadnit.

Předpokladem pro spuštění skriptu pythonu je nainstalovaný Python 3.X.

Pro jeden test, který je potřeba provést vícekrát:

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

Z příkazového řádku spusťte následující příkaz (doporučuje se PowerShell ).

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

Zkopírujte výstup a vložte ho do testovacího souboru. Následující skript je určený pro spouštění několika 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 podívejte se na nové testy, které se teď dají opakovaně volat.

Psaní testů

Existují dva typy testů, které je možné přidat pro nový kód.

  • Testy režimu přehrávání
  • Úpravy testů režimu

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

Testy režimu přehrávání MRTK mají možnost otestovat, jak nová funkce reaguje na různé vstupní zdroje, jako jsou ruce nebo oči.

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

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

  • Přejděte na Assets > MRTK > Tests > PlayModeTests.
  • Kliknutím pravým tlačítkem myši vytvořte > testovací > skript jazyka C#
  • Nahraďte výchozí šablonu kostru níže.
#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

Úpravy testů režimu

Testy režimu úprav se provádějí v režimu úprav Unity a je možné je přidat do složky MRTK>Tests>EditModeTests v úložišti Mixed Reality Toolkit. K vytvoření nového testu je možné 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()
        {

        }
    }
}

Zásady vytváření názvů testů

Testy by obecně měly být pojmenovány na základě třídy, kterou testují, nebo scénáře, který testují. Například s přiřazenou třídou, která se má testovat:

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í. Příklad:

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

Je to proto, aby bylo zajištěno, že existuje 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ě definované – pokud test provádí například celkový vstupní systém, zvažte jeho umístění do složky InputSystem v odpovídající složce pro úpravy nebo testovací složku režimu přehrávání.

Ikony testovacích skriptů

Při přidávání nového testu upravte skript tak, aby měl správnou ikonu MRTK. K dispozici je jednoduchý nástroj MRTK:

  1. Přejděte na položku nabídky Mixed Reality Toolkit.
  2. Klikněte na Nástroje, pak na Aktualizovat a pak na Ikony.
  3. Klikněte na Testy a aktualizátor se spustí automaticky a aktualizuje všechny testovací skripty, u kterých chybí jejich ikony.

MRTK Utility – metody

Tato část ukazuje některé běžně používané fragmenty kódu nebo metody při psaní testů pro MRTK.

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

Nástroje TestUtilities poskytují 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();

Projděte si dokumentaci k rozhraní API a TestUtilitiesPlayModeTestUtilities další metody těchto tříd nástrojů, protože se pravidelně rozšiřují, zatímco se do MRTK přidávají nové testy.