Possible Duplicate:
What would be an alternate to [SetUp] and [TearDown] in MSTest?
我正在学习如何使用单元测试和自动化测试,但有一些问题我无法弄清楚/找到答案
我目前通过使用多个调用各种方法并在其中包含断言的 [TestMethod] 进行测试。现在,测试方法都有重复的代码来访问数据库并为其余的测试做好准备。一个例子是:
public void TestDBReturnsFooInFormatXyz() {
var foo = HitDBAndReturnStuff();
Assert.IsTrue( // foo format is xyz );
}
public void TestDBFooContainsAbc() {
var foo = HitDBAndReturnStuff();
Assert.IsTrue( // foo contains abc );
}
所以有一些问题: 在测试类中创建私有(private)字段并让构造函数设置它们是最佳实践吗?
我应该在每个测试方法中都这样做吗,因为测试速度并不那么重要?
我应该在构造函数之上放置什么[测试???]以确保在运行测试时调用它?
我查看了 MSDN 和《Programming Microsoft Visual C# 2008: The Language》一书,但找不到任何有关单元测试的好信息。如果有我应该阅读的资源可以回答这些问题,请告诉我。
谢谢!
最佳答案
重复的代码始终是一种不好的做法,因此您应该重构代码以初始化 TestInitialize Method 中的 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 .
但是,using a database in your unit tests is not considered a best practice因为您不希望外部依赖关系影响您的测试结果。相反,您应该使用一个数据库模拟,其行为类似于数据库,但将单元测试与真正的数据库依赖项隔离开来。
一些与数据库相关的问题可能会破坏您的测试,例如连接失败、超时、数据更改和偶尔的数据库升级。 This SO question讨论处理数据库依赖问题的策略。
关于C# 重复公共(public)代码的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13943078/