Tüm testler çalışmadan önce kodu bir kez çalıştırmak mümkün mü?


112

Temel olarak, MSTest'e bir dizi test çalıştırmasına başlamadan önce biraz kod çalıştırmasını söylemek istiyorum, esasen yapmak istediğim şey, bazı kodları yapıştırmakla aynı şey Main().

Bunu yapmak istememin nedeni, entegrasyon testi çalıştırmalarım sırasında log4net ile bir miktar günlük kaydı yapmak istememdir. log4net.Config.XmlConfiguratorTest derlememde okuduğu zaman zaten çağırdığı için assembly özniteliğini kullanamam LoggerManager. Belgeler, log4net'in açıkça kod giriş noktasında yapılandırılmasını önerir - ancak bu testlerimde nerede?

Testlerimi TestDriven.NET ve MSTest çalıştırıcısında çalıştırabilmem gerekiyor.

Yanıtlar:


153

FWIW, bir derlemedeki tüm birim testleri yürütülmeden önce kodu çalıştırmak için AssemblyInitialize özniteliğini kullanabilirsiniz :

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

Birden fazla birim test tertibatınız varsa, birden fazla tertibatı kapsayan hiçbir şeyin farkında değilim.

Bildiğim kadarıyla, bu Ana eşdeğerine en yakın olanı.

Not AssemblyInitialize-dekore yöntem olmalıdır bir olmak TestClassen az bir içermektedir -dekore sınıfın TestMethodaksi takdirde olacak -dekore yöntem değil yürütülecek!


1
Benzer bir sorun yaşadım (yalnızca MSTest için) ve iyi çalıştı. Teşekkürler :)
Oscar Foley

1
Bu çalışmayı hem MsTest hem de TestDriven.NET'ten almakla ilgili sorun yaşayan herkes için, ClassInitialize'da kodun çalıştırılıp çalıştırılmayacağını belirlemek için statik bir bayrak kullanabilirsiniz (bu, MsTest'te çalışmaz).
Carl

7
Not: Test motoru, AssemblyInitialize özniteliğiyle işaretlenmiş bir yöntemi yalnızca bu yöntem, TestClass özniteliğiyle işaretlenmiş bir sınıfın üyesiyse çalıştırır.
Jowen

5
@Jowen: Test motoru, AssemblyInitialize özniteliğiyle işaretlenmiş bir yöntemi yalnızca bu yöntem TestClass özniteliğiyle işaretlenmiş bir sınıfın üyesiyse çalıştırır and contains methods that are marked with the TestMethod attribute.
oɔɯǝɹ

3
AssemblyInitialize ile işaretlenen yöntem, TestMethod öznitelikleriyle işaretlenmiş diğer yöntemler olmadan Visual Studio 2015 Ultimate'da çalıştırılır.
Chris

63

Tamamlama için, bunlar MSTest için "önce kodu çalıştır" seçenekleridir:

  • [AssemblyInitialize]Bu derlemedeki herhangi bir test çalışmadan önce derleme başına kodu bir kez çalıştırmak için kullanın .
  • [ClassInitialize]Yöntemin tanımlandığı sınıftaki herhangi bir testten önce, kodu sınıf başına bir kez çalıştırmak için kullanın .
  • [TestInitialize]Yöntemin tanımlandığı sınıftaki her testten önce kodu çalıştırmak için kullanın .

12
Bu özniteliklerin temizleme karşılığı, yırtma işlemleri için Temizleme son ekidir (örneğin, ClassCleanup)
Yair Nevet

13

Bunu MS Test başlığında görüyorum.

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

Bu, bir sınıftaki testlerden önce çalıştırılır.

Tüm testlerden önce bir şeyler çalıştırmak istiyor gibisin.

Test çalıştırma yapılandırmasında kurulum komut dosyası seçeneği de vardır.


Bir şeyi kaçırmadığım sürece, kurulum komut dosyaları test AppDomain'de kod çalıştırmaya yardımcı olmaz.
George Mauer

2
Muhtemelen benim. "Test AppDomain'de kod çalıştırma" dediğinizde sizi takip ettiğimden emin değilim. Sorunuzu, farklı olan başka bir şey olsaydı, bir dizi testten önce kod çalıştırmak isterken okudum. "Kurulum komut dosyaları ve temizleme komut dosyaları, test çalıştırmalarında bulunan test türlerinden bağımsız olarak, test çalıştırmalarından önce ve sonra çalışır." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.