[英]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.