我有5个测试方法来测试PasswordManager对象的功能。我使用visual studio 2008的内置测试引擎。这个管理器可以使用两个依赖项:XMLStorageManager或DbStorageManager。 Dependency在Passwordmanager的构造函数中设置。如何运行测试两次,唯一不同的是我使用的StorageManager类型?
(我知道,我知道,这些不是单元测试......)
答案 0 :(得分:5)
我不是MSTest用户,但您可能有一些选择。通常使用NUnit我会使用通用或参数化夹具,但我不确定MSTest是否具有类似功能。鉴于此,以下是我如何使用NUnit执行此操作,其形式应该可以通过template method pattern使用任何单元测试框架重现。
步骤:
这是等效NUnit版本的代码;我相信你可以推断出来。 注意: MSTest的继承规则可能与我以前的略有不同。如果它不起作用,您可以尝试将基类标记为测试夹具。
public abstract class PasswordManagerFixtureBase
{
protected abstract IStorageManager CreateStorageManager();
// all tests go in this fixture
[Test]
public void SomeTestOrOther()
{
var passwordManager = CreatePasswordManager();
// do test logic
}
private PasswordManager CreatePasswordManager()
{
// calls into subclass implementation to get instance of storage
IStorageManager storage = CreateStorageManager();
return new PasswordManager(storage);
}
}
// Runs the tests in the fixture base using XmlStorageManager
[TestFixture]
public class PasswordManager_XMLStorageManagerImplTests
{
protected override IStorageManager CreateStorageManager()
{
return new XMLStorageManager();
}
}
// Runs the tests in the fixture base using DbStorageManager
[TestFixture]
public class PasswordManager_DbStorageManagerImplTests
{
protected override IStorageManager CreateStorageManager()
{
return new DbStorageManager();
}
}
使用MSTest可能有更优雅的方法,但这应该有效。
答案 1 :(得分:1)
如果PasswordManager
有一个像IStorageManager
这样的依赖注入(DI,IoC等),那么模仿这个接口而不是使用具体的实现就足够了所以没有必要测试PasswordManager
的XML和Db实现,可以与PasswordManager
分开测试。
答案 2 :(得分:0)
只是一个想法,但您可以创建一个有序测试并添加相同的测试两次:添加所有测试一次,然后再次按相同顺序进行所有测试。在测试环境中,记录每次测试运行的次数。我相信上下文是静态的,因此它应该只创建一次,然后在运行更多测试时重用。在测试设置中,如果测试计数为偶数,则使用XmlStorageManager
;如果该测试的测试计数为奇数,则使用DbStorageManager
。