2

可能重复:
MSTest 中 [SetUp] 和 [TearDown] 的替代方法是什么?

我正在学习如何总体上使用单元测试和自动化测试,并且有一些我无法弄清楚/找不到答案的问题

我目前通过多个调用各种方法并在其中包含断言的 [TestMethod] 进行测试。现在,TestMethod 都有重复的代码来访问数据库并为其余的测试设置自己。一个例子是:

public void TestDBReturnsFooInFormatXyz() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo format is xyz );
}

public void TestDBFooContainsAbc() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo contains abc );
}

所以有些问题:在测试类中创建私有字段并让构造函数设置它们是最佳实践吗?

我应该在每个 TestMethod 中都这样做,因为测试速度并不重要吗?

我应该在构造函数顶部放置什么 [Test???] 以确保在运行测试时调用它?

我查看了 MSDN 和“Programming Microsoft Visual C# 2008: The Language”一书,但找不到任何关于单元测试的好信息。如果有我应该阅读的资源可以回答这些问题,请告诉我。

谢谢!

4

1 回答 1

2

重复代码总是一种不好的做法,因此您应该重构代码以初始化TestInitialize 方法中的foo对象,该方法在每次测试运行之前执行一次,然后在每个测试用例中执行特定操作:

private FooType foo;

[TestInitialize()]
public void TestInitialize()
{
    foo = CreateFooObject();
}

[TestMethod()]
public void TestToAssertThatAbcStuffGetsDone()
{
    foo.DoAbcStuff();
    Assert.IsTrue(foo.DidAbc());
}

[TestMethod()]
public void TestToAssertThatXyzStuffGetsDone()
{
    foo.DoXyzStuff();
    Assert.IsTrue(foo.DidXyz());
}

如果您的foo对象需要在每个测试方法运行后被释放,您还应该实现一个TestCleanup Method

但是,在单元测试中使用数据库并不是最佳实践,因为您不希望外部依赖影响测试结果。相反,您应该使用类似于数据库的数据库模拟,但将单元测试与真实的数据库依赖项隔离开来。

一些与数据库相关的问题可能会破坏您的测试,例如连接失败、超时、数据更改和偶尔的数据库升级。这个 SO question讨论了处理数据库依赖问题的策略。

于 2012-12-19T00:29:07.967 回答