Apakah mungkin untuk mengeksekusi kode satu kali sebelum semua tes dijalankan?

112

Pada dasarnya saya ingin memberi tahu MSTest untuk mengeksekusi sedikit kode sebelum meluncurkan serangkaian uji coba, pada dasarnya apa yang ingin saya lakukan adalah hal yang sama dengan menempelkan beberapa kode Main().

Alasan saya ingin melakukan ini adalah karena saya ingin melakukan logging dengan log4net selama pengujian integrasi saya berjalan. Saya tidak bisa begitu saja menggunakan log4net.Config.XmlConfiguratoratribut assembly karena pada saat itu membacanya di perakitan pengujian saya sudah dipanggil LoggerManager. Dokumentasi merekomendasikan konfigurasi log4net secara eksplisit pada titik entri kode - tetapi di manakah itu dalam pengujian saya?

Saya harus dapat menjalankan pengujian saya di TestDriven.NET dan pelari MSTest.

George Mauer
sumber

Jawaban:

153

FWIW, Anda dapat menggunakan atribut AssemblyInitialize untuk menjalankan kode sebelum semua pengujian unit di dalam assembly dijalankan:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Jika Anda memiliki lebih dari satu unit uji perakitan, saya tidak mengetahui apa pun yang mencakup lebih dari satu perakitan.

Sejauh yang saya ketahui, ini sedekat yang Anda bisa dengan padanan Utama.

Perhatikan bahwa AssemblyInitializemetode -dekorasi harus dalam TestClasskelas -dekorasi yang berisi setidaknya satu TestMethodmetode -dekorasi, jika tidak maka tidak akan dijalankan!

Mark Seemann
sumber
1
Saya memiliki masalah yang sama (hanya untuk MSTest) dan bekerja dengan baik. Terima kasih :)
Oscar Foley
1
Untuk siapa pun yang mengalami masalah dalam membuatnya berfungsi baik dari MsTest dan TestDriven.NET, Anda dapat menggunakan bendera statis untuk menentukan apakah akan menjalankan kode di ClassInitialize (ini tidak berfungsi di MsTest).
Carl
7
Catatan: Mesin uji menjalankan metode yang ditandai dengan atribut AssemblyInitialize hanya jika metode itu adalah anggota kelas yang ditandai dengan atribut TestClass.
Jowen
5
@Jowen: Mesin uji menjalankan metode yang ditandai dengan atribut AssemblyInitialize hanya jika metode itu adalah anggota kelas yang ditandai dengan atribut TestClass and contains methods that are marked with the TestMethod attribute.
oɔɯǝɹ
3
Metode yang ditandai dengan AssemblyInitialize akan berjalan di Visual Studio 2015 Ultimate tanpa metode lain yang ditandai dengan atribut TestMethod.
Chris
63

Untuk menyelesaikannya, ini adalah opsi "jalankan kode sebelum" untuk MSTest:

  • Gunakan [AssemblyInitialize]untuk menjalankan kode sekali per rakitan, sebelum tes apa pun di rakitan itu berjalan.
  • Gunakan [ClassInitialize]untuk menjalankan kode sekali per kelas, sebelum pengujian apa pun di kelas tempat metode ditentukan.
  • Gunakan [TestInitialize]untuk menjalankan kode sebelum setiap pengujian di kelas tempat metode ditentukan.
Konamiman
sumber
12
Pasangan pembersihan atribut ini adalah sufiks Pembersihan (misalnya ClassCleanup) untuk operasi
penghancuran
13

Saya melihat ini di header MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Ini akan dijalankan sebelum pengujian di satu kelas.

Sepertinya Anda ingin menjalankan sesuatu sebelum semua tes.

Ada juga opsi skrip pengaturan dalam konfigurasi uji coba.

Maestro1024
sumber
Kecuali saya melewatkan sesuatu, skrip penyiapan tidak membantu menjalankan kode di AppDomain pengujian.
George Mauer
2
Mungkin aku. Saya tidak yakin saya mengikuti Anda ketika Anda mengatakan "menjalankan kode di AppDomain uji.". Saya membaca pertanyaan Anda sebagai ingin mengeksekusi kode sebelum serangkaian tes, jika itu adalah hal lain yang berbeda. "Skrip penyiapan dan skrip pembersihan dijalankan sebelum dan setelah pengujian dijalankan, terlepas dari jenis pengujian yang terdapat dalam pengujian tersebut." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024