Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 太多的端到端测试?_Unit Testing_Automated Tests_Integration Testing_End To End - Fatal编程技术网

Unit testing 太多的端到端测试?

Unit testing 太多的端到端测试?,unit-testing,automated-tests,integration-testing,end-to-end,Unit Testing,Automated Tests,Integration Testing,End To End,我对整个情况感到非常沮丧,原因如下: 我继承了一个完全未经测试的遗留系统,用于保持许多不同的客户机数据库和一个主数据库(具有不同的模式)同步。当系统交给我时,它只是部分完成,有许多缺陷使它无法正常工作约90%的时间 该系统还允许六种不同类型的同步,每种类型同步不同(有时重叠)的表,因为数据库可能相当大,因此客户端可以首先根据其状态对最重要的表进行优先级排序 我从几个端到端测试开始,在本地设置一个主数据库和几个客户端数据库,其中包含某些数据,然后调用不同的同步方法,并验证正确的数据以正确的格式显示

我对整个情况感到非常沮丧,原因如下:

我继承了一个完全未经测试的遗留系统,用于保持许多不同的客户机数据库和一个主数据库(具有不同的模式)同步。当系统交给我时,它只是部分完成,有许多缺陷使它无法正常工作约90%的时间

该系统还允许六种不同类型的同步,每种类型同步不同(有时重叠)的表,因为数据库可能相当大,因此客户端可以首先根据其状态对最重要的表进行优先级排序

我从几个端到端测试开始,在本地设置一个主数据库和几个客户端数据库,其中包含某些数据,然后调用不同的同步方法,并验证正确的数据以正确的格式显示在正确的数据库中

我的时间紧迫,因为这个系统至少有一百种不同的方式可以将数据从一个数据库移动到另一个数据库,而且只有几千行代码,所以我一直在做越来越多的端到端测试,基本上是在我接管项目时存在的每个缺陷1-2个。我完成了16个单元测试(TDD来自我添加的代码)和113个端到端测试,其中许多测试直接基于以前的缺陷

我完成了这个系统,它已经投入生产几个月了,没有发生任何事故

最近,我们决定将客户机数据库转换为一个新的数据库,当我使用新数据库运行测试时(这段时间一直在CI服务器上每晚运行),113个测试中大约有100个失败。(当然,单元测试都通过了)

我一直在修复失败的端到端测试,坦率地说,大多数测试都因为一两个简单的原因失败(比如新的数据库舍入日期不同),但我对我的测试如此脆弱感到沮丧。虽然他们正确地失败了,但我只需要一两个人来告诉我,而不是100个人问题是,没有那么多代码需要进行单元测试,因为大多数代码只是根据日期从一个表中选择数据,然后从另一个数据库中选择相同的数据,合并这两个数据,然后适当地插入/更新

如果没有这些测试,我是不可能完成这个系统的,但是维护这些测试的痛苦基本上导致了我的问题:有什么建议我应该如何继续/或者我可以做得更好吗?我第一次写这些端到端测试时是否浪费了太多时间?我读过《有效地利用遗产》一书
代码,但我觉得除了“重构并编写更多的单元测试”之外,对于我所感受到的痛苦,这里并没有一个很好的答案对于这个系统的独特性,我觉得这不是一个很好的选择,因为它只有很少的代码和大量的数据库转换。

您可以创建数据库代理类,确保它们是唯一与真实数据库对话的类。使用依赖注入对所有逻辑代码进行单元测试,而无需与实际数据库对话。创建尽可能少的端到端测试,以确保代理可以正确地读/写数据库

端到端测试通常是脆弱的。所以尽可能少地创建它们,如果您需要创建很多,您可以创建一个抽象层来设置装置和断言测试用例中的复制与代码中的复制一样难以维护

有效地使用遗留代码是一个良好的开端,我推荐xUnit测试模式,它基本上是单元测试的圣经,提供了很多好的建议,包括关于数据库测试的一节

编辑:TDD是关于隔离逻辑的。我的意思是控制流语句,正则表达式,算法,数学,应该在你的代理之外,你可以很容易地对它们进行单元测试。你有113个测试,这让我怀疑有逻辑可以提取和单元测试

如果要创建SQL命令,可以使用
Builder
模式验证命令是否正确创建,如果需要更改SQL方言,则只有一个地方可以进行更改


使代码可测试可能意味着您需要积极地重构。困难的部分将是根据项目的重要性和寿命来确定它的价值。

我实际上已经阅读了xUnit测试模式,尽管当时我没有遇到这个问题,也许重新阅读会对我有好处!我面临的问题是,这个项目中约80%的代码都在构建sql以进行选择、重新插入或更新。您是否建议我编写单元测试来验证数据库代理是否从代码中获取了所有正确的sql命令?或者干脆忽略这些部分,让少数端到端测试捕捉到它们,而单元测试只是合并的部分?我认为,试图以书面形式解释我的问题,然后阅读更新后的回复,确实有助于它点击到位。尽管这个系统很小,并且严重依赖于多个数据库,但我可以利用我已经做过的事情来进行您建议的那些积极的重构,如果没有其他事情的话,还可以进行更好的设计。经过认真的思考,我认为你是对的,虽然这可能会很痛苦,但从长远来看,尽可能多地进行单元测试确实会更好,而且目前端到端的测试可能有一半可以如此移动。谢谢