你将如何使用TDD与神经网络或GUI应用程序?

问题描述:

我是新来的测试驱动开发,并试图理解基础知识。对于简单的方法,它看起来很简单,但假设我正在研究.txt文件的某些点并在图像上绘制它们。有没有一种方法可以测试,这是做我想要的,而不必实际检查它?或者,假设我必须测试一些非确定性的东西,比如神经网络,在其他情况下有时可以达到55%的准确率或82%。我如何测试这些?我意识到我可以测试更简单的方法,但仍然存在事情在其他地方打破的可能性。你将如何使用TDD与神经网络或GUI应用程序?

有几种策略可以用来处理您提出的每个问题。我将从最重要的开始,单元测试不应该用于验证应用程序域以外的事实。这意味着你不会单元测试第三方GUI库,也不会用它来验证数学理论是否为真。你不测试5 + 5实际上等于10,你只需要证明你的执行的加法提供了一些正确的结果。

所以你通常不会使用单元测试来显示你的神经网络如预期一样收敛。这种行为是已知的工作。你只需要证明你的代码实现了外部神经网络理论应用所需的约束和行为。

这一切归结到的是,确保你正在测试正确的东西。确保你只是单元测试单位。

下一个策略,特别是在您的应用程序中用于更高抽象层的策略是低于被测单元的替代层,并显示已知行为的特殊版本。这大致是模拟测试的想法。例如,当测试与数据库交互的东西时,通常不希望允许待测代码与真实数据库进行交互。一方面,数据库保留状态,你不希望在单元测试中测试,测试应该是原子性的和独立的。另一个问题是外部数据库可能会导致测试失败,原因是测试模块无法控制。

解决方案是注入一个错误的数据库层,它将对同一个API作为真实数据库作出响应,但是会在单元测试本身的控制下提供准备好的答案。

将其扩展到神经网络的例子,假设我们希望测试back-prop算法。单元测试可以注入一个模拟网络,以特定方式提供不同于训练数据的输出,并且单元测试将验证反向代码是否正确修改了正确的权重。这样我们可以消除测试对网络行为的敏感性,从而仅隔离正在测试的反向代码。

专门用于测试用户的代码,通常的过程是做集成测试,它使用特定的用户界面(Qt或HTML或其他)的特殊知识与应用程序进行交互。这主要是通过刺激与特定功能相关的UI事件,然后检查事件传播到模型层中的适当更改