Gradle构建Java程序:Junit集成

Build文件

build.gradle如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apply plugin: 'java'

repositories {
mavenCentral()
}

dependencies {
testCompile 'junit:junit:4.12'
}

jar {
manifest {
attributes 'Main-Class': 'com.shizhihua.example.Calculator'
}
}

上述配置指定仓库后,不需要额外再安装Junit4了。

Java文件

Calculator.java

1
2
3
4
5
6
7
8
9
10
package com.shizhihua.example;

public class Calculator {
public int evaluate(String expression) {
int sum = 0;
for (String summand: expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}

测试文件

CalculatorTest.java

  • 测试文件和类是在被测类名后添加Test
  • @Test表示需要运行的测试函数
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.shizhihua.example;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
@Test
public void evaluatesExpression() {
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
}
}

项目结构

为了Gradle,项目结构需要按照下面约定。注意被测的源java文件和测试例的java文件目录相对应:

  • src/main/java目录包含项目源代码
  • src/main/resources目录包含项目的资源
  • src/test/java目录包含项目测试类
  • src/test/resource目录包含项目测试资源

执行测试:

1
gradle test

运行上述命令后,整个项目的目录结构如下:

打开上述index.html可以看到测试结果的统计报告。

设置多进程

当项目中的测试例过多,需要通过并行的方法来加快运行速度。但是,如果每个unit test都需要自己独立的JVM,则系统overhead消耗大。Gradle采用了一种这种方法:设定maxParallelForks,限定最大的并发JVMs。

如果一个JVM不断运行unit test,可能会引起性能问题(e.g.,leak)。Gradle设定forkEvery,使得一个test-running JVM运行完设定的test数目后会结束,并启动一个新的test-running JVM来替代。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apply plugin: 'java'

repositories {
mavenCentral()
}

dependencies {
testCompile 'junit:junit:4.12'
}

jar {
manifest {
attributes 'Main-Class': 'com.shizhihua.example.Calculator'
}
}

test {
maxParallelForks = 5
forkEvery = 50
}