美文网首页技术文程序员
Java用JUnit进行单元测试

Java用JUnit进行单元测试

作者: 柴泽建_Jack | 来源:发表于2016-10-12 22:26 被阅读4538次

    单元测试应该是开发人员必备的技能,但又是开发人员最容易忽略的内容。我是一个Android Coder,接下来从零开始学习使用JUnit进行单元测试。

    1 最原始的写法

    1.1 准备

    创建一个文件夹作为工作文件夹。

    1.2 下载

    这里我们需要下载两个东西:

    junit.jar

    hamcrest-core.jar

    我这里下载了4.12版本的JUnit和1.3版本的hamcrest。下载完成之后,拷贝到工作文件夹。

    1.3 编写Java类

    在工作文件夹创建编写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;
        }
    
    }
    

    然后通过Java命令行编译该类:

    javac Calculate.java

    1.4 编写测试类

    在工作文件夹创建编写测试类

    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);
        }
    }
    

    然后使用命令行编译该类:

    javac -cp .:junit-4.12.jar CalculateTest.java

    1.5 运行测试

    使用命令行:

    java -cp .:junit-4.12.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculateTest

    结果:

    JUnit version 4.12
    .
    Time: 0.004
    
    OK (1 test)
    

    1.6 测试失败的情况

    更改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;
        }
    
    }
    

    重新编译,运行测试。结果:

    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
    
    

    最基础的用法完成Java的单元测试。我们进行单元测试肯定不会这么麻烦。但是要知道,我们使用任何框架或者编辑器,他们在背后做的事情大概也就是这些。那接下来,仍然手工来做一个使用Gradle构建的Java工程的测试写法。

    2 对使用Gradle构建的Java项目进行单元测试

    2.1 使用Gradle构建Java工程

    估计,即使是使用过Gradle构建的人,也很少有人手动使用grad

    2.1.1 准备

    仍然是创建一个文件夹作为我们的工程文件夹。

    2.1.2 创建build.gradle文件

    在这个文件夹下面创建一个build.gradle文件,内容:

    apply plugin: 'java'

    2.1.3 创建Java工程结构并编写代码

    然后在工程文件夹下创建Java工程结构,并在src/main/java下创建一个文件,Calculator文件。PS:我创建的工程文件夹叫Gradle。

    Calculator.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));
        }
    }
    

    2.1.4 使用gradle构建工程

    在工程文件夹下使用命令行gradle build构建工程。

    gradle build

    然后查看工程文件夹:

    我们可以看到多出了build文件夹,这个就是使用gradle构建出的内容。我们可以看到有class和jar文件。那么我们去运行一下试一试。

    我们看到,输出3,正是我们程序预期的结果。OK这样我们就使用gradle构建好了一个最基础的Java工程了。接下来为我们的工程添加测试文件。

    2.2 使用JUnit进行单元测试

    2.2.1 添加依赖

    首先我们需要在build.gradle中添加依赖,那么更改之后的build.gradle文件如下。

    apply plugin: 'java'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
      testCompile 'junit:junit:4.12'
    }
    

    2.2.2 添加单元测试代码

    src/test/java中创建CalculatorTest.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);
        }
    }
    

    2.2.3 使用gradle重新构建

    在命令行中执行:

    gradle build

    结果如下:

    从结果看貌似并没有什么不同,那么,我们看一下新的目录结构:

    从目录结构中我们可以看出多了很多东西。

    打开build/reports/tests/test/index.html

    在网页中显示测试结果,100%通过。那么我们试一试没有通过的情况。

    2.2.4 测试失败情况

    将原来的Calculator.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));
        }
    }
    

    然后在使用Gradle构建:

    我们可以看到失败了。然后它提示我们有一个报告文件。那么我们就去看看这个报告文件。

    可以看到,我们非常成功的失败了!

    3 结束语

    你可以看到,我都是通过手动构建的工程。没有使用任何IDE。这种方式肯定不实用,但对于我们开始学习打下一个好的基础非常重要,这可以让你非常清楚IDE为我们做了哪些事情,当出现问题的时候不至于摸不着头脑。我还手工用Gradle构建过Android工程,用Maven也构建过Java和Android工程。从那以后自己对哪些目录结构就很清晰明了了。

    自己也刚刚学习单元测试。如果有什么不对的地方还请斧正!学识尚浅,还望大家多多指教!

    相关文章

      网友评论

        本文标题:Java用JUnit进行单元测试

        本文链接:https://www.haomeiwen.com/subject/pvziyttx.html