如何编写没有错误的程序
测试驱动开发如何帮助您避免错误
照片由Chris Ried在Unsplash上拍摄
在开发一个大程序的时候,难免会出现一些bug。您可能已经知道减少错误数量的最佳方法是为您的项目编写测试。在本文中,我将向您展示如何使用称为测试驱动开发的原则将其提升到一个新的水平。
顾名思义,测试驱动开发是在写下一些测试之后才开发程序的过程。在理解为什么这比在开发过程结束时编写测试更好之前,让我们看看它是如何工作的。
TDD 的工作原理
遵循 TDD 原则时,主要思想是分别开发每个新功能,一次一个。您可以将创建单个功能的工作分为 5 个不同的阶段:
编写测试:首先要做的是编写测试来检查您要创建的功能。运行所有测试:新测试应该失败,因为该功能尚未实现。此步骤用于检查是否需要新代码。此外,您确保其余代码(如果您之前创建了一些其他测试)按预期工作。实现特性:在这个阶段,不需要编写优雅的代码。您应该只关心通过编写尽可能少的代码行来实现功能。测试代码:现在所有的测试都应该通过了。您还可以检查以前的测试是否仍然有效(因此新代码没有引入错误)。重构:最后,您可以重写代码以提高效率和优雅。请记住在每次修改后检查您的测试是否仍然通过。
一旦一个功能已经完全开发出来,你可以再次从第 1 步开始进行下一步。每次实现程序的新部分时,您仍然应该运行之前编写的测试。通过这种方式,您可以确保您没有破坏旧代码。
现在我们已经了解了 TDD 是如何工作的,为什么要采用它呢?以下是使用测试驱动开发的主要优点(和缺点)。
临1.只写你需要的代码
斯科特·布莱克 ( Scott Blake ) 在Unsplash上拍摄的照片
在开发程序时,很容易被热情所吸引并重新开始使您的代码复杂化。但是,这很可能会在您的程序中引入许多错误。此外,您可能根本不需要此代码。这个想法可以概括为“你不需要它”的原则。
现在,考虑如果您在开始开发阶段之前编写测试会发生什么:一旦测试通过,您就知道您的代码是完整的。因此,您不太可能在程序中添加无用的功能(因此您的错误会更少)。
2.深入测试每个功能
罗伯特·拜在Unsplash上的照片
在开发代码之后编写测试的问题之一是您将受到代码编写方式的影响。这意味着您的测试将尝试检查代码是否按预期工作,而不是寻找意外的错误。所以更多的错误将仍然未被发现。
另一方面,在编写代码之前创建测试时,您不会对如何实现该功能有任何先入之见。这意味着将更彻底地检查代码。
3.更容易重构
照片由Sven Mieke在Unsplash上拍摄
使用 TDD 时,您知道代码完全被测试用例覆盖。这意味着如果重构引入了错误,您的测试将检测到它。
另一方面,在正常的程序开发中,您重构的代码可能会出现一些您认为原始代码中不可能出现的错误(因此您没有为它编写任何测试)。
因此,通过使用 TDD,您不必在每次重构后重新考虑您的测试:您可以只运行您最初编写的测试。
缺点1.耗时
照片由Agê Barros在Unsplash上拍摄
如果您没有很多时间,使用测试驱动开发可能不是最佳选择。事实上,在没有代码的情况下编写测试比您想象的要困难得多。
但是,您花在编写这些测试上的时间将得到补偿,因为您无需浪费时间寻找隐藏良好的错误。
2.学习曲线
照片由Element5 Digital在Unsplash上拍摄
在开发代码之前可能很难习惯于编写测试。学习如何有效地编写测试需要一些时间,但一段时间后,我可以向你保证,这将是值得的。
此外,在测试驱动开发中,重要的是您的测试涵盖代码的所有方面。否则,这只是浪费时间。所以你必须学会编写适量的测试。
结论
如您所见,使用 TDD 的好处大于坏处,这就是您应该立即开始采用它的原因。
如果您想了解有关测试驱动开发的更多信息,请查看以下资源:
维基百科上的 TDD测试驱动开发:通过示例 — Kent BeckTDD 的好处