Menulis dan menjalankan pengujian — MRTK2

Untuk memastikan MRTK dapat diandalkan, MRTK memiliki serangkaian pengujian untuk memastikan bahwa perubahan pada kode tidak meregres perilaku yang ada. Memiliki cakupan pengujian yang baik dalam basis kode besar seperti MRTK sangat penting untuk stabilitas dan memiliki keyakinan saat membuat perubahan.

MRTK menggunakan Unity Test Runner yang menggunakan integrasi Unity NUnit. Panduan ini akan memberikan titik awal tentang cara menambahkan pengujian ke MRTK. Ini tidak akan menjelaskan Unity Test Runner dan NUnit yang dapat dicari di tautan yang disediakan.

Sebelum mengirimkan permintaan pull, pastikan untuk:

  1. Jalankan pengujian secara lokal sehingga perubahan Anda tidak mengubah perilaku yang ada (menyelesaikan PR tidak akan diizinkan jika ada pengujian yang gagal).

  2. Jika memperbaiki bug, tulis pengujian untuk menguji perbaikan dan pastikan bahwa modifikasi kode di masa mendatang tidak akan merusaknya lagi.

  3. Jika menulis fitur, tulis pengujian baru untuk mencegah perubahan kode yang akan datang melanggar fitur ini.

Saat ini pengujian playmode dimaksudkan untuk dijalankan di Unity 2018.4 dan mungkin gagal dalam versi Unity lainnya

Menjalankan pengujian

Editor Unity

Unity Test Runner dapat ditemukan di bawah Window>General>Test Runner dan akan menampilkan semua pengujian mode putar dan edit MRTK yang tersedia.

Baris perintah

Pengujian juga dapat dijalankan oleh skrip powershell yang terletak di Scripts\test\run_playmode_tests.ps1. Ini akan menjalankan tes playmode persis seperti yang dijalankan pada github / CI (lihat di bawah), dan mencetak hasil. Berikut adalah beberapa contoh cara menjalankan skrip

Jalankan pengujian pada proyek yang terletak di H:\mrtk.dev, dengan Unity 2018.4 (misalnya Unity 2018.4.26f1)

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

Jalankan pengujian pada proyek yang terletak di H:\mrtk.dev, dengan Unity 2018.4, hasil output ke 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\"

Anda juga dapat menjalankan pengujian playmode beberapa kali melalui run_repeat_tests.ps1 skrip. Semua parameter yang digunakan dalam run_playmode_tests.ps1 dapat digunakan.

.\run_repeat_tests.ps1 -Times 5

Validasi tarik pull

CI MRTK akan membangun MRTK di semua konfigurasi dan menjalankan semua pengujian mode edit dan putar. CI dapat dipicu dengan memposting komentar di PR /azp run mrtk_pr github jika pengguna memiliki hak yang memadai. Eksekusi CI dapat dilihat di tab 'pemeriksaan' dari PR.

Hanya setelah semua tes berhasil lulus, PR dapat digabungkan menjadi utama.

Tes stres / tes massal

Terkadang tes hanya akan gagal sesekali yang dapat membuat frustrasi untuk debug.

Agar beberapa pengujian berjalan secara lokal, ubah skrip pengujian yang sesuai. Skrip python berikut harus membuat skenario ini lebih nyaman.

Prasyarat untuk menjalankan skrip python adalah menginstal Python 3.X.

Untuk satu pengujian yang perlu dijalankan beberapa kali:

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

Jalankan yang berikut ini dari baris perintah (Disarankan PowerShell )

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

Salin dan tempel output ke dalam file pengujian Anda. Skrip berikut adalah untuk menjalankan beberapa pengujian secara berurutan:

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

File pengujian baru sekarang harus berisi

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

Buka runner pengujian dan amati pengujian baru yang sekarang dapat dipanggil berulang kali.

Menulis pengujian

Ada dua jenis pengujian yang dapat ditambahkan untuk kode baru

  • Uji mode putar
  • Edit pengujian mode

Uji mode putar

Pengujian mode putar MRTK memiliki kemampuan untuk menguji bagaimana fitur baru Anda merespons berbagai sumber input seperti tangan atau mata.

Pengujian mode putar baru dapat mewarisi BasePlayModeTests atau kerangka di bawah ini dapat digunakan.

Untuk membuat pengujian mode putar baru:

  • Menavigasi ke Aset > MRTK > Menguji > PlayModeTests
  • Klik kanan, Buat > Pengujian > Skrip Pengujian C#
  • Ganti templat default dengan kerangka di bawah ini
#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

Edit pengujian mode

Pengujian mode edit dijalankan dalam mode edit Unity dan dapat ditambahkan di bawah folder MRTK>Tests>EditModeTests di repositori toolkit Mixed Reality. Untuk membuat pengujian baru, templat berikut dapat digunakan:

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

        }
    }
}

Konvensi penamaan pengujian

Pengujian umumnya harus diberi nama berdasarkan kelas pengujiannya, atau skenario yang sedang diuji. Misalnya, diberikan kelas yang akan diuji:

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

Pertimbangkan penamaan pengujian

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

Pertimbangkan untuk menempatkan pengujian dalam hierarki folder yang mirip dengan file non-pengujian yang sesuai. Contohnya:

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

Ini untuk memastikan bahwa ada cara yang jelas untuk menemukan kelas pengujian yang sesuai setiap kelas, jika kelas pengujian seperti itu ada.

Penempatan pengujian berbasis skenario kurang ditentukan - jika pengujian menjalankan sistem input keseluruhan, misalnya, pertimbangkan untuk memasukkannya ke dalam folder "InputSystem" dalam mode edit yang sesuai atau folder uji mode putar.

Ikon skrip pengujian

Saat menambahkan pengujian baru, ubah skrip agar memiliki ikon MRTK yang benar. Ada alat MRTK yang mudah untuk melakukannya:

  1. Buka item menu toolkit Mixed Reality.
  2. Klik Utilitas, lalu Perbarui, lalu Ikon.
  3. Klik Pengujian, dan updater akan berjalan secara otomatis, memperbarui skrip pengujian apa pun yang tidak memiliki ikonnya.

Metode Utilitas MRTK

Bagian ini menunjukkan beberapa cuplikan / metode kode yang umum digunakan saat menulis tes untuk MRTK.

Ada dua kelas Utilitas yang membantu menyiapkan MRTK dan menguji interaksi dengan komponen di MRTK

TestUtilities menyediakan metode berikut untuk menyiapkan adegan MRTK dan GameObjects Anda:

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

Silakan merujuk TestUtilities ke dokumen API dan PlayModeTestUtilities untuk metode lebih lanjut dari kelas util ini karena diperpanjang secara teratur sementara pengujian baru ditambahkan ke MRTK.