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排除特定的测试类。