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_Testing - Fatal编程技术网

Unit testing 为什么要计算在单元测试中调用函数的次数

Unit testing 为什么要计算在单元测试中调用函数的次数,unit-testing,testing,Unit Testing,Testing,我的新同事不断地要求我在进行后端单元测试时计算单元测试中函数被调用的次数。我可以理解为什么它有时会有帮助,但在大多数情况下,我觉得它是多余和不必要的。在我看来,调用什么函数以及调用多少次都不重要。重要的是什么进入和出来检查预期的行为 单元测试应该更像一个黑匣子,因为它不在乎你如何得到答案,但重要的是答案是否正确。如果我总是验证一些函数被调用的次数,这会产生大量的开销。这也意味着每当我改变解决问题的方法时,我的单元测试就会中断,我每次都需要修复它。我觉得这种方法限制了程序员的灵活性 有人能告诉我为

我的新同事不断地要求我在进行后端单元测试时计算单元测试中函数被调用的次数。我可以理解为什么它有时会有帮助,但在大多数情况下,我觉得它是多余和不必要的。在我看来,调用什么函数以及调用多少次都不重要。重要的是什么进入和出来检查预期的行为

单元测试应该更像一个黑匣子,因为它不在乎你如何得到答案,但重要的是答案是否正确。如果我总是验证一些函数被调用的次数,这会产生大量的开销。这也意味着每当我改变解决问题的方法时,我的单元测试就会中断,我每次都需要修复它。我觉得这种方法限制了程序员的灵活性

有人能告诉我为什么要进行这种单元测试吗?多谢各位


更具体地说,代码是用java编写的,结构概述如下:控制器处理api调用并调用相关facade,后者反过来调用服务来获取数据。facade是服务的组合,服务与数据库对话。这些“单元测试”需要对所有三层进行。检查控制器中每个外观被调用的次数。并检查facade中的每个服务是否被调用,以及被调用的次数。

考虑使用以下方法

public void ChargeCreditCard(string cardNumber, decimal amount)
如果信用卡被充值一次或多次,这很重要,对吗

我通常总是测试一个方法被调用的次数。首先,它以某种方式保证该方法不会被意外调用多少次。 至于这种检查会增加额外开销的说法,这并不完全正确。如果您在设计代码和测试时使用了良好的实践,那么测试这种东西应该非常容易。此外,大多数模拟框架都提供这种开箱即用的测试

有人能告诉我为什么要进行这种单元测试吗

一般来说,它不应该这样做。函数被调用的次数是私有实现细节。单元测试测试单元的公共行为,而不是它的私有实现

与每个常规语句一样,也有例外:调用方法的次数对于断言组件的功能是否正确可能很有价值。例如,我曾经构建了一个缓存系统,您可以在其中将缓存放入管道并检查其是否正常工作,不仅管道仍然可以提供正确的结果,而且生产者方法应该只为输入调用一次。如果多次调用,则缓存的实现出现问题


但正如我所说,这是一个合理的例外。一般来说,一个方法被调用多少次并不是一个测试标准。

我认为重要的一点是,最终只有一次向卡收费。。。如果这是通过调用该方法42次实现的,那么这就是一个实现细节。什么是实现细节?您在编写单元测试的其他类中调用了此方法。所以,当为特定类编写测试时,测试这个方法是否被调用一次(或任意次数)是非常重要的?重要的是要测试,只有实际收取的金额。代码中的函数被调用了多少次并不重要。如果多次打电话给他们会多次向帐户收费,那么通过检查正确的收费金额,您已经可以支付这些费用。如果我们谈论的是集成测试,是的,您是对的。但我的印象是,这里是关于单元测试的,因此,当我们测试ChargeCreditCard的调用方时,我们只测试该方法实际上被调用了x次。我们甚至根本不在乎这个方法做什么,这正是重点。您要验证备用帐户是否实际收取了X金额。这是集成\QA测试。对于单元测试,对于我(作为开发人员)来说,模拟这个方法并验证它被调用了1次是很重要的。在这种情况下,我不在乎过期账:)总的来说,我并不是说你错了,我们只是对这个问题有不同的想法。问题的答案有点离奇,答案不止一个。干杯