Perintah Jalankan Uji NUnit

110

Secara default, pengujian nunit dijalankan menurut abjad. Apakah ada yang tahu cara mengatur urutan eksekusi? Apakah ada atribut untuk ini?

Riain McAtamney
sumber
7
Mengapa Anda ingin melakukan ini? Sepertinya Anda memiliki ketergantungan pada urutan yang dijalankan, yang merupakan hal yang buruk. Anda perlu mempertimbangkan kembali mengapa Anda menginginkan ini. Tes unit harus dijalankan secara terpisah dan benar-benar independen dari yang lain. Sepertinya Anda sedang membuat kandidat untuk tes bau Tes tidak menentu .
RichardOD
Ini terlihat seperti duplikat tetapi Anda dapat melihat jawaban saya untuk itu di sini
Johnno Nolan
12
@RichardOD - harus! = Harus. Dan ini sebenarnya bukan acara yang seharusnya, karena sebenarnya hampir semua pengujian integrasi dijalankan secara berurutan - tanyakan kepada Anda tim QA apakah mereka mengacak urutan pengujian mereka.
tymtam
4
Saat ini saya memiliki beberapa tes yang urutannya tampaknya penting meskipun seharusnya tidak. Secara pribadi, saya ingin cara untuk mengacak urutan pengujian secara khusus untuk membantu saya memastikan bahwa pengujian saya TIDAK tergantung pada pesanan. Tentu saja, yang saya BENAR-BENAR ingin menjadi pelari pengujian yang akan menjalankan semua pengujian saya secara acak sampai menemukan masalah, atau saya katakan berhenti. Jika saya berlari semalaman, dan semuanya masih hijau di pagi hari, maka saya dapat yakin bahwa saya telah menghilangkan efek samping terakhir yang tidak diinginkan.
Mel
1
pertanyaan ini akan menjadi lebih relevan jika pertanyaan diperbarui untuk menentukan kita berbicara tentang tes integrasi di sini ... Kita semua tahu aturan tentang pengujian unit, setidaknya jika Anda telah membaca pola pengujian XUnit dan mengikuti Paman Bob dll .. ya .. tetapi kerangka kerja seperti NUnit juga sangat berguna untuk menjalankan tes integrasi dan juga berjalan dengan cepat .. dan Anda pasti tidak ingin itu terjadi secara acak, terutama ketika penyiapan database yang mahal terlibat ..
nrjohnstone

Jawaban:

51

Pengujian unit Anda masing-masing harus dapat berjalan secara independen dan berdiri sendiri. Jika mereka memenuhi kriteria ini maka urutannya tidak masalah.

Namun ada kalanya Anda ingin menjalankan tes tertentu terlebih dahulu. Contoh tipikal adalah dalam situasi Integrasi Berkelanjutan di mana beberapa tes berjalan lebih lama daripada yang lain. Kami menggunakan atribut kategori sehingga kami dapat menjalankan pengujian yang menggunakan mocking sebelum pengujian yang menggunakan database.

misalnya, letakkan ini di awal tes cepat Anda

[Category("QuickTests")]

Di mana Anda memiliki tes yang tergantung pada kondisi lingkungan tertentu, pertimbangkan TestFixtureSetUp dan TestFixtureTearDown atribut, yang memungkinkan Anda untuk menandai metode yang akan dieksekusi sebelum dan sesudah tes Anda.

NeedHack
sumber
2
@ Chris, saya cenderung tidak menggunakan atribut ini, ini adalah entri blog yang menarik- jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html . Poin bagus tentang tes kategori.
RichardOD
29
Contoh lain dari tes ketergantungan pesanan adalah ketika Anda ingin menggunakan kerangka kerja nunit Anda untuk menjalankan Tes Integrasi ...
Byron Ross
1
@ByronRoss: Saya cenderung membuat tes lebih besar ketika saya melakukannya, dan bersandar pada tes unit yang ada sebanyak mungkin sehingga saya dapat menulis lebih sedikit tes. Kemudian setiap proses penuh dapat gagal secara terpisah. Saya juga mencoba mendesain data saya agar dapat hidup terpisah dari data yang ada, daripada bergantung pada data yang ada.
Merlyn Morgan-Graham
1
Jika Anda tidak menjalankan pengujian dalam urutan acak, bagaimana Anda dapat memverifikasi bahwa pengujian tersebut benar-benar berfungsi saat rusak? Apa yang Anda katakan mirip dengan mengatakan "Jika perangkat lunak Anda tidak memiliki bug, pengujian tidak perlu".
jforberg
@jforberg: Jika Anda mengalami kegagalan yang terjadi secara acak, bagaimana Anda mengatakannya ketika Anda telah memperbaikinya?
NeedHack
175

