เหตุใด TestInitialize จึงถูกไล่ออกสำหรับการทดสอบทุกครั้งในการทดสอบหน่วย Visual Studio ของฉัน


158

ฉันใช้ Visual Studio 2010 Beta 2 ผมได้มีเพียงหนึ่งเดียว[TestClass]ที่มี[TestInitialize], และไม่กี่[TestCleanup][TestMethods]

ทุกครั้งที่มีการทดสอบวิธีการทำงานวิธีการเตรียมใช้งานและล้างข้อมูลนั้นจะยังทำงานอยู่!

ฉันอยู่ภายใต้ความประทับใจที่[TestInitialize]&[TestCleanup]ควรจะทำงานเพียงครั้งเดียวต่อการทดสอบในท้องถิ่น

ถูกต้องหรือไม่ ถ้าไม่เป็นวิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?

คำตอบ:


314

TestInitializeและTestCleanupวิ่งก่อนและหลังการทดสอบแต่ละครั้งนี่คือเพื่อให้แน่ใจว่าไม่มีการทดสอบคู่กัน

หากคุณต้องการเรียกใช้วิธีก่อนและหลังการทดสอบทั้งหมดให้ตกแต่งวิธีการที่เกี่ยวข้องด้วยคุณลักษณะClassInitializeและClassCleanup

ข้อมูลที่เกี่ยวข้องจากไฟล์ทดสอบอัตโนมัติที่สร้างขึ้นใน Visual Studio:

คุณสามารถใช้คุณสมบัติเพิ่มเติมต่อไปนี้เมื่อคุณเขียนแบบทดสอบ:

// 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
และคุณมี AssemblyInitialize อีกสองตัวและ AssemblyCleanup อย่างที่กล่าวไว้ที่นี่stackoverflow.com/a/21304674/864201
Rodolpho Brock

12

นี่เป็นพฤติกรรมปกติของชุดทดสอบ: การตั้งค่าและการลดลงก่อนและหลังการทดสอบ ปรัชญาคือการทดสอบไม่ควรขึ้นอยู่กับแต่ละอื่น ๆ หากคุณต้องการพฤติกรรมอื่นคุณควรใช้วัตถุคงที่ที่คงอยู่ระหว่างการทดสอบแต่ละครั้ง


9

ตัวอย่างที่นำมาจากเอกสารของ 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

วิธีการที่มีการทำเครื่องหมายด้วยแอตทริบิวต์ [TestInitialize ()] จะใช้ในการเตรียมด้านของสภาพแวดล้อมที่การทดสอบหน่วยของคุณจะทำงาน จุดประสงค์ของสิ่งนี้คือเพื่อสร้างสถานะที่รู้จักสำหรับการทดสอบหน่วยของคุณ คุณสามารถใช้วิธี [TestInitialize ()] เพื่อคัดลอกแก้ไขหรือสร้างไฟล์ข้อมูลบางอย่างที่การทดสอบของคุณจะใช้

สร้างวิธีการที่มีการทำเครื่องหมายด้วย [TestCleanUp {}] เพื่อกลับสู่สภาพแวดล้อมที่เป็นที่รู้จักหลังจากการทดสอบรัน นี่อาจหมายถึงการลบไฟล์ในโฟลเดอร์หรือการคืนฐานข้อมูลกลับสู่สถานะที่รู้จัก ตัวอย่างนี้ใช้เพื่อรีเซ็ตฐานข้อมูลสินค้าคงคลังเป็นสถานะเริ่มต้นหลังจากทดสอบวิธีที่ใช้ในแอปพลิเคชันป้อนคำสั่งซื้อ

สำหรับข้อมูลเพิ่มเติมโปรดดู: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.