Tesztek írása és futtatása – MRTK2

Annak biztosítása érdekében, hogy az MRTK megbízható legyen, az MRTK tesztkészlettel rendelkezik annak biztosítására, hogy a kód módosításai ne lépjenek vissza a meglévő viselkedésre. A nagy kódbázisban, például az MRTK-ban való jó tesztlefedettség elengedhetetlen a stabilitás és a megbízhatóság érdekében a módosítások végrehajtásakor.

Az MRTK a Unity Test Runnert használja, amely az NUnit Unity-integrációját használja. Ez az útmutató kiindulópontot nyújt a tesztek MRTK-hoz való hozzáadásához. Nem magyarázza el a Unity Tesztfuttatót és az NUnitot , amely a megadott hivatkozásokon kereshető fel.

Lekéréses kérelem elküldése előtt győződjön meg arról, hogy:

  1. Futtassa a teszteket helyileg, hogy a módosítások ne legyenek visszafejtve a meglévő viselkedésre (a PRS-ek elvégzése nem engedélyezett, ha a tesztek sikertelenek).

  2. Hiba kijavítása esetén írjon egy tesztet a javítás teszteléséhez, és győződjön meg arról, hogy a jövőbeli kódmódosítások nem törik meg újra.

  3. Ha ír egy funkciót, írjon új teszteket, hogy megakadályozza a közelgő kódmódosításokat, amelyek megszegik ezt a funkciót.

A playmode-tesztek jelenleg a Unity 2018.4-ben futnak, és a Unity más verzióiban sikertelenek lehetnek

Tesztek futtatása

Unity-szerkesztő

A Unity Tesztfuttató a Windows>Általános>tesztfuttató területén található, és megjeleníti az összes elérhető MRTK-lejátszási és szerkesztési módú tesztet.

Parancssor

A teszteket a címen Scripts\test\run_playmode_tests.ps1található PowerShell-szkript is futtathatja. Ez pontosan úgy futtatja a playmode teszteket, ahogy a githubon / CI-n hajtják végre őket (lásd alább), és kinyomtatja az eredményeket. Íme néhány példa a szkript futtatására

Futtassa a teszteket a H:\mrtk.dev helyen található projekten a Unity 2018.4-gyel (például Unity 2018.4.26f1)

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

Futtassa a teszteket a H:\mrtk.dev helyen található projekten a Unity 2018.4-ben, és adja meg az eredményeket a 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\"

A playmode tesztek többször is futtathatók a run_repeat_tests.ps1 szkripten keresztül. Az összes használt run_playmode_tests.ps1 paraméter használható.

.\run_repeat_tests.ps1 -Times 5

Lekéréses kérelem érvényesítése

Az MRTK CI minden konfigurációban létrehozza az MRTK-t, és futtatja az összes szerkesztési és lejátszási módú tesztet. A CI akkor aktiválható, ha megjegyzést küld a github pr-hez /azp run mrtk_pr , ha a felhasználó rendelkezik megfelelő jogosultságokkal. A CI-futtatások a kérelem "ellenőrzések" lapján tekinthetők meg.

A pr-t csak akkor lehet a főbe egyesíteni, ha az összes teszt sikeresen le lett adva.

Stressztesztek / tömeges tesztek

Néha a tesztek csak időnként hiúsulnak meg, ami zavaró lehet a hibakereséshez.

Ha több tesztfuttatást szeretne helyileg futtatni, módosítsa a megfelelő tesztszkripteket. A következő Python-szkriptnek kényelmesebbé kell tennie ezt a forgatókönyvet.

A Python-szkript futtatásának előfeltétele a Python 3.X telepítése.

Egyetlen, többször végrehajtandó teszt esetén:

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

Futtassa az alábbiakat egy parancssorból (a PowerShell használata ajánlott)

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

Másolja és illessze be a kimenetet a tesztfájlba. A következő szkript több teszt sorozatban való futtatására használható:

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

Az új tesztfájlnak most már tartalmaznia kell

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

Nyissa meg a tesztfuttatót, és figyelje meg azokat az új teszteket, amelyek most már ismételten hívhatók.

Tesztek írása

Az új kódhoz kétféle teszt adható hozzá

  • Lejátszási mód tesztjei
  • Módtesztek szerkesztése

Lejátszási mód tesztjei

Az MRTK lejátszási módú tesztjei képesek tesztelni, hogy az új funkció hogyan reagál a különböző bemeneti forrásokra, például a kezekre vagy a szemekre.

Az új lejátszási módú tesztek örökölhetik a BasePlayModeTesteket , vagy az alábbi csontváz használható.

Új lejátszási módú teszt létrehozása:

  • Navigáljon az Eszközök > MRTK-tesztek >> PlayModeTests eleméhez
  • Kattintson a jobb gombbal, tesztelési > C# tesztszkript létrehozása >
  • Cserélje le az alapértelmezett sablont az alábbi csontvázra
#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

Módtesztek szerkesztése

A szerkesztési módú teszteket a Unity szerkesztési módban hajtja végre, és a Mixed Reality Toolkit-adattár MRTK-tesztek>>EditModeTests mappájában adhatja hozzá. Új teszt létrehozásához a következő sablon használható:

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

        }
    }
}

Elnevezési konvenciók tesztelése

A teszteket általában a tesztelt osztály vagy a tesztelési forgatókönyv alapján kell elnevezni. Például egy tesztelendő osztályt:

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

Fontolja meg a teszt elnevezését

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

Érdemes lehet egy olyan mappahierarchiába helyezni a tesztet, amely hasonló a megfelelő nem tesztelési fájlhoz. Például:

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

Ennek az a célja, hogy egyértelmű módon állapítsa meg az egyes osztályok megfelelő tesztosztályait, ha létezik ilyen tesztosztály.

A forgatókönyvalapú tesztek elhelyezése kevésbé definiált – ha a teszt a teljes bemeneti rendszert gyakorolja, például érdemes lehet egy "InputSystem" mappába helyezni a megfelelő szerkesztési módban vagy lejátszási mód tesztmappájában.

Szkriptikonok tesztelése

Új teszt hozzáadásakor módosítsa a szkriptet úgy, hogy a megfelelő MRTK ikon legyen. Erre egy egyszerű MRTK-eszköz áll rendelkezésre:

  1. Lépjen a Mixed Reality Eszközkészlet menüelemre.
  2. Kattintson a Segédprogramok, majd a Frissítés, majd az Ikonok elemre.
  3. Kattintson a Tesztek gombra, és a frissítő automatikusan elindul, és frissíti az ikonokat hiányzó tesztszkripteket.

MRTK utility metódusok

Ez a szakasz az MRTK-tesztek írásakor gyakran használt kódrészleteket/metódusokat mutatja be.

Két segédprogramosztály segíti az MRTK beállítását és az összetevőkkel való interakció tesztelését az MRTK-ban

A TestUtilities a következő módszereket biztosítja az MRTK-jelenet és a GameObjects beállításához:

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

Tekintse meg ezen util osztályok API-dokumentációját TestUtilities és PlayModeTestUtilities további módszereit, mivel azokat rendszeresen bővítjük, miközben új teszteket adunk hozzá az MRTK-hoz.