Unit testing 有什么事情是你可以做的吗';应用TDD时的t检验

Unit testing 有什么事情是你可以做的吗';应用TDD时的t检验,unit-testing,tdd,integration-testing,Unit Testing,Tdd,Integration Testing,我一直在将TDD应用到一些新项目中,以了解问题的症结所在,我了解基本流程:编写失败的测试,编写代码以通过测试,如果需要重构,重复 为了保持测试的快速性和解耦性,我将网络请求和文件I/O之类的东西抽象出来。这些东西通常被抽象成接口,通过依赖注入来传递 通常开发是非常顺利的,直到我意识到我需要实现这些抽象接口为止。抽象它们的全部目的是使其易于测试,但是在TDD之后,我需要在编写实现代码之前编写一个测试,对吗 例如,我正在看tdd俄罗斯方块教程。如果我想添加使用键盘的功能,我会将基本控件抽象为控制器类

我一直在将TDD应用到一些新项目中,以了解问题的症结所在,我了解基本流程:编写失败的测试,编写代码以通过测试,如果需要重构,重复

为了保持测试的快速性和解耦性,我将网络请求和文件I/O之类的东西抽象出来。这些东西通常被抽象成接口,通过依赖注入来传递

通常开发是非常顺利的,直到我意识到我需要实现这些抽象接口为止。抽象它们的全部目的是使其易于测试,但是在TDD之后,我需要在编写实现代码之前编写一个测试,对吗

例如,我正在看tdd俄罗斯方块教程。如果我想添加使用键盘的功能,我会将基本控件抽象为控制器类内的方法,如“rotateBlock”、“moveLeft”等,这些方法可以进行测试

但在最后,我需要添加一些逻辑,以便在实现控制器类时检测键盘上的击键。如何编写测试来实现这一点


也许有些东西就是无法测试,而在某些情况下达到100%的代码覆盖率是不可能的?

您不能用TDD单元测试来测试所有东西。但是如果您也有集成测试,那么您可以测试这些I/O接口。您可以使用TDD生成集成测试

在实践中,自动测试有些东西是不切实际的。一些罕见的错误情况或比赛危险的错误处理是最困难的

也许有些东西就是无法测试,在某些情况下达到100%的代码覆盖率是不可能的

我使用了一种稍微不同的拼写:并非所有的东西都可以在相同的成本效益水平上进行测试

可以说,“诀窍”是将代码分为两类:易于测试的代码和显而易见的不需要测试的代码——或者不需要经常测试的代码

简单适配器的好处是(一旦您让它们工作起来),它们通常不需要太多更改。所有的逻辑都存在于其他地方,而在其他地方很容易测试

例如,考虑从文件中读取字节。这种接口看起来有点像一个函数,它接受一个文件名作为参数,或者返回一个字节数组,或者返回某种异常。实现这一点在大多数语言中都是一个简单的练习,代码对教科书非常熟悉,因此它显然属于“非常简单,显然没有缺陷”的范畴

因为代码简单且稳定,所以您不需要以您经常重构的测试代码的频率对其进行测试。因此,成本效益分析支持这样的结论,即您可以将此代码的偶尔测试委托给更昂贵的技术

100%的声明覆盖率从来都不是TDD的目标(尽管很容易理解你和一小撮其他人是如何得出这个结论的)。这主要是关于推迟详细设计。因此,从某种程度上说,一开始就很简单,很少更改的代码是“出界”的