为每个“实现”运行一组单元测试

时间:2014-02-04 19:21:01

标签: .net unit-testing interface

我的单元测试(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)驻留自己,我不能(手动)并依靠自动构建来运行所有实现,例如通过配置/依赖注入

???建议将不胜感激。感谢。

1 个答案:

答案 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(..); }
}

这会使测试在跑步者中显示为不同测试类中的单独测试用例,即使您只有一次实现。