Saya hanya ingin menunjukkan bahwa sementara sebagian besar responden berasumsi ini adalah tes unit, pertanyaannya tidak menentukan bahwa itu benar.

nUnit adalah alat hebat yang dapat digunakan untuk berbagai situasi pengujian. Saya dapat melihat alasan yang tepat untuk ingin mengontrol urutan pengujian.

Dalam situasi tersebut saya harus menggunakan untuk memasukkan urutan lari ke dalam nama pengujian. Akan sangat bagus untuk dapat menentukan urutan berjalan menggunakan atribut.

Les
sumber
Maksud Anda, Anda menelepon tes Anda, misalnya, 001_first_test 002_second_testdan seterusnya?
ashes999
Ya, itu benar, meskipun saya biasanya menggunakan pola yang memungkinkan saya memasukkan tes dengan mudah jika perlu, jadi mungkin 010_first_test, 020_second_test, dll.
Les
83
Terima kasih untuk satu-satunya jawaban yang waras di sini. Ini adalah pertanyaan khusus, namun jawaban sok tahu yang entah kenapa tidak jelas dipilih. Ya, kita semua tahu tes unit apa yang seharusnya, itu bukan pertanyaannya.
Egor Pavlikhin
1
Anda tidak boleh mengandalkan urutan run yang alfabetis. Banyak pelari pengujian menjalankan pengujian Anda secara bersamaan pada banyak utas atau proses dan tidak harus dalam urutan abjad. Misalnya, NCrunch memprioritaskan pengujian berdasarkan kode yang Anda ubah (pengujian yang terpengaruh), lalu apakah pengujian tersebut terakhir kali gagal, lalu apakah pengujian tersebut berjalan cepat atau lambat. Jika Anda menginginkan urutan yang ditentukan , cukup buat meta-runner untuk pengujian tersebut dan kecualikan mereka dari proses reguler.
Abel
3
Alasan bagus lainnya untuk menentukan urutan adalah mengatasi masalah tertentu terlebih dahulu sebelum melanjutkan dengan rangkaian pengujian lainnya. dengan kata lain, jika pengujian saya untuk membuat pengguna gagal, maka saya tidak memerlukan semua yang lain untuk dijalankan sebelum saya mengetahui hasil ini. Dalam pengujian saya yang lain, saya mungkin mengejek pengguna tetapi penting bagi saya bahwa ini adalah pengujian pertama yang gagal - terutama jika rangkaian pengujiannya besar.
Bron Davies
125

NUnit 3.2.0 menambahkan OrderAttribute, lihat:

https://github.com/nunit/docs/wiki/Order-Attribute

Contoh:

public class MyFixture
{
    [Test, Order(1)]
    public void TestA() { ... }


    [Test, Order(2)]
    public void TestB() { ... }

    [Test]
    public void TestC() { ... }
}
Răzvan Flavius ​​Panda
sumber
5
Terima kasih, langsung saja apa yang saya cari - dan tidak ada diskusi, mengapa itu baik atau buruk :)
aknoepfel
1
Dan kemudian mereka membuatnya menjadi bilangan bulat, bukan desimal, jadi jika seseorang harus memasukkan tes, semua tes harus diberi nomor ulang.
epitka
Anda selalu dapat memulai dengan angka yang sangat besar seperti jutaan atau sesuatu jika Anda ingin memperkenalkan item menengah seperti itu - cukup mengetik lagi. Imo seharusnya ada cara yang lebih mudah untuk memesan sesuatu daripada menggunakan angka untuk prioritas seperti pohon ketergantungan metode, tetapi masing-masing memiliki kekurangan / kelebihannya sendiri.
Răzvan Flavius ​​Panda
9
Jawaban yang bagus, tapi hati-hati, dokumentasi menyatakan tes tidak menunggu tes sebelumnya selesai.
ROX
Menariknya, menurut pengalaman saya, jika kita menambahkan atribut Test and Order secara terpisah, tidak ada jaminan untuk memesan pengujian.
PADA
22

