我有一个通过WMI安装软件驱动程序的类。但是,我注意到在编写单元测试时,为了执行断言,我需要额外的辅助方法。例如。为了确保添加驱动程序,我需要确保驱动程序的数量增加了一个,这不是被测试类中的方法。
单元测试是正常的,还是我做错了什么?我将采用所有这些辅助方法并将它们提取到静态类。
由于
答案 0 :(得分:7)
听起来你正在进行集成测试而不是单元测试,因为看起来你正在使用被测试类的真正依赖项(安装程序类)。在单元测试中,您将注入模拟或存根来模拟依赖项。
集成测试通常需要更多的单元测试设置,因为它们需要
我将为您提供单元,集成和端到端测试的定义,因为它可能与其他人的定义不同。无论我的定义如何,测试您可以安装产品的是非常有效测试。所以以下只是我(可能是错误的)观点。
单元测试完全隔离,可以在没有任何外部依赖项的情况下运行,例如数据库,文件系统,外部Web服务,触发器(如cron作业)等。对象的所有对等项可以外化(模拟或存根),因此测试尽可能集中在仅测试被测试的类,而不是其依赖项。
测试抽象外部资源的类。对我来说,集成测试非常注重单元测试,但需要外部(通常很慢)资源,并且可能因资源故障而失败。
使用应用程序界面练习功能的测试,以类似生产的模式配置。应用程序界面可能是桌面应用程序,Web UI,Web服务,串行端口等。此处的关键是测试涵盖所有组件如何交互在一起(协议)。这些通常是迄今为止最慢的测试。
我觉得你正在进行集成测试,因为你只测试执行安装的类,但它可能是一个端到端的测试,取决于哪个<您正在使用的em> interface 。
让我举一个我当前项目的例子。其中一项功能包括从视频文件中提取音频。为此,我调用了一个名为FFmpeg的命令行工具。为了能够测试代码,我将调用命令行的代码与不同类中的业务逻辑分开,这样我就可以通过传递模拟 AudioExtractor 。现在,音频提取器的测试是“集成测试”,因为我只测试该类,并且该类需要和外部资源将ffmpeg二进制文件安装在计算机上。
Audio Extracto测试有点复杂,因为它必须检查
我通过自定义hamcrest匹配器(最后是辅助类)进行大部分检查。哦,需要注意的是,如果其中一个前提条件失败,则并不意味着代码被破坏,而是测试无法运行,这是一个警告而不是错误。
我认为重要的是测试应该描述交互并保持在正确的抽象层次,这可能是你通过介绍帮助程序而做的。
答案 1 :(得分:0)
考虑依赖注入。每种方法都应该做一件事......“做得好,只做”,正如罗伯特·马丁(又名鲍勃叔叔)在“清洁代码”中所说的那样。