Java用JUnit进行单元测试

jikexue 8年前
   <p>单元测试应该是开发人员必备的技能,但又是开发人员最容易忽略的内容。我是一个Android Coder,接下来从零开始学习使用JUnit进行单元测试。</p>    <h2><strong>1 最原始的写法</strong></h2>    <h3><strong>1.1 准备</strong></h3>    <p>创建一个文件夹作为工作文件夹。</p>    <h3><strong>1.2 下载</strong></h3>    <p>这里我们需要下载两个东西:</p>    <p>junit.jar</p>    <p>hamcrest-core.jar</p>    <p>我这里下载了4.12版本的JUnit和1.3版本的hamcrest。下载完成之后,拷贝到工作文件夹。</p>    <h3><strong>1.3 编写Java类</strong></h3>    <p>在工作文件夹创建编写Java类。</p>    <pre>  <code class="language-java">import java.lang.String;  import java.lang.Integer;    public class Calculate{        public int evaluate(String expression) {          int sum = 0;          for (String summand: expression.split("\\+"))              sum += Integer.valueOf(summand);          return sum;      }    }</code></pre>    <p>然后通过Java命令行编译该类:</p>    <p>javac Calculate.java</p>    <h3><strong>1.4 编写测试类</strong></h3>    <p>在工作文件夹创建编写测试类</p>    <pre>  <code class="language-java">import static org.junit.Assert.assertEquals;  import org.junit.Test;      public class CalculateTest {      @Test      public void evaluatesExpression() {          Calculate calculate = new Calculate();          int sum = calculate.evaluate("1+2+3");          assertEquals(6, sum);      }  }</code></pre>    <p>然后使用命令行编译该类:</p>    <p>javac -cp .:junit-4.12.jar CalculateTest.java</p>    <h3><strong>1.5 运行测试</strong></h3>    <p>使用命令行:</p>    <p>java -cp .:junit-4.12.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculateTest</p>    <p>结果:</p>    <pre>  <code class="language-java">JUnit version 4.12  .  Time: 0.004    OK (1 test)</code></pre>    <h3><strong>1.6 测试失败的情况</strong></h3>    <p>更改Java类为:</p>    <pre>  <code class="language-java">import java.lang.String;  import java.lang.Integer;    public class Calculate{        public int evaluate(String expression) {          int sum = 0;          for (String summand: expression.split("\\+"))              sum -= Integer.valueOf(summand); //这里改为-          return sum;      }    }</code></pre>    <p>重新编译,运行测试。结果:</p>    <pre>  <code class="language-java">JUnit version 4.12  .E  Time: 0.009  There was 1 failure:  1) evaluatesExpression(CalculateTest)  java.lang.AssertionError: expected:<6> but was:<-6>      at org.junit.Assert.fail(Assert.java:88)      at org.junit.Assert.failNotEquals(Assert.java:834)      ……  FAILURES!!!  Tests run: 1,  Failures: 1</code></pre>    <p>最基础的用法完成Java的单元测试。我们进行单元测试肯定不会这么麻烦。但是要知道,我们使用任何框架或者编辑器,他们在背后做的事情大概也就是这些。那接下来,仍然手工来做一个使用Gradle构建的Java工程的测试写法。</p>    <h2><strong>2 对使用Gradle构建的Java项目进行单元测试</strong></h2>    <h3><strong>2.1 使用Gradle构建Java工程</strong></h3>    <p>估计,即使是使用过Gradle构建的人,也很少有人手动使用grad</p>    <h3><strong>2.1.1 准备</strong></h3>    <p>仍然是创建一个文件夹作为我们的工程文件夹。</p>    <p><strong>2.1.2 创建build.gradle文件</strong></p>    <p>在这个文件夹下面创建一个build.gradle文件,内容:</p>    <p>apply plugin: 'java'</p>    <p><strong>2.1.3 创建Java工程结构并编写代码</strong></p>    <p>然后在工程文件夹下创建Java工程结构,并在src/main/java下创建一个文件,Calculator文件。PS:我创建的工程文件夹叫Gradle。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/aa5603876ebe870cb2d20e212709a01b.png"></p>    <p>Calculator.java</p>    <pre>  <code class="language-java">import java.lang.String;    public class Calculator{        public int add(int a, int b){          return a + b ;       }        public static void main(String[] args) {          Calculator calculator = new Calculator() ;           int result = calculator.add(1,2) ;           System.out.println(String.valueOf(result));      }  }</code></pre>    <h3><strong>2.1.4 使用gradle构建工程</strong></h3>    <p>在工程文件夹下使用命令行gradle build构建工程。</p>    <p>gradle build</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f5fbba12744b670ece11361e5e24c270.png"></p>    <p>然后查看工程文件夹:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7ee1de2b695fa8c013652c5ddc48f526.png"></p>    <p>我们可以看到多出了build文件夹,这个就是使用gradle构建出的内容。我们可以看到有class和jar文件。那么我们去运行一下试一试。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/5cdf23622cda7ad50eeb0d406e8e6ab4.png"></p>    <p>我们看到,输出3,正是我们程序预期的结果。OK这样我们就使用gradle构建好了一个最基础的Java工程了。接下来为我们的工程添加测试文件。</p>    <h3><strong>2.2 使用JUnit进行单元测试</strong></h3>    <p><strong>2.2.1 添加依赖</strong></p>    <p>首先我们需要在build.gradle中添加依赖,那么更改之后的build.gradle文件如下。</p>    <pre>  <code class="language-java">apply plugin: 'java'    repositories {      mavenCentral()  }    dependencies {    testCompile 'junit:junit:4.12'  }</code></pre>    <p><strong>2.2.2 添加单元测试代码</strong></p>    <p>在 src/test/java 中创建 CalculatorTest.java 文件:</p>    <p>内容如下:</p>    <pre>  <code class="language-java">import static org.junit.Assert.assertEquals;  import org.junit.Test;    public class CalculatorTest {        @Test      public void evaluatesExpression() {          Calculator calculate = new Calculator();          int sum = calculate.add(1,2);          assertEquals(3, sum);      }  }</code></pre>    <p><strong>2.2.3 使用gradle重新构建</strong></p>    <p>在命令行中执行:</p>    <p>gradle build</p>    <p>结果如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7eeb929db9de08968faedd8b98fb398d.png"></p>    <p>从结果看貌似并没有什么不同,那么,我们看一下新的目录结构:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fe9e65de5ce6b6c2128421463f2d1d11.png"></p>    <p>从目录结构中我们可以看出多了很多东西。</p>    <p>打开build/reports/tests/test/index.html</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a48c5bc8cec6e713af285abfe23254c1.png"></p>    <p>在网页中显示测试结果,100%通过。那么我们试一试没有通过的情况。</p>    <p><strong>2.2.4 测试失败情况</strong></p>    <p>将原来的Calculator.java改为如下:</p>    <pre>  <code class="language-java">import java.lang.String;    public class Calculator{        public int add(int a, int b){          return a - b ; //这里改成减号      }        public static void main(String[] args) {          Calculator calculator = new Calculator() ;           int result = calculator.add(1,2) ;           System.out.println(String.valueOf(result));      }  }</code></pre>    <p>然后在使用Gradle构建:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/569ddf1f079ec020deabc3c8465a0cb5.png"></p>    <p>我们可以看到失败了。然后它提示我们有一个报告文件。那么我们就去看看这个报告文件。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b00a813137fda155c1c4a774d6feeb91.png"></p>    <p>可以看到,我们非常成功的失败了!</p>    <h2><strong>3 结束语</strong></h2>    <p>你可以看到,我都是通过手动构建的工程。没有使用任何IDE。这种方式肯定不实用,但对于我们开始学习打下一个好的基础非常重要,这可以让你非常清楚IDE为我们做了哪些事情,当出现问题的时候不至于摸不着头脑。我还手工用Gradle构建过Android工程,用Maven也构建过Java和Android工程。从那以后自己对哪些目录结构就很清晰明了了。</p>    <p>自己也刚刚学习单元测试。如果有什么不对的地方还请斧正!学识尚浅,还望大家多多指教!</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/e4e99b62a203</p>    <p> </p>