Ingin agar pengujian dijalankan dalam urutan tertentu tidak berarti bahwa pengujian tersebut bergantung satu sama lain - saya sedang mengerjakan proyek TDD saat ini, dan menjadi TDDer yang baik, saya telah mengejek / menghentikan semuanya, tetapi itu akan membuat lebih mudah dibaca jika saya bisa menentukan urutan yang tes hasilnya ditampilkan - tematis bukan abjad. Sejauh ini satu-satunya hal yang dapat saya pikirkan adalah menambahkan a_ b_ c_ ke kelas ke kelas, ruang nama, dan metode. (Tidak bagus) Menurut saya atribut [TestOrderAttribute] akan bagus - tidak diikuti oleh kerangka kerja, tetapi petunjuk agar kita dapat mencapai ini

William
sumber
10

Terlepas dari apakah Tes bergantung pada urutan atau tidak ... beberapa dari kita hanya ingin mengontrol semuanya, dengan cara yang teratur.

Tes unit biasanya dibuat dalam urutan kerumitan. Jadi, mengapa mereka tidak juga dijalankan dalam urutan kerumitan, atau urutan mereka diciptakan?

Secara pribadi, saya ingin melihat pengujian berjalan sesuai urutan yang saya buat. Dalam TDD, setiap pengujian yang berurutan secara alami akan menjadi lebih kompleks, dan membutuhkan lebih banyak waktu untuk dijalankan. Saya lebih suka melihat tes yang lebih sederhana gagal terlebih dahulu karena ini akan menjadi indikator yang lebih baik untuk penyebab kegagalan.

Namun, saya juga dapat melihat manfaat menjalankannya dalam urutan acak, terutama jika Anda ingin menguji bahwa pengujian Anda tidak memiliki ketergantungan pada pengujian lain. Bagaimana jika menambahkan opsi untuk menguji pelari ke "Jalankan Tes Secara Acak Hingga Dihentikan"?

Mont Pierce
sumber
9

Saya menguji dengan Selenium di situs web yang cukup kompleks dan seluruh rangkaian pengujian dapat berjalan selama lebih dari setengah jam, dan saya belum hampir mencakup seluruh aplikasi. Jika saya harus memastikan bahwa semua formulir sebelumnya diisi dengan benar untuk setiap tes, ini akan menambah banyak waktu, bukan hanya sedikit waktu, untuk keseluruhan tes. Jika ada terlalu banyak overhead untuk menjalankan tes, orang tidak akan menjalankannya sesering yang seharusnya.

Jadi, saya menyusunnya dan bergantung pada tes sebelumnya untuk menyelesaikan kotak teks dan semacamnya. Saya menggunakan Assert.Ignore () ketika prasyarat tidak valid, tetapi saya harus menjalankannya secara berurutan.

Anthony Biagioli
sumber
1
Sama sekali. Saya di perahu yang sama di sini.
Sleeper Smith
Saya juga! Persisnya mengapa saya mendapatkan pertanyaan ini!
Niklas Wulff
@NiklasRingdahl jika Anda menggunakan studio visual dengan nunit, dump nunit dan gunakan tes MS. maka Anda dapat menggunakan file uji memerintahkan studio visual untuk mengatur kasus uji dalam urutan yang Anda inginkan agar dieksekusi
Rahul Lodha
@RahulLodha Terima kasih! Saya akan memeriksanya.
Niklas Wulff
9

Saya sangat suka jawaban sebelumnya.

Saya mengubahnya sedikit agar dapat menggunakan atribut untuk mengatur kisaran pesanan:

