单元测试方法独立性

时间:2010-08-05 17:26:14

标签: c# java unit-testing

所以,我并不完全确定这是真的:

[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);
    }

5 个答案:

答案 0 :(得分:4)

至少在JUnit中,每个测试方法都在TestCase的单独实例上调用。您可以通过在每个测试*方法中输出/记录this的缩进哈希来自行验证。

答案 1 :(得分:3)

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

这允许您跨测试方法共享变量,但确保在执行测试之前始终将其设置为特定值。您可以在我的博客comparing unit testing framework

上找到有关此内容的更多信息

答案 2 :(得分:0)

在测试类中,成员行为与任何其他类相同。不会为每个测试方法调用重构该类,因此会继续使用成员值,尽管可以使用TestCleanup和TestInitialize属性在您的测试方法之间运行方法。

由于彼此不需要TestCleanup和TestInitialize,它们可以一起使用或相互排斥。 TestInitialize将在每次测试之前运行,TestCleanup将在每次测试后运行(但在Testinitialize之前)。很直接。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

你没有分支TestMethod1(),因此整个线程都在等待,直到睡眠期结束,运行断言,并发现它为假,因为线程尚未到达TestMethod2

要回答你的问题,这两种方法都可以读写i。