Tại sao TestInitialize bị sa thải cho mọi thử nghiệm trong các thử nghiệm đơn vị Visual Studio của tôi?


158

Tôi đang sử dụng Visual Studio 2010 Beta 2. Tôi đã có một đơn [TestClass], trong đó có một [TestInitialize], [TestCleanup]và một vài [TestMethods].

Mỗi khi một phương thức kiểm tra được chạy, các phương thức khởi tạo và dọn dẹp đều C ALNG chạy!

Tôi đã có ấn tượng rằng [TestInitialize]&[TestCleanup] chỉ nên được chạy một lần, mỗi lần chạy thử cục bộ.

Đúng không? Nếu không, cách thích hợp để làm điều này là gì?

Câu trả lời:


314

TestInitializeTestCleanupđược chạy trước và sau mỗi bài kiểm tra, điều này là để đảm bảo rằng không có bài kiểm tra nào được ghép nối.

Nếu bạn muốn chạy các phương thức trước và sau TẤT CẢ các thử nghiệm, hãy trang trí các phương thức có liên quan bằng các thuộc tính ClassInitializeClassCleanup.

Thông tin liên quan từ tệp kiểm tra được tạo tự động trong Visual Studio:

Bạn có thể sử dụng các thuộc tính bổ sung sau khi viết bài kiểm tra của mình:

// 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
và bạn có thêm hai hội
đồngInitialize và hộiCleanup

12

đây là hành vi khá chuẩn cho các bộ thử nghiệm: thiết lập và phá vỡ trước và sau mỗi thử nghiệm. Triết lý là các bài kiểm tra không nên phụ thuộc vào nhau. Nếu bạn muốn một hành vi khác, có lẽ bạn nên sử dụng các đối tượng tĩnh tồn tại giữa mỗi lần kiểm tra.


9

Ví dụ đầy đủ lấy từ tài liệu microsoft :

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

Các phương thức được đánh dấu bằng thuộc tính [TestInitialize ()] được sử dụng để chuẩn bị các khía cạnh của môi trường mà bài kiểm tra đơn vị của bạn sẽ chạy. Mục đích của việc này là để thiết lập một trạng thái đã biết để chạy thử nghiệm đơn vị của bạn. Bạn có thể sử dụng phương thức [TestInitialize ()] để sao chép, thay đổi hoặc tạo một số tệp dữ liệu nhất định mà thử nghiệm của bạn sẽ sử dụng.

Tạo các phương thức được đánh dấu bằng thuộc tính [TestCleanUp {}] để trả lại môi trường về trạng thái đã biết sau khi chạy thử. Điều này có thể có nghĩa là xóa các tệp trong các thư mục hoặc trả lại cơ sở dữ liệu về trạng thái đã biết. Một ví dụ về điều này là để thiết lập lại cơ sở dữ liệu hàng tồn kho về trạng thái ban đầu sau khi thử nghiệm một phương thức được sử dụng trong ứng dụng nhập đơn hàng.

Để biết thêm thông tin, vui lòng tham khảo: http://msdn.microsoft.com/en-us/l Library / ms182517% 28v = vs.100% 29.aspx

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.