namespace SmiMobile.Web.Selenium.Tests
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using NUnit.Framework;

    public class OrderedTestAttribute : Attribute
    {
        public int Order { get; set; }


        public OrderedTestAttribute(int order)
        {
            Order = order;
        }
    }

    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt = new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [OrderedTest(0)]
        public void Test0()
        {
            Console.WriteLine("This is test zero");
            Assert.That(MyInt.I, Is.EqualTo(0));
        }

        [OrderedTest(2)]
        public void ATest0()
        {
            Console.WriteLine("This is test two");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
        }


        [OrderedTest(1)]
        public void BTest0()
        {
            Console.WriteLine("This is test one");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
        }

        [OrderedTest(3)]
        public void AAA()
        {
            Console.WriteLine("This is test three");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
        }


        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                var assembly =Assembly.GetExecutingAssembly();
                Dictionary<int, List<MethodInfo>> methods = assembly
                    .GetTypes()
                    .SelectMany(x => x.GetMethods())
                    .Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
                    .GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
                    .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

                foreach (var order in methods.Keys.OrderBy(x => x))
                {
                    foreach (var methodInfo in methods[order])
                    {
                        MethodInfo info = methodInfo;
                        yield return new TestCaseData(
                            new TestStructure
                                {
                                    Test = () =>
                                        {
                                            object classInstance = Activator.CreateInstance(info.DeclaringType, null);
                                            info.Invoke(classInstance, null);
                                        }
                                }).SetName(methodInfo.Name);
                    }
                }

            }
        }
    }
}
PvtVandals
sumber
Saya pikir pendekatan ini bagus. Perhatikan bahwa kode refleksi akan menarik semua metode dengan atribut, jadi jika Anda mencoba menjalankan perlengkapan uji tertentu, Anda mungkin terkejut menemukan bahwa itu berjalan lebih dari yang Anda kira. Anda dapat dengan mudah mengubah kueri LINQ jika ini bukan perilaku yang diinginkan. Lihat link di jawaban saya untuk info lebih lanjut.
Chrispy
OrderedTesttidak lagi didukung di NUnit 3.
Conrad
7

Saya tahu ini adalah postingan yang relatif lama, tetapi berikut ini cara lain untuk menjaga agar pengujian Anda tetap teratur TANPA membuat nama pengujian menjadi canggung. Dengan menggunakan atribut TestCaseSource dan memiliki objek yang Anda lewati memiliki sebuah delegasi (Action), Anda tidak hanya dapat mengontrol pesanan tetapi juga memberi nama tes itu apa adanya.

Ini berfungsi karena, menurut dokumentasi, item dalam koleksi yang dikembalikan dari sumber pengujian akan selalu dijalankan dalam urutan yang dicantumkan.

Ini adalah demo dari presentasi yang saya berikan besok:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace NUnitTest
{
    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt= new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test one");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
                        }
                    }).SetName(@"Test One");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test two");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
                        }
                    }).SetName(@"Test Two");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test three");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
                        }
                    }).SetName(@"Test Three");
            }
        }
    }
}
Dave Bush
sumber
Saya menggunakan pola ini untuk pengujian integrasi paralel yang akan memakan waktu terlalu lama untuk dijalankan secara linier. Semua pengujian menggunakan satu jenis jadi saya menggunakan Action <T in>, dan setiap Action memiliki kunci yang mengatakan apa artinya "ShouldBeFoo". Dengan cara ini, apa yang dilakukan pengujian akan terlihat dalam nama pengujian, dan TestCaseSource dapat difilter sehingga berbagai jenis pengujian dikelompokkan bersama. Ironisnya, saya tidak peduli dengan perintah eksekusi, tetapi setuju bahwa itu akan berhasil.
Novaterata
Menggunakan TestCaseSourcesebagai cara untuk menjalankan tes terurut adalah jenius. Sudah selesai dilakukan dengan baik. Saya telah mengambil pendekatan ini bersama dengan yang di bawah ini dan menambahkan beberapa modifikasi tambahan untuk membuatnya lebih mudah digunakan. Lihat tautan di jawaban saya untuk info tambahan, tetapi ide dasarnya adalah dari jawaban hebat ini!
Chrispy
Sayangnya, dengan NUnit 3, sumber TestCaseSourceharus statis, yang menghalangi penggunaan pola. Kekecewaan.
Conrad
@Kontenvideo Saya tidak melihat perbedaan apa yang membuat metode ini statis atau tidak. Tes masih kembali dengan urutan apa pun.
Dave Bush
Ini bukan metode yang harus statis - sumber (variabel atau properti) TestCaseSourceharus berupa objek statis di NUnit 3, atau pengujian tidak akan dijalankan. Dan Anda tidak dapat membuat objek dinamis dalam objek statis. Itulah mengapa ini tidak akan berhasil dalam v. 3.
Conrad
5

Saya bekerja dengan kasus pengujian UI ujung ke ujung Selenium WebDriver yang ditulis dalam C #, yang dijalankan menggunakan kerangka kerja NUnit. (Bukan kasus unit seperti itu)

