繁体   English   中英

单元测试方法的独立性

[英]Unit Testing method independence

因此,我并不完全确定这是真的:

[TestClass]
public class UnitTest1
{
    private int i = 0;

    [TestMethod]
    public void TestMethod1()
    {
        Thread.Sleep(5000);
        Assert.IsTrue(i == 10);
    }

    [TestMethod]
    public void TestMethod2() {
        i = 10;
    }
}

根据测试结果,看起来好像不是,但是我想确定一下,如果我在测试方法上定义了全局变量,则其他测试方法将无法读取它。

另外,我是否必须定义

    [TestCleanup]
    public void Test_Cleanup() {
        engine = null;
    }

以此为例

    [TestInitialize]
    public void Test_Initialize()
    {
        var pieceGeneratorMock = new Mock<IPieceGenerator>();
        pieceGeneratorMock.Setup(pg => pg.Generate())
            .Returns(new Piece(Color.Red));
        IPieceGenerator pieceGenerator = pieceGeneratorMock.Object;

        Size size = new Size(4, 4);
        BackgroundBoard backgroundBoard = new BackgroundBoard(size);
        PieceBoard pieceBoard = new PieceBoard(size);
        engine = new Engine(pieceGenerator, backgroundBoard, pieceBoard);
    }

至少在JUnit中,每个测试方法都是在TestCase的单独实例上调用的。 你可以通过输出/记录的恒等式哈希验证这一点为自己this在每个测试*方法。

您可以在测试类中使用全局变量。 有一个基本原则,即您编写的每个测试都应该独立。 理想情况下,两种测试方法之间不应存在依赖关系。 如果要使用全局变量,可以在用[TestInitialize]属性修饰的方法中初始化它们。 在执行任何以[TestMethod]属性修饰的测试方法之前,都会每次调用此方法。

这使您可以在测试方法之间共享变量,但可以确保在执行测试之前始终将其设置为特定值。 您可以在比较单元测试框架的博客上找到有关此内容的更多信息。

在测试类内部,成员行为与任何其他类相同。 尽管没有TestCleanup和TestInitialize属性,您可以使用它们在测试方法之间运行方法,但并不是为每个测试方法调用都重构该类,因此成员值得以继续。

彼此不需要TestCleanup和TestInitialize,它们可以一起使用,也可以互斥使用。 TestInitialize将在每次测试之前运行,TestCleanup将在每次测试后运行(但在Testinitialize之前)。 挺直的。

您可以并且应该使用setUp和tearDown方法在测试之前和之后进行初始化和清理。

也就是说,我认为每个测试都在其自己的对象上运行; 也就是说,每个测试执行都有一个新的UnitTest1对象。

您并没有派发TestMethod1(),所以整个线程都在等待,直到睡眠期结束,然后运行assert并发现它为false,因为线程尚未到达TestMethod2。

为了回答您的问题,两种方法都可以读写i。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM