【问题标题】:Testing class that retrieves unpredictable data检索不可预测数据的测试类
【发布时间】:2013-11-25 18:59:41
【问题描述】:

我有一个任务是围绕本机 activex 组件编写 .net 包装器,该组件会加载有关股票价格的实时数据。

问题是如何正确测试?

在我看来,做以下测试用例是合理的:

  1. 测试它是否正常工作:开始在某些代码上加载价格,确保开始加载
  2. 测试数据正在流动:开始在某些代码上加载价格,确保我收到了一些更新
  3. 测试我是否有合理的价格:开始在某些代码上加载价格,确保我已收到预期价格(或至少在某个合理范围内的价格)

不幸的是:

  1. 我不能确定某些股票代码会永远存在。
  2. 我不能确定某些股票价格会在每个周期内更新指定的次数
  3. 或者会有一些精确的值(或者甚至是给定范围内的值,概率为 100%)

当然,我可以模拟数据源,这会很有意义。但在这种情况下,我将测试我的包装器以防万一,而不是针对那些编写本机加载程序的人

【问题讨论】:

    标签: .net unit-testing automated-tests integration-testing


    【解决方案1】:

    非确定性和单元测试不能很好地结合在一起。但是,我认为您面临的唯一不确定性是您从本机加载程序收到的数据及其格式。为什么?

    测试它是否正常工作:开始在某些代码上加载价格,确保加载开始

    这应该完全由 .NET 代码控制;通过某种工作或手动方法调用。没有不确定性。

    测试数据正在流动:开始在某些代码上加载价格,确保我收到了一些更新

    再次,.NET 代码。您要么需要另一个作业来定期向本机加载程序查询数据,要么需要观察本机加载程序的事件并对其作出响应。

    测试我是否有合理的价格:开始在某些代码上加载价格,确保我已收到预期价格(或至少在某个合理范围内的价格)

    什么是合理的价格?从0Int32.Max 的范围? 不要尝试测试原生加载器假设其工作原理并围绕这些假设构建您的代码。您当然可以验证数据格式、范围(例如,价格不应为负值),仅此而已。这将我们带到您可能想要进行单元测试的实际代码 - 将 他们的数据 映射到 您的数据 的类(域对象 - 一个简单的 POCO - StockQuotation 或 @987654324 @)。某种生成器/映射器/转换器。

    现在,您想要进行两组测试 - 一组用于构建器/映射器代码,以确保您以后的代码能够围绕您所做的假设工作。第二组将是传统的系统/集成测试 - 从加载数据到使用实际组件构建结果的整个过程(您不应该关心代码不再存在,因为这又是 超出您的控制范围)。

    在这样的设置中,如果某些东西停止工作,通常可能意味着以下两种情况之一:

    1. 您对加载程序数据所做的假设已更改(或者您忽略了某些内容)
    2. 您的 builder/mapper/converter 在有效假设下实施不正确

    此时跟踪问题应该很容易。不要试图编写万无一失的代码,因为你不会。有错误的代码是事物的正常状态。你找到它们并修复它们。准备错误/异常比尝试编写不包含它们的代码要容易得多。更不用说,您无法真正控制 3rd 方代码(您的本机加载程序)中的错误 - 最好为它们的到来做好准备。

    【讨论】:

    • +1 感谢您的详细回复!您的第 1 点和第 2 点很棒,我想这一定是处理我的情况的正确方法。您能否澄清一下:在您看来,我应该使用任何代码,如果它不再存在并且我的测试开始失败,只需将它与新的链接起来,不要担心?
    • @Rustam:是的,我会选择任何代码(见鬼,甚至随机选择以确保您不会不小心对数据做出太多假设)。请注意,代码选择仅与集成/组件(大型)测试相关。构建器/映射器应该对股票代码是否反映实际股票无动于衷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2023-03-19
    • 2013-05-18
    • 2021-09-23
    相关资源
    最近更新 更多