Pengujian UI ini tentunya bergantung pada urutan eksekusi, karena pengujian lain perlu menambahkan beberapa data sebagai prasyarat. (Tidak mungkin melakukan langkah-langkah di setiap tes)

Sekarang, setelah menambahkan kasus uji ke-10, saya melihat NUnit ingin berjalan dalam urutan ini: Test_1 Test_10 Test_2 Test_3 ..

Jadi saya rasa saya harus terlalu menyusun alfabetis nama kasus uji untuk saat ini, tetapi akan lebih baik jika fitur kecil ini untuk mengontrol urutan eksekusi ditambahkan ke NUnit.

Hexa
sumber
9
Tidak setuju dengan Arran: Pengujian UI pada dasarnya adalah urutan langkah-langkah kecil. Setiap langkah harus menjadi ujian (Alasan - jika gagal, saya perlu tahu langkah mana). Urutan bisa independen, tetapi dalam urutan, urutan penting & berhenti jika gagal.
Zasz
3

Biasanya Unit Test harus independen, tetapi jika harus, maka Anda dapat menamai metode Anda dalam urutan abjad mis:

[Test]
public void Add_Users(){}

[Test]
public void Add_UsersB(){}

[Test]
public void Process_Users(){}

atau Anda bisa melakukan ..

        private void Add_Users(){}

        private void Add_UsersB(){}

        [Test]
        public void Process_Users()
        {
           Add_Users();
           Add_UsersB();
           // more code
        }
