Unit testing 比可测试代码大2-3倍的测试

Unit testing 比可测试代码大2-3倍的测试,unit-testing,language-agnostic,Unit Testing,Language Agnostic,测试比被测试的实际代码大很多,这正常吗?对于我正在测试的每一行代码,在单元测试中通常有2-3行代码。这最终会导致大量的时间花在输入测试上(mock、mock和mock more) 节省的时间在哪里?你是否曾经避免过对那些琐碎的代码进行测试?我的大多数方法都不到10行,测试每一个方法都需要很多时间,正如你所看到的,我开始质疑大多数测试的编写 我不提倡单元测试,我喜欢它。只想看看人们在写测试前会考虑哪些因素。它们是有代价的(从时间上来说,因此是金钱上的),所以必须以某种方式对这种代价进行评估。如果有

测试比被测试的实际代码大很多,这正常吗?对于我正在测试的每一行代码,在单元测试中通常有2-3行代码。这最终会导致大量的时间花在输入测试上(mock、mock和mock more)

节省的时间在哪里?你是否曾经避免过对那些琐碎的代码进行测试?我的大多数方法都不到10行,测试每一个方法都需要很多时间,正如你所看到的,我开始质疑大多数测试的编写

我不提倡单元测试,我喜欢它。只想看看人们在写测试前会考虑哪些因素。它们是有代价的(从时间上来说,因此是金钱上的),所以必须以某种方式对这种代价进行评估。如果有,您如何估计单元测试所带来的节约

这是一种折衷方案,更多的测试可以确保稳定性。通过稳定性,它不仅意味着被测代码更无错误、更简单,还保证了程序在未来的任何情况下都不会崩溃。无论您如何疯狂地将参数传递给一个方法,代码块都会正确返回(当然,在需要时会有适当的错误消息)

更重要的是,您甚至可以在了解被测方法的内部操作之前编写单元测试用例。这就像一个黑盒场景,在这个场景中,您将首先完成测试用例的编写,然后开始编码。最大的优点是,通过并行运行测试用例,开发工作将在更少的迭代中变得无错误


测试代码的大小根本不重要。重要的是单元测试的全面性和覆盖范围。无论它只是测试同名代码还是处理所有可能情况的严肃测试用例。

是的,测试的loc可能比您正在测试的实际代码多,但考虑到您在调试代码时节省的时间,这是完全值得的

不必每次进行更改时都手工测试整个应用程序/库,您可以依赖您的testsuite,如果它失败,您可以获得比“它不工作”更准确的关于它在哪里损坏的信息

关于避免测试:如果不测试代码的某些部分,实际上是在破坏测试的整体概念和目的,那么测试实际上是毫无用处的


但是,您不需要测试您没有编写的内容。也就是说,您假设外部库工作正常,并且生成的getter/setter方法(如果您的语言支持这些方法)也不必测试。假设它在为变量赋值时不会失败是非常安全的。

您可能测试了错误的东西-您不应该对代码中的每个方法都进行不同的测试

您可能有太多的测试,因为您测试的是实现,而不是功能—请尝试测试如何完成测试完成了什么

例如,如果您有一个客户有权在每个订单上获得折扣,请使用正确的数据创建一个客户,并为该客户创建一个订单,然后确保最终价格是正确的。通过这种方式,您实际上可以测试业务逻辑,而不是测试它是如何在内部完成的

大型测试的另一个原因是缺乏隔离(也称为模拟),如果您需要初始化需要大量代码的困难对象,请尝试使用伪造/模拟


最后,如果您有复杂的测试,这可能是一种气味——如果您需要编写大量代码来测试简单的功能,这可能意味着您的代码是紧密耦合的,并且您的API不够清晰。

测试应该是找到正确的平衡,这取决于许多不同的因素,例如:

  • 商业目的(想想“起搏器控制器”和“电影库存管理器”)
  • 发展工作人员的技能
  • 员工流动率(人员添加到开发人员池的频率)
  • 复杂性(软件的复杂性,与上述“业务目的”相关)

我通常只为“公共API”编写测试,因此只隐式测试用于交付公共功能的任何程序集内部类。但是,随着您对可靠性和再现性的需求的增加,您还应该添加额外的测试。

单元测试代码应该遵循与生产代码相同的最佳实践。如果您有那么多的单元测试代码,那么它就有一种违反DRY原则的味道


重构要使用的单元测试应该有助于减少整体单元测试占用空间。

当我编写测试或进行TDD时,其中一个指导我的事情(顺便说一句,我从对我的一个问题的回答中学到了这一点)您不必对测试的设计/架构像对实际代码那样谨慎。只要测试工作做得正确,测试可能会有点脏且不太理想(代码设计方面)。就像所有关于设计的建议一样,要明智地运用,经验是无法替代的。

这是一个非常有效的好问题。我在需要时遵循简单的原则

  • 为我们知道的问题设置类别(关键、高、低)
  • 看看我们有多少时间,然后通过内部讨论重新安排
  • 确定优先事项
  • 然后解决问题

  • 虽然所有这些都需要相当长的时间,但只要我们记住输出应该是好的,并且没有bug,并且我们坚持以上的原则,事情就会顺利进行。

    这通常是正确的。找出这是好事还是坏事的关键是找出测试规模更大的原因

    有时它们更大只是因为有很多测试用例要覆盖,或者规范很复杂,但是实现规范的代码没有那么长

    也要考虑时间。