我的单元测试(MSTest,使用Resharper手动运行)对FtpClient的特定实现进行了大量测试。我开始使用AlexFTP的实现,然后当我需要支持SFTP(而不仅仅是FTP和FTPS)时切换到WinSCP。我有一个通用接口,IFtpClient,我的所有测试用例都基于。
我的问题,与Ftp无关,我如何为每个接口实现运行我的套件测试用例?
我的代码结构看起来像这样,我目前取消注释/注释掉我想测试的实现
public IFtpClient GetFtpClient()
{
return new AlexPilottiFtpClient();
// return new WinScpFtpClient();
}
然后我有我的测试代码
[TestMethod]
public void Should_connect_with_valid_credentials()
{
IFtpClient client = base.GetFtpClient();
client.Connect(....)
Assert(....)
}
[TestMethod]
public void Another_Test2()
{
IFtpClient client = base.GetFtpClient();
...
}
[TestMethod]
public void Another_Test3()
{
IFtpClient client = base.GetFtpClient();
...
}
任何人都有想法如何在我的运行中运行两个(或多个)实现?我能想到的一些想法包括:
1)for each of each implementation,在每个TestMethod中 e.g。
[TestMethod]
public void Another_Test4()
{
foreach (IFtpClient client in _clientList)
{
...
}
}
2)复制测试方法 - 每个实现一个,也许是所有人共同的基本方法 e.g。
[TestMethod]
public void Another_Test5_AlexFtp()
{
_client = new AlexPilottiFtpClient();
this.Another_Test5_Base();
}
[TestMethod]
public void Another_Test5_WinScp()
{
_client = new WinScpFtpClient();
this.Another_Test5_Base();
}
private void Another_Test5_Base()
{
_client.Conect(...);
Assert(...);
}
3)驻留自己,我不能(手动)并依靠自动构建来运行所有实现,例如通过配置/依赖注入
???建议将不胜感激。感谢。
答案 0 :(得分:2)
我很可能会创建一个定义所有测试的抽象基类,使用一个抽象方法返回IFtpClient
的实现进行测试。
然后为您需要测试的每个实现制作具体的测试类。
所以你会:
public abstract class FtpBaseTest
{
public abstract IFtpClient GetClient();
[TestMethod]
public void TestOne()
{
IFtpClient client = GetClient();
// do test on client ...
}
[TestMethod]
public void TestTwo()
{
IFtpClient client = GetClient();
// another test on client ...
}
}
[TestClass]
public class AlexFtpTest
{
public override IFtpClient GetClient() { return new AlexFtpClient(..); }
}
[TestClass]
public class AnotherFtpTest
{
public override IFtpClient GetClient() { return new AnotherFtpClient(..); }
}
这会使测试在跑步者中显示为不同测试类中的单独测试用例,即使您只有一次实现。