Sebastian Castaldi
sumber
2
Kecuali sekarang, nama harus dibuat menurut abjad, yang merupakan solusi yang buruk. :(
@ user166390 - bukan itu tidak buruk. Ia bekerja dan bergantung pada perilaku NUnit yang didokumentasikan.
tymtam
➕1 cukup baik untuk saya, jauh lebih mudah jika Anda memulai pengujian dengan a_ b_ t1_, t2_atau mengandalkan karakter yang tertinggal
Chris Marisic
3

Ada alasan yang sangat bagus untuk menggunakan mekanisme Pemesanan Tes. Sebagian besar pengujian saya sendiri menggunakan praktik yang baik seperti penyiapan / pembongkaran. Yang lainnya memerlukan pengaturan data dalam jumlah besar, yang kemudian dapat digunakan untuk menguji berbagai fitur. Sampai sekarang, saya telah menggunakan tes besar untuk menangani tes integrasi (Selenium Webdriver) ini. Namun, saya pikir posting yang disarankan di atas di https://github.com/nunit/docs/wiki/Order-Attribute memiliki banyak manfaat. Berikut adalah contoh mengapa memesan akan sangat berharga:

  • Menggunakan Selenium Webdriver untuk menjalankan pengujian untuk mendownload laporan
  • Status laporan (apakah dapat diunduh atau tidak) di-cache untuk 10 menit
  • Artinya, sebelum setiap tes saya perlu mengatur ulang status laporan dan kemudian menunggu hingga 10 menit sebelum status dikonfirmasi telah berubah, dan kemudian memverifikasi unduhan laporan dengan benar.
  • Laporan tidak dapat dibuat secara praktis / tepat waktu melalui ejekan atau mekanisme lain dalam kerangka pengujian karena kompleksitasnya.

Waktu tunggu 10 menit ini memperlambat rangkaian pengujian. Saat Anda menggandakan penundaan caching yang serupa di banyak pengujian, ini menghabiskan banyak waktu. Mengurutkan pengujian dapat memungkinkan penyiapan data dilakukan sebagai "Pengujian" tepat di awal rangkaian pengujian, dengan pengujian yang mengandalkan cache untuk membobol yang dijalankan menjelang akhir pengujian dijalankan.

pengguna2986256
sumber
2

Pertanyaan ini sudah sangat tua sekarang, tetapi bagi orang-orang yang mungkin mencapai ini dari pencarian, saya mengambil jawaban yang sangat baik dari user3275462 dan PvtVandals / Rico dan menambahkannya ke repositori GitHub bersama dengan beberapa pembaruan saya sendiri. Saya juga membuat posting blog terkait dengan beberapa info tambahan yang dapat Anda lihat untuk info lebih lanjut.

Semoga bermanfaat bagi Anda semua. Selain itu, saya sering menggunakan atribut Kategori untuk membedakan pengujian integrasi saya atau pengujian ujung ke ujung lainnya dari pengujian unit saya yang sebenarnya. Orang lain telah menunjukkan bahwa pengujian unit seharusnya tidak memiliki ketergantungan urutan, tetapi jenis pengujian lain sering melakukannya, jadi ini memberikan cara yang bagus untuk hanya menjalankan kategori pengujian yang Anda inginkan dan juga mengurutkan pengujian ujung ke ujung tersebut.

Chrispy
sumber
dapatkah Anda membantu saya dengan masalah yang saya miliki, ini tautannya: stackoverflow.com/questions/31281395/…
Morgan Soren
1

Saya terkejut komunitas NUnit belum menemukan apa pun, jadi saya pergi untuk membuat sesuatu seperti ini sendiri.

Saat ini saya sedang mengembangkan pustaka sumber terbuka yang memungkinkan Anda memesan pengujian dengan NUnit. Anda dapat memesan perlengkapan uji dan memesan "spesifikasi uji yang dipesan".

Perpustakaan menawarkan fitur-fitur berikut:

  • Buat hierarki pengurutan pengujian yang kompleks
  • Lewati tes selanjutnya jika tes secara berurutan gagal
  • Urutkan metode pengujian Anda berdasarkan ketergantungan, bukan urutan bilangan bulat
  • Mendukung penggunaan secara berdampingan dengan pengujian tidak berurutan. Tes tidak berurutan dijalankan terlebih dahulu.

Pustaka ini sebenarnya terinspirasi dari cara MSTest menguji pengurutan dengan .orderedtestfile. Silakan lihat contoh di bawah ini.

[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
    protected override void DefineTestOrdering() {
        TestFixture<Fixture1>();

        OrderedTestSpecification<MyOtherOrderedTestFixture>();

        TestFixture<Fixture2>();
        TestFixture<Fixture3>();
    }

    protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}
Sebazzz
sumber
1

Jika Anda menggunakan [TestCase], argumenTestName memberikan nama untuk pengujian.

Jika tidak ditentukan, nama akan dibuat berdasarkan nama metode dan argumen yang diberikan.

Anda dapat mengontrol urutan eksekusi uji seperti yang diberikan di bawah ini:

                    [Test]
            [TestCase("value1", TestName = "ExpressionTest_1")]
            [TestCase("value2", TestName = "ExpressionTest_2")]
            [TestCase("value3", TestName = "ExpressionTest_3")]
            public void ExpressionTest(string  v)
            {
                //do your stuff
            }

Di sini saya menggunakan nama metode "ExpressionTest" akhiran dengan angka.

Anda dapat menggunakan nama apa pun yang diurutkan menurut abjad, lihat Atribut TestCase

M. Hassan
sumber
0

Anda tidak boleh bergantung pada urutan framework pengujian memilih pengujian untuk dieksekusi.Tes harus diisolasi dan independen. Dalam hal ini mereka tidak harus bergantung pada beberapa tes lain yang mengatur panggung untuk mereka atau membersihkan setelah mereka. Mereka juga harus menghasilkan hasil yang sama terlepas dari urutan pelaksanaan pengujian (untuk snapshot SUT tertentu)

Saya melakukan sedikit googling. Seperti biasa, beberapa orang menggunakan trik licik (alih-alih memecahkan masalah mendasar untuk pengujian / desain

  • menamai tes dalam urutan abjad sehingga tes muncul dalam urutan yang 'perlu' untuk dijalankan. Namun NUnit dapat memilih untuk mengubah perilaku ini dengan rilis selanjutnya dan kemudian pengujian Anda akan disemprot. Lebih baik periksa biner NUnit saat ini ke Kontrol Sumber.
  • VS (IMHO mendorong perilaku yang salah dengan 'agile tools' mereka) memiliki sesuatu yang disebut sebagai "Tes yang dipesan" dalam kerangka pengujian MS mereka. Saya tidak menyia-nyiakan waktu untuk membaca tetapi tampaknya ditargetkan untuk audiens yang sama

Lihat Juga: karakteristik tes yang baik

Gishu
sumber
Ada kalanya Anda ingin menjalankan pengujian yang berjalan lebih cepat sebelum pengujian yang berjalan lama, khususnya dalam pengujian integrasi dan penerimaan. Misalnya, dalam aplikasi blog: Anda menguji login terlebih dahulu, karena jika fitur itu tidak berfungsi, pengeposan juga tidak akan berfungsi sehingga tidak ada gunanya menjalankan pengujian itu (Anda dapat menghentikan pelari secara manual). Tetapi jika Anda mencoba untuk terus menjalankan pengujian, itu akan membutuhkan lebih banyak waktu.
Marcel Valdez Orozco
@MarcelValdezOrozco - Anda dapat mencapai tujuan itu dengan mempartisi pengujian Anda baik melalui dll fisik yang berbeda atau dengan menggunakan tag / kategori. Anda dapat membuat skrip build Anda untuk menjalankan dll / kategori secara berurutan. Secara umum, mengizinkan pengurutan pengujian biasanya mengarah ke pengujian gabungan yang mengembangkan ketergantungan pada pengujian yang bersebelahan (tentu saja seiring waktu). AFAIR dalam rilis besar NUnit berikutnya, ini akan mendukung urutan pengujian yang berbeda, misalnya acak, dll.
Gishu
2
Mempartisi lebih jauh jenis tes yang sama (tes penerimaan, misalnya) tidak masuk akal, dan memisahkannya ke DLL lain yang tidak perlu meningkatkan kompleksitas di mana-mana: kode sumber, skrip build, skrip uji, struktur proyek, dll. Hanya untuk membuat penyusunan ulang sederhana tes.
Marcel Valdez Orozco
Memancarkan (jadi pada dasarnya semua libs yang mengejek) adalah alasan mengapa urutan menjadi penting. Anda tidak dapat melepas domain aplikasi Anda, dan runner nunit (jika menjalankan semua pengujian dalam sebuah assembly) menyimpan domain tersebut untuk semua pengujian setidaknya dalam 'fixure' tersebut. Jika satu pengujian membuat tipe untuk menguji sesuatu, dan tes lain bentrok dengan tipe yang dibuat, karena urutan, itu bukan tes yang salah. Mereka diisolasi secara logis, hanya saja nUnit tidak menyediakan isolasi yang tepat antara setiap 'pengujian' itu sendiri.
Kelly Elton
6
Ini adalah jawaban yang cukup merendahkan dan membuatnya lucu karena ini benar-benar hanya berlaku untuk pengujian unit dan sepenuhnya mengabaikan sikap pragmatis.
tymtam
0

Dalam kasus menggunakan TestCaseSourcemetode kunci adalah override string ToString, Bagaimana itu bekerja:

Asumsikan Anda memiliki kelas TestCase

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }
}

