单元测试时不应该测试什么?

在项目的哪些部分编写单元测试几乎或实际上是不可能的?数据访问? ftp?

如果这个问题有答案,那么 0 覆盖率就是一个神话,不是吗?

请先 登录 后评论
本文连接: http://www.china-sunrider.com.cn/question/11198
source: https://stackoverflow.com/questions/109432

10 个回答

Garry Shutler

可以进行数据访问,因为您可以设置测试数据库。

一般来说,“不可测试”的东西是 FTP、电子邮件等。但是,它们通常是您可以依赖的框架类,因此不需要测试是否将它们隐藏在抽象后面。

此外,100% 的代码覆盖率本身还不够。

请先 登录 后评论
Rob Walker

如果设置单元测试所需状态的代码变得比要测试的代码复杂得多,我倾向于划清界限,并找到另一种方法来测试功能。那时你必须问你如何知道单元测试是正确的!

请先 登录 后评论
Kevin Little

100% 的覆盖率是一个神话,事实确实如此,但这并不意味着 80% 的覆盖率毫无用处。当然,目标是 100%,在单元测试和集成测试之间,您可以接近它。

单元测试中不可能的是预测所有完全奇怪的事情您的客户会对产品做出什么反应。一旦您开始发现代码中这些令人难以置信的变态,请确保将它们的测试重新放入测试套件中。

请先 登录 后评论
EricSchaefer

任何需要非常大且复杂的设置的东西。当然你可以测试ftp(客户端),但是你需要设置一个ftp服务器。对于单元测试,您需要可重复的测试设置。如果您不能提供,则无法测试。

请先 登录 后评论
Aaron Jensen

实现 100% 的代码覆盖率几乎总是浪费。有很多这方面的资源。

没有什么是不可能进行单元测试的,但回报总是递减的。对单元测试来说很痛苦的事情进行单元测试可能不值得。

请先 登录 后评论
p3t0r

@GarryShutler

我实际上使用一个假的 smtp 服务器(Wiser)来对电子邮件进行单元测试。确保您的应用程序代码正确:

http:// maas-frensch.com/peter/2007/08/29/unittesting-e-mail-sending-using-spring/

类似的事情可能可以为其他服务器完成。否则你应该能够模拟 API...

顺便说一句:100% 覆盖率只是开始...仅意味着所有代码实际上已执行一次....与边缘情况等无关。

请先 登录 后评论
Horcrux7

FTP、电子邮件等可以通过服务器模拟进行测试。这很难,但也是可能的。

一些错误处理无法测试。每个代码中都有永远不会发生的错误处理。例如,在Java中,必须捕获许多异常,因为它是接口的一部分。但使用过的实例永远不会抛出它。或者如果对于所有可能的情况都存在 case 块,则为 switch 的默认情况。

当然,一些不需要的错误处理是可以删除的。但如果将来出现编码错误,那就不好了。

请先 登录 后评论
quamrana

什么是你不会测试的?任何不可能损坏的东西。

当谈到代码覆盖率时,您希望实际编写的代码达到 100% - 也就是说,您不需要测试第三方库代码或操作系统代码,因为这些代码已交付给您进行测试。除非不是。在这种情况下,您可能想测试一下。或者,如果存在已知错误,在这种情况下您可能需要测试这些错误是否存在,以便在修复这些错误时收到通知。

请先 登录 后评论
Mo.

大多数需要大量且昂贵(资源或计算时间成本)设置的测试都是集成测试。单元测试(理论上)应该只测试代码的小单元。单独的功能。

例如,如果您正在测试电子邮件功能,那么创建一个模拟邮件程序是有意义的。该模拟的目的是确保您的代码正确调用邮件程序。查看您的应用程序是否真正发送邮件是一个集成测试。

区分单元测试和集成测试非常有用。单元测试应该运行得非常快。在签入代码之前应该可以轻松运行所有单元测试。

但是,如果您的测试套件包含许多集成测试(设置和拆除数据库等),则您的测试运行很容易超过半小时。在这种情况下,开发人员很可能在签入之前不会运行所有单元测试。

因此,回答您的问题:进行网络单元测试,最好将其作为集成测试来实现(并且不要测试 getter/setter - 这是浪费时间;-) )。

请先 登录 后评论
Kris

首先对代码进行单元测试的主要原因是验证代码的设计。获得 100% 的代码覆盖率是可能的,但如果不使用模拟对象或某种形式的隔离或依赖注入,则无法实现。

请记住,单元测试不是针对用户的,而是针对开发人员和构建系统的,用于在发布之前验证系统。为此,单元测试应该运行得非常快,并且配置和依赖摩擦尽可能少。尝试在内存中尽可能多地进行操作,并避免使用测试中的网络连接。

请先 登录 后评论
user contributions licensed under CC BY-SA.