单元测试....数据提供商?

时间:2010-12-29 01:05:15

标签: unit-testing

给出问题:

  • 我喜欢单元测试。
  • 我开发了几乎经常使用C ++库的外部系统的连接软件
  • 这个系统的回归是不确定的。运行时会收到数据,但要确保所有数据都正确解释很难。

我该如何正确测试?

我可以运行一个连接的单元测试。遗憾的是,它将处理生命数据流。我可以说我在断开连接之前运行测试30或60秒,但是获取代码ccoverage是不可能的 - 我甚至根本不会每天都获得所有代码路径(错误代码路径很少运行)。 我也无法真正断言每一个结果。根据一天中的时间,我们讨论每秒20.000个数据回调 - 所有这些回调都没有得到足够好的判断,以确保每个回调的一致性。 惩戒?好吧,这会让我测试一个自己的空壳,因为处理事件的代码基本上是要测试的情况,在很多情况下我们在这里谈论一个COMPLEX c级结构 - 很难有从Csharp集成的模拟框架C ++

任何人都有任何想法?我没有放弃对这部分应用程序使用单元测试。

2 个答案:

答案 0 :(得分:3)

单元测试很好,但它不应该是你防范bug的唯一武器。看看the difference between unit tests and integration tests:听起来像后者是你最好的选择。

此外,自动化测试(单元测试和集成测试)仅在系统的行为不会改变时才有用。如果您破坏了与每个版本的向后兼容性,那么该功能的自动测试对您没有帮助。

您可能还希望看到之前关于how much unit testing is too much的讨论。

答案 1 :(得分:0)

您的外部数据源是否实现了接口 - 或者您是否可以使用接口和实现接口的数据源的包装器的组合来将您的测试类与数据源分离。如果其中任何一个都为真,那么您可以在单元测试中模拟数据源并提供模拟实例中的数据。

public interface IDataSource
{
     public List<DataObject> All();
     ...
}

public class DataWrapper : IDataSource
{
     public DataWrapper( RealDataSource source )
     {
         this.Source = source;
     }

     public RealDataSource Source { get; set; }

     public List<DataObject> All()
     {
          return this.Source.All();
     }
}

现在在你的测试类中依赖于接口并注入一个实例,然后在你的单元测试中,提供一个实现接口的模拟实例。

public void DataSourceAllTest()
{
    var dataSource = MockRepository.GenerateMock<IDataSource>();
    dataSource.Expect( s => s.All() ).Return( ... mock data ... );

    var target = new ClassUnderTest( dataSource );

    var actual = target.Foo();

    // assert something about actual

    dataSource.VerifyAllExpectations();
}