dev*_*ium 20 c# java tdd unit-testing
我目前有10个测试,只要路径或墙上有一块,我的俄罗斯方块片就不会向左移动.现在,我将不得不为正确的运动测试相同的行为.
如果我只是复制我已经拥有的左移动的10个测试并且只进行所需的更改并对代码本身也做同样的事情,这太糟糕了吗?或者,如果逻辑基本相同,我应该从头开始再进行每次测试吗?
Rob*_*Rob 30
尝试采用您未提及的第3种方法,即重构代码,以便您可以在所有10个测试之间共享测试的一个实现.
问题是,复制代码几乎总是错误的.在此示例中,您可以将检查代码重构为一个名为的方法IsTetrisPieceUnableToMoveLeftBecauseOfAPieceOrAWall.在为单元测试编写一些"共享"功能时,我总是寻找非常具有描述性的方法名称,因为它使得它非常清楚正在进行/测试的内容.
ewe*_*nli 27
我对这个问题有一点争议.虽然在生产代码中必须尽可能避免代码重复,但这对于测试代码来说并不是那么糟糕.生产和测试代码的性质和意图不同:
生产代码可以提供一些复杂性以便可理解/可维护.您希望代码处于正确的抽象级别,并使设计保持一致.这是好的,因为你有测试,你可以确保它的工作.如果您在逻辑级别实际拥有100%的代码覆盖率,则生产代码中的代码重复不会成为问题.这实际上很难实现,因此规则是:避免重复并最大化代码覆盖率.
另一方面,测试代码必须尽可能简单.您必须确保测试代码实际测试它应该是什么.如果测试很复杂,你可能会在测试或错误测试中遇到错误 - 而且你没有测试测试,所以规则是:保持简单.如果测试代码是重复的,那么当它发生变化时,这不是一个大问题.如果更改仅在一次测试中应用,则另一次测试将失败,直到您修复它为止.
我想说的主要观点是生产和测试代码具有不同的性质.然后它总是一个常识问题,我不是说你不应该考虑测试代码,等等.如果你可以在测试代码中考虑一些因素并且你确定它没问题,那就去做吧.但是对于测试代码,我更喜欢简单而不是优雅,而对于生产代码,我更喜欢优雅而不是简单.最佳的当然是拥有一个简单,优雅的解决方案:)
PS:如果你真的不同意,请发表评论.
复制粘贴没有问题,这是一个很好的起点.事实上,它比从头开始更好,就好像你有工作代码(无论是测试还是其他),然后复制粘贴比从头开始更可靠,也更快.
然而,这只是第1步.第2步是重构共性,第1步只是为了帮助你看到这种共性.如果您已经可以在没有复制的情况下清楚地看到它(有时它更容易先复制然后检查,有时它不是,并且它取决于执行此操作的人),然后跳过步骤1.
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |