需要很多辅助方法来帮助我的单元测试课 - 这是正常的吗?

时间:2011-05-01 23:23:56

标签: unit-testing nunit

我有一个通过WMI安装软件驱动程序的类。但是,我注意到在编写单元测试时,为了执行断言,我需要额外的辅助方法。例如。为了确保添加驱动程序,我需要确保驱动程序的数量增加了一个,这不是被测试类中的方法。

单元测试是正常的,还是我做错了什么?我将采用所有这些辅助方法并将它们提取到静态类。

由于

2 个答案:

答案 0 :(得分:7)

听起来你正在进行集成测试而不是单元测试,因为看起来你正在使用被测试类的真正依赖项(安装程序类)。在单元测试中,您将注入模拟或存根来模拟依赖项。

集成测试通常需要更多的单元测试设置,因为它们需要

  • 设置和断言任何先决条件,例如在运行测试之前未安装驱动程序。除极少数情况外,单元测试不需要测试前提条件。
  • 运行测试中的功能,例如安装。
  • 断言任何后置条件,例如司机号+ 1等

修改

我将为您提供单元,集成和端到端测试的定义,因为它可能与其他人的定义不同。无论我的定义如何,测试您可以安装产品的是非常有效测试。所以以下只是我(可能是错误的)观点。

单元测试

单元测试完全隔离,可以在没有任何外部依赖项的情况下运行,例如数据库,文件系统,外部Web服务,触发器(如cron作业)等。对象的所有对等项可以外化(模拟或存根),因此测试尽可能集中在测试被测试的类,而不是其依赖项。

集成测试

测试抽象外部资源的类。对我来说,集成测试非常注重单元测试,但需要外部(通常很慢)资源,并且可能因资源故障而失败。

端到端测试

使用应用程序界面练习功能的测试,以类似生产的模式配置。应用程序界面可能是桌面应用程序,Web UI,Web服务,串行端口等。此处的关键是测试涵盖所有组件如何交互在一起(协议)。这些通常是迄今为止最慢的测试。

我觉得你正在进行集成测试,因为你只测试执行安装的,但它可能是一个端到端的测试,取决于哪个<您正在使用的em> interface 。

一个例子

让我举一个我当前项目的例子。其中一项功能包括从视频文件中提取音频。为此,我调用了一个名为FFmpeg的命令行工具。为了能够测试代码,我将调用命令行的代码与不同类中的业务逻辑分开,这样我就可以通过传递模拟 AudioExtractor 。现在,音频提取器的测试是“集成测试”,因为我只测试该类,并且该类需要和外部资源将ffmpeg二进制文件安装在计算机上。

Audio Extracto测试有点复杂,因为它必须检查

  • 运行测试前的先决条件:
    • 测试视频文件存在。
    • 音频文件没有。
    • 二进制文件已安装且可执行。
  • 测试后的后置条件
    • 已创建音频文件
    • 音频文件有效
  • 在测试中撕下来
    • 必须删除音频文件。

我通过自定义hamcrest匹配器(最后是辅助类)进行大部分检查。哦,需要注意的是,如果其中一个前提条件失败,则并不意味着代码被破坏,而是测试无法运行,这是一个警告而不是错误。

我认为重要的是测试应该描述交互并保持在正确的抽象层次,这可能是你通过介绍帮助程序而做的。

答案 1 :(得分:0)

经验法则:如果难以编写单元测试,可能是您的设计出现问题。就像奥古斯托所说,你可能已经进入了集成测试领域。

考虑依赖注入。每种方法都应该做一件事......“做得好,只做”,正如罗伯特·马丁(又名鲍勃叔叔)在“清洁代码”中所说的那样。