假设您制作的应用程序尝试将字母A中的内容尽可能密切地转换为字母B。所有的单元测试都应该成功吗?
因为B语言非常复杂,所以这并不总是成功的。但你确实得到了一个近似的音译。
考虑到你期望20-30%失败,你将如何在这种情况下建立单元测试?
假设您制作的应用程序尝试将字母A中的内容尽可能密切地转换为字母B。所有的单元测试都应该成功吗?
因为B语言非常复杂,所以这并不总是成功的。但你确实得到了一个近似的音译。
考虑到你期望20-30%失败,你将如何在这种情况下建立单元测试?
它必须始终是您的单元测试成功的目标。您使用它的方式不能区分软件中的严重错误和您期望的翻译错误。
我会建议分开两个:
预计失败的单元测试不是单元测试。您需要通过使用充当过滤器的评估函数来更改成功的定义,并决定它是否“足够接近”并确定合格/不合格。随着您的翻译者变得更好,您可以在过滤器中提高栏。
单元测试应该是确定性的。失败的测试应该表明软件失败,而不是“按预期工作”。对于您的情况,准备数据的方式可以确保结果并对它们进行测试,无论转换是成功还是失败(考虑到您对的期望失败,测试失败总是一个选项 - 重要的是您始终处于控制之下当你的测试通过/失败)。
我在这种情况下学到的技术只是测试功能(或确定性)的代码部分。当然,如果将确定性与非确定性部分分开,则是困难的部分。这种简单的说法是“将[或重构]简化为功能性”,这意味着将代码中确定性的部分分开,然后对这些部分进行测试。
对于上下文的情景位,读这blog一篇关于此技术的应用程序时,让周围的遗留代码测试(以及使用名为ApprovalTests开源单元测试库)。
另一种可能感兴趣的技术是“基于理论”的测试。有关更多信息,请查看blog。
单元测试可能失败的唯一原因是涉及时序(主要是在电子元件正在测试的情况下)。但是,即使这些情况,应该从单元测试中去除时间问题,例如,通过延长/切换超时或其他时间问题,如果可能的话。当不可能的时候,应该记录良好。
另一种消除计时问题并使测试具有确定性的方法是使用一些注入方法为所有外部接口编写存根,即能够设置外部接口方法将返回的值。通过以这种方式设置单元测试,您可以从字面上测试每个错误情况。(故事:我在一家公司工作,其中几个单元测试偶尔会失败,只有少数人能够分析这些是严重错误还是时机问题。这将节省很多时间以便在单元测试中进行良好的单元测试第一名)。
+1用于分隔* unit *从*验证验证程序正确性的测试*验证程序符合指定要求的测试。 – 2012-08-12 18:40:14