我是测试驱动开发的新手,并试图了解基础知识。对于简单的方法,它似乎很简单,但假设我正在研究.txt文件的某些点并将它们绘制在图像上。有没有办法测试这是在做我想要的而不必实际检查它?
或者,假设我必须测试像神经网络一样不确定的东西,有时可以获得55%的准确率或82%的其他情况。我怎么测试那些?我意识到我可以测试更简单的方法,但是,总是有可能在其他地方破坏。
答案 0 :(得分:9)
您可以使用一些策略来处理您提出的每个问题。我将从最重要的开始,单元测试不应该用于验证应用程序域之外的事实。这意味着您不会对第三方GUI库进行单元测试,也不会使用它来验证数学理论是否成立。你不测试5 + 5实际上等于10,你只需要证明你的实现的添加提供了一些正确的结果。
因此,您通常不会使用单元测试来证明您的神经网络按预期收敛。已知这种行为有效。您只需证明您的代码实现了神经网络外部理论所必需的约束和行为。
这一切归结为确保您正在测试正确的东西。确保您只对单元进行单元测试。
下一个策略,特别是用于应用程序中更高抽象层的策略,是使用展示已知行为的特殊版本替换低于被测单元的层。这大致是模拟测试的想法。例如,在测试与数据库交互的内容时,通常不希望允许被测代码与真实数据库进行交互。首先,数据库保留状态,并且您不希望在单元测试中,测试应该是原子的和独立的。另一个问题是外部数据库可能导致测试失败,原因不在于被测模块的控制范围之外。
解决方案是注入一个错误的数据库层,它响应与真实数据库相同的API,但在单元测试本身的控制下提供准备好的答案。
将其扩展到神经网络示例,假设我们希望测试反向支撑算法。单元测试可以注入模拟网络,该模拟网络以特定方式提供与训练数据不同的输出,并且单元测试验证反向支持代码正确地修改正确的权重。通过这种方式,我们可以消除测试对网络行为的敏感性,从而仅隔离正在测试的反向支持代码。
专门用于测试面向用户的代码,通常的过程是进行集成测试,该测试使用特定UI(Qt或html或其他)的特殊知识与应用程序进行交互。这主要通过激发与特定功能相关联的UI事件,然后检查事件传播到模型层中的适当更改来实现