Bagaimana cara menggunakan atribut TestCaseSource dan TestOf dalam pengujian yang sama?

Saya mencoba mendefinisikan pengujian berparameter yang menerima data menggunakan TestCaseSource. Saya juga perlu mendefinisikan atribut untuk menghubungkan setiap pengujian dengan tiket Jira, dan seperti yang direkomendasikan di sini, saya menggunakan atribut TestOf sebagai berikut:

[TestOf("SomeId")]
[TestCaseSource(typeof(SomeProviderClass), "someMethod")]
public void SampleTest(dynamic myData)
{
    //do something with myData
    //assert something
}

Namun, saat menjalankan pengujian, di TearDown, ukuran TestContext.CurrentContext.Test.Properties, yang seharusnya memiliki nilai TestOf, kosong. Bagaimana saya harus mendefinisikan atribut agar dikenali dengan benar oleh NUnit?


person Gabriel Candia    schedule 03.04.2020    source sumber


Jawaban (1)


Saat Anda menggunakan TestCaseSource, Anda sebenarnya membuat 'rangkaian' pengujian. Tes NUnit disusun dalam pohon. Biasanya, perakitan Anda akan menjadi akar teratas dari pohon, dan setiap kelas di dalamnya merupakan cabang, yang pada gilirannya bercabang untuk menyertakan semua metode pengujian individual. yaitu

                           -Test1
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

Anda dapat melihat struktur ini jika Anda melihat TestResults.xml.

Saat Anda menggunakan TestCaseSource Anda sebenarnya membuat level lain di pohon. Jadi sekarang pohon Anda terlihat seperti ini.

                                                -Test1A
                           -TestCaseSourceSuite -Test1B
                                                -Test1C
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

Dalam contoh Anda, TestCaseSourceSuite akan diberi nama SampleTest. Alasan mengapa apa yang Anda miliki saat ini tidak berfungsi adalah karena atribut TestOf saat ini diterapkan ke TestCaseSourceSuite, bukan Test1A, Test1B Test1C. (Properti seperti TestOf tidak menyalin pohon secara hierarki ke atas atau ke bawah.)


Bagaimanapun. Bagaimana cara memperbaikinya? ???? Menggunakan TestCaseData untuk TestCaseSource Anda sepertinya merupakan pilihan terbaik. TestOfAttribute sebenarnya tidak banyak berguna, jadi tidak ada 'properti bernama' untuk menyetel nilainya, namun Anda bisa menggunakan metode SetProperty dan kelas PropertyNames sebagai gantinya. Cobalah sesuatu yang sedikit seperti ini...

public class MyTests
{
    [TestCaseSource(typeof(MyDataClass), "TestCases")]
    public void Test(int n, int d)
    {
        Assert.IsTrue(true);
    }
}

public class MyDataClass
{
    public static IEnumerable TestCases
    {
        get
        {
            yield return new TestCaseData(12, 3).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
            yield return new TestCaseData(12, 2).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
        }
    }  
}

Semoga itu bisa membantu!

person Chris    schedule 03.04.2020
comment
Terima kasih atas jawaban anda! Saya tidak tahu tentang pembuatan level lain di pohon saat menggunakan TestCaseSource. Saya mencoba solusi yang Anda usulkan, namun mungkin tidak cocok untuk kasus saya, mengingat terkadang TestCaseData yang sama digunakan untuk beberapa pengujian, karena saya menggunakan badan json yang sama sebagai data untuk pengujian API yang berbeda. Untuk saat ini, saya menggunakan TestExecutionContext.CurrentContext.CurrentTest.Properties.Set("JiraID", "SomeID"); di dalam pengujian untuk mendefinisikan properti. Namun, saya tidak yakin ini pendekatan yang baik. Saran lain akan sangat membantu. Terima kasih! - person Gabriel Candia; 06.04.2020
comment
Saya khawatir Anda benar, ini bukan pendekatan terbaik. API khusus ini tidak pernah dimaksudkan untuk diekspos, jadi mungkin akan hilang di masa mendatang! Lihat riwayat masalah ini di sana: github.com/nunit/nunit/issues/3136 Sayangnya belum ada cara yang didukung untuk menambahkan properti pengujian pada waktu proses - itulah yang dimaksud dengan penambahan pada edisi #3136, namun seperti yang Anda lihat, belum ada yang secara sukarela melakukan hal tersebut. Untuk saat ini, satu-satunya cara yang 'didukung' untuk melakukan ini adalah waktu pembuatan tes, seperti di atas. Bisakah Anda membuat parameter TestCaseSources Anda dengan cara tertentu, untuk mengatasi masalah Anda? - person Chris; 07.04.2020
comment
Terima kasih atas latar belakang masalah ini. Setelah menganalisis hal ini dengan tim kami, kami akhirnya membuat file konfigurasi terpisah yang memiliki entri untuk setiap metode pengujian, dan mencocokkan namanya dengan id terkait yang diharapkan akan kami gunakan di Jira. File itu diakses di akhir setiap tes untuk mendapatkan id. Kami memilihnya karena kami pikir akan lebih mudah untuk mempertahankannya pada waktunya. Ini mirip dengan apa yang Anda usulkan, itu akan menjadi pilihan bagus jika kami tidak menggunakan kembali data kasus uji. Sekali lagi terima kasih atas bantuan Anda! - person Gabriel Candia; 23.04.2020