10.4 动态指定要运行的测试用例
反复运行单个测试用例是日常开发中很常见的行为。例如,项目代码中有一个失败的测试用例,开发人员就会想要再次运行这个测试以获得详细的错误报告,在修复该测试的过程中,开发人员也会反复运行它,以确认修复代码是正确的。如果仅仅为了一个失败的测试用例而反复运行所有测试,未免太浪费时间了,当项目中测试的数目比较大的时候,这种浪费尤为明显。
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。例如,如果只想运行account-captcha的RandomGeneratorTest,就可以使用如下命令:
$mvn test-Dtest=RandomGeneratorTest
这里test参数的值是测试用例的类名,这行命令的效果就是只有RandomGeneratorTest这一个测试类得到运行。
maven-surefire-plugin的test参数还支持高级一些的赋值方式,能让用户更灵活地指定需要运行的测试用例。例如:
$mvn test-Dtest=Random*Test
星号可以匹配零个或多个字符,上述命令会运行项目中所有类名以Random开头、Test结尾的测试类。
除了星号匹配,还可以使用逗号指定多个测试用例:
$mvn test-Dtest=RandomGeneratorTest,AccountCaptchaServiceTest
该命令的test参数值是两个测试类名,它们之间用逗号隔开,其效果就是告诉Maven只运行这两个测试类。
当然,也可以结合使用星号和逗号。例如:
$mvn test-Dtest=Random*Test,AccountCaptchaServiceTest
需要注意的是,上述几种从命令行动态指定测试类的方法都应该只是临时使用,如果长时间只运行项目的某几个测试,那么测试就会慢慢失去其本来的意义。
test参数的值必须匹配一个或者多个测试类,如果maven-surefire-plugin找不到任何匹配的测试类,就会报错并导致构建失败。例如下面的命令没有匹配任何测试类:
$mvn test-Dtest
这样的命令会导致构建失败,输出如下:
[INFO] ---maven-surefire-plugin:2.4.3:test (default-test) @ account-captcha ---
[INFO] Surefire report directory: D:\code\ch -10 \account-aggregator\account-captcha
\target\surefire-reports
------------------------------------------------------------------------
T E S T S
------------------------------------------------------------------------
There are no tests to run.
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] -------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] -------------------------------------------------------------------
[INFO] Total time: 1.747s
[INFO] Finished at: Sun Mar 28 17:00:27 CST 2010
[INFO] Final Memory: 2M/5M
[INFO] -------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:
2.4.3:test (default-test) on project account-captcha: No tests were executed!
(Set-DfailIfNoTests = false to ignore this error.) - > [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
根据错误提示可以加上-DfailIfNoTests=false,告诉maven-surefire-plugin即使没有任何测试也不要报错:
$mvn test-Dtest-DfailIfNoTests=false
这样构建就能顺利执行完毕了。可以发现,实际上使用命令行参数-Dtest-DfailIfNoTests=false是另外一种跳过测试的方法。
我们看到,使用test参数用户可以从命令行灵活地指定要运行的测试类。可惜的是,maven-surefire-plugin并没有提供任何参数支持用户从命令行跳过指定的测试类,好在用户可以通过在POM中配置maven-surefire-plugin排除特定的测试类。