如何改善对自己的代码的测试


12

今天,我检查了一些代码的更改,由于某些相当愚蠢但非常关键的操作,结果证明根本无法正常工作。我对此感到非常难过,希望最终能从中学到一些东西。愚蠢的事情是,我以前做过这些事情,而且我总是告诉自己,下次我不会变得如此愚蠢...然后再次发生,我对此感到更糟。

我知道您应该保持警惕,并从错误中吸取教训,但这就是问题:我努力提高自己,我只是看不到如何防止这些事情的发生。

所以,现在我要问你们:测试代码时,您是否有某些基本原则?


Answers:


17

在更改代码之前编写测试。

如果您建议的更改是修复错误,请首先通过演示该错误使测试失败。修复错误后,请确保它通过。如果您随后编写了测试,并且只通过了测试,那么您将无法确保首先正确地测试了该错误。

如果您建议的更改是更改现有功能或添加功能,请编写一些测试以确保对要更改的代码区域有良好的覆盖。在开始更改代码之前,请确保这些测试通过,并在完成后仍通过。


这确实是一个很好的建议,可能需要更长的时间才能修正错误,但是该死的确不会导致我再次犯此类错误,并且可以使我总体上编写更稳定的代码。
彼得

@Peter从长远来看应该可以节省维护时间。您应该需要花费更少的时间来手动进行烟雾测试修复,并且在下次编辑代码时将进行测试。有时,您甚至可能会发现,快速编写可重现该错误的单元测试可以使调试和修复该错误的速度更快。
Alb)

@Peter我经常发现自己在修复该错误时多次重现该错误。编写一个小型测试通常可以节省时间,更不用说您可以完全肯定它会起作用(并且将来会起作用)。
DasIch 2011年

这是一个很棒的建议伙伴,非常感谢!
Shaheer 2011年

@Alb甚至在短期内。

3

不要忘记测试边缘情况!许多错误是因为测试了最常见的操作而不是次要的操作。


恕我直言,真正的瑰宝在于发现这些极端情况。我常常对系统中出现的错误感到惊讶,只是因为我们没有想到特定的情况。
彼得

2

遵循技术指导中的技术建议;这是好东西。我的答案更多是关于态度。

对每个开发人员偶尔会犯的那种错误感到沮丧,这是荒谬的,并且不能帮助您将来不再犯这种错误。当您坐在那里时感觉很不好,但是构造仍然坏了,您知道吗?然后您的工作就是避免出错,我知道每天早上起床都是令人兴奋的冒险,对吧?

我听说过一些公司,检查破损的代码会引起公众羞辱。我什至无法避免那种会导致这种行为的扭曲、,脚的男孩,初中级思维。对于团队负责人或经理而言,几乎没有什么事与愿违的。

所以不要打自己。我们都做到了。我可能每周会花半天时间来解决一些愚蠢的错误,而且我已经(咳嗽)很长时间了。那就是编写代码的样子-您一直在不断地努力应对自己的不足之处。使专业人士成为职业的原因,不是永不犯错误(有时包括大错误)的神话般的品质,而是他们如何应对所犯的错误。

如果我可以向与我合作的每个开发人员灌输一种口头禅,那就是:您不是您的代码。您编写代码。您会尽可能高效地编写它。那你回家吧 如果您将自己的价值或自我价值与代码质量等同起来,那么您就迷失了真正的身份。


我明白你说的对公众的羞辱什么,但在同一时间,因为,因为李四没在检查之前建立的所有平台构建被打破被封锁它的令人沮丧的。
tenpn

@tenpn-完全是。但是我所说的话的另一面也适用于Joe Bloggs。他也不是他的代码。作为同事,我们必须抵制把乔变成白痴的冲动,因为乔犯了一个我们中任何人都可能犯的错误。
丹·雷

@tenpn实际上,您还可以责怪系统在将更改提交给主干/主服务器之前没有自动测试构建。
大卫,

2
@tenpn-都没有殴打您的同事。
丹·雷

1
如果更改不会中断构建怎么办?在签入之前构建代码是常识。以各种可能的方式测试代码并不是很明显。总有一些您无法拥有的场景。就在今天,我遇到了一个浮点舍入错误,该错误仅在您碰巧有正确(错误)数字时才会发生
Peter

2

另一个重要的测试实践是编写测试,并确保在编写代码之前至少测试一次失败。搞砸并编写一个重言式测试很容易,这偶然不测试您要检查的条件。错误的保证比没有保证几乎(有时更糟)。


0

我不时使用的一个想法是

创建一个分支并破坏您的代码,运行测试并确保测试捕获错误。


0

测试代码时,您是否有某些基本原则?

  • 始终对您的代码进行单元测试,并尝试达到尽可能高的覆盖率。

其他一些一般要点:

  • 在开始编写代码之前,花一些时间进行设计和规划
  • 重构您的代码!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.