Testing 如何为实时应用程序执行TDD

Testing 如何为实时应用程序执行TDD,testing,tdd,real-time,Testing,Tdd,Real Time,我一直在研究测试驱动开发的学科,对我来说,它在实现算法和输入输出系统方面非常有效 因此,据我所知,TDD的“本质”是为应用程序的每个需求编写测试。通常,该需求定义了具有输入和输出的行为 所以,现在。转到实时应用程序。假设您的应用程序运行一个无限循环。一个常见的例子是图形应用程序或音频应用程序,其中循环的每次迭代意味着输出到屏幕/扬声器 有了这样一个系统,我们可以说需求是这样的: 按下“回车”按钮时,屏幕应显示一个圆圈,圆圈内有文字“Hello World” 那么,您将如何测试这种需求 另一个例子

我一直在研究测试驱动开发的学科,对我来说,它在实现算法和输入输出系统方面非常有效

因此,据我所知,TDD的“本质”是为应用程序的每个需求编写测试。通常,该需求定义了具有输入和输出的行为

所以,现在。转到实时应用程序。假设您的应用程序运行一个无限循环。一个常见的例子是图形应用程序或音频应用程序,其中循环的每次迭代意味着输出到屏幕/扬声器

有了这样一个系统,我们可以说需求是这样的: 按下“回车”按钮时,屏幕应显示一个圆圈,圆圈内有文字“Hello World”

那么,您将如何测试这种需求

另一个例子,只是为了更好地说明我的问题。 假设我正在模拟CPU。在每次迭代中,我从文件中提取一个操作码,翻译并执行它。基本上没有实际产出。发生的情况是,输入改变了与CPU仿真相关的一些状态。因此CPU内部没有公共接口

我的要求是“在cpu仿真器上实现mov操作” 这可能是更大的要求“实现操作码仿真”的一部分

所以。使用TDD解决这种行为/需求的好方法是什么

使用TDD解决这种行为/需求的好方法是什么

我通常看到的是设计分成两部分

  • 这是一件复杂但真正“容易”测试的作品
  • 一件很难测试但很“简单”的作品
基本上,您正在安排“风险”主要存在于易于测试的代码中

代码的一个非常简单的特性是:它往往非常稳定。低风险、稳定和难以测试的组合意味着在这里投资测试自动化的吸引力较低

基本上没有实际产出

写一个无操作;做任何没有某种明显副作用的工作都没有好处

我们通常关注输出的中间阶段。例如,如果我们要从说话人身上产生一个音调,那么我们在代码中可能要做的就是在选择音调的工作和向说话人传递音调表示的实际机制之间创建一个接缝。在该接缝处,我们还捕获信息以便检查

因此CPU内部没有公共接口

具有测试接口通常是令人满意的结果。通常,您希望发布测试接口,以满足监视或可观察性需求

公共接口太宽,无法测试单一行为

是的,这很常见。通常的反应是将您的广泛可测试模块重构为几个,甚至许多,狭窄的可测试模块。复习


考虑一下公共方法(可在模块外访问)和(可由您无法控制的代码访问)之间的区别也可能会有所帮助。

如何手动测试此类应用程序?@Fabio对于emulator案例,这意味着运行一个测试rom;正好包含我们要测试的指令的整个rom。最后,断言是可视的。您可以直观地断言rom是否显示了您所期望的内容。我想不出一种真正自动化的方法,但听起来类似于验收测试。你能详细说明你的第一点吗?我主要担心的是,有一些稳定的代码片段(需求)在未来不会改变行为,我想测试它们的开发,这样我就可以重构/优化它们,但只有在它们工作之后。问题是大部分代码都是“内部”代码。公共接口是测试单一行为的一种方式。不过,测试界面听起来很有趣(只有当我将所有内容都设置为“受保护”时??)