TestInitialize neden Visual Studio birim testlerimdeki her test için tetikleniyor?


158

Ben tek var Visual Studio 2010 Beta 2'yi kullanıyorum [TestClass]bir olan, [TestInitialize], [TestCleanup]ve birkaç [TestMethods].

Bir test yöntemi her çalıştırıldığında, başlatma ve temizleme yöntemleri de ÇALIŞIR!

Ben yerel test çalışması başına [TestInitialize]& [TestCleanup]sadece bir kez çalıştırılması gerektiği izlenimi altındaydı .

Bu doğru mu? Değilse, bunu yapmanın uygun yolu nedir?

Yanıtlar:


314

TestInitializeve TestCleanupher testten önce ve sonra çalıştırılır; bu, hiçbir testin birleştirilmediğinden emin olmak içindir.

TÜM testlerden önce ve sonra yöntemleri çalıştırmak istiyorsanız, ilgili yöntemleri ClassInitializeve ClassCleanupöznitelikleriyle süsleyin .

Visual Studio'da otomatik oluşturulan test dosyasından ilgili bilgiler:

Testlerinizi yazarken aşağıdaki ek özellikleri kullanabilirsiniz:

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

// Use ClassCleanup to run code after all tests in a class have run
[ClassCleanup()]
public static void MyClassCleanup() { }

// Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize() { }

// Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup() { }

9
ve burada daha önce bahsedildiği gibi iki AssemblyInitialize ve AssemblyCleanup var. stackoverflow.com/a/21304674/864201
Rodolpho Brock

12

bu test paketleri için oldukça standart bir davranıştır: her testten önce ve sonra kurulum ve sökme. Felsefe, testlerin birbirine bağlı olmaması gerektiğidir. Başka bir davranış istiyorsanız, muhtemelen her test arasında kalan statik nesneleri kullanmalısınız.


9

Microsoft belgelerinden alınan tam örnek :

using Microsoft.VisualStudio.TestTools.UnitTesting;
using SampleClassLib;
using System;
using System.Windows.Forms;

namespace TestNamespace
{
    [TestClass()]
    public sealed class DivideClassTest
    {
        [AssemblyInitialize()]
        public static void AssemblyInit(TestContext context)
        {
            MessageBox.Show("AssemblyInit " + context.TestName);
        }

        [ClassInitialize()]
        public static void ClassInit(TestContext context)
        {
            MessageBox.Show("ClassInit " + context.TestName);
        }

        [TestInitialize()]
        public void Initialize()
        {
            MessageBox.Show("TestMethodInit");
        }

        [TestCleanup()]
        public void Cleanup()
        {
            MessageBox.Show("TestMethodCleanup");
        }

        [ClassCleanup()]
        public static void ClassCleanup()
        {
            MessageBox.Show("ClassCleanup");
        }

        [AssemblyCleanup()]
        public static void AssemblyCleanup()
        {
            MessageBox.Show("AssemblyCleanup");
        }

        [TestMethod()]
        [ExpectedException(typeof(System.DivideByZeroException))]
        public void DivideMethodTest()
        {
            DivideClass.DivideMethod(0);
        }
    }
}

-1

[TestInitialize ()] özniteliğiyle işaretlenen yöntemler, birim testinizin çalışacağı ortamın özelliklerini hazırlamak için kullanılır. Bunun amacı, birim testinizi gerçekleştirmek için bilinen bir durum oluşturmaktır. Testinizin kullanacağı belirli veri dosyalarını kopyalamak, değiştirmek veya oluşturmak için [TestInitialize ()] yöntemini kullanabilirsiniz.

Bir test çalıştırıldıktan sonra ortamı bilinen bir duruma döndürmek için [TestCleanUp {}] özniteliğiyle işaretlenmiş yöntemler oluşturun. Bu, klasörlerdeki dosyaların silinmesi veya bir veritabanının bilinen bir duruma döndürülmesi anlamına gelebilir. Bunun bir örneği, sipariş giriş uygulamasında kullanılan bir yöntemi test ettikten sonra bir envanter veritabanını başlangıç ​​durumuna sıfırlamaktır.

Daha fazla bilgi için lütfen bakınız: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

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.