Dan daftar TestCases:

private static IEnumerable<TestCase> TestSource()
{
    return new List<TestCase>
    {
        new TestCase()
        {
           Name = "Test 1",
           Input = 2,
           Expected = 4
        },
        new TestCase()
        {
            Name = "Test 2",
            Input = 4,
            Expected = 16
        },
        new TestCase()
        {
            Name = "Test 3",
            Input = 10,
            Expected = 100
        }
    };
}

Sekarang mari kita gunakan dengan metode Test dan lihat apa yang terjadi:

[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
    var x = Power(testCase.Input);
    x.ShouldBe(testCase.Expected);
}

Ini tidak akan menguji secara berurutan dan hasilnya akan seperti ini:

masukkan deskripsi gambar di sini

Jadi jika kita menambahkan override string ToStringke kelas kita seperti:

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

Hasilnya akan berubah dan kita mendapatkan urutan dan nama tes seperti:

masukkan deskripsi gambar di sini

catatan:

  1. Ini hanya contoh untuk mengilustrasikan bagaimana mendapatkan nama dan urutan dalam tes, urutan diambil secara numerik / abjad jadi jika Anda memiliki lebih dari sepuluh tes saya sarankan membuat Tes 01, Tes 02 .... Tes 10, Tes 11 dll karena jika Anda membuat Tes 1 dan di beberapa titik Tes 10 daripada urutannya adalah Tes 1, Tes 10, Tes 2 .. dll.
  2. Input dan Expected dapat berupa jenis, string, objek, atau kelas kustom apa pun.
  3. Selain urutan, hal baiknya di sini adalah Anda melihat nama tes mana yang lebih penting.
maytham-ɯɐɥʇʎɐɯ
sumber