Spring's Road to God の第 54 章: junit の統合

Spring's Road to God の第 54 章: junit の統合

通常、コードを書いた後、コードの正確性を確認するために、コードの実行結果が期待した結果と同じであるかどうかを自分でテストする必要があります。これを単体テストと呼びます。 , Javaで最もよく使われる単体テストフレームワークはjunitです この記事では主に以下の3つの内容を紹介します。

1. ジュニトをプレイする

2. Spring は junit を統合します

3.開発ツールでjunitを使用する

1. 背景

2 つのメソッドを含むユーティリティ クラスを作成しました

package com.javacode2018.junit.demo1;

public class MathUtils {
    
    
    /**
     * 获取最大的数字
     *
     * @param args
     * @return
     */
    public static int max(int... args) {
    
    
        int result = Integer.MIN_VALUE;
        for (int arg : args) {
    
    
            result = result > arg ? result : arg;
        }
        return result;
    }

    /**
     * 获取最小的数字
     *
     * @param args
     * @return
     */
    public static int min(int... args) {
    
    
        int result = Integer.MAX_VALUE;
        for (int arg : args) {
    
    
            result = result < arg ? result : arg;
        }
        return result;
    }

}

次に、これら 2 つのメソッドをテストします。次に、max メソッドと min メソッドの結果が予想される結果と一致するかどうかをテストするために、次のようにテスト コードを作成します。一致しない場合は、テキストの段落を出力します。

package com.javacode2018.junit.demo1;

public class MathUtilsTest1 {
    
    
    public static void main(String[] args) {
    
    
        testMax();
        testMin();
    }

    public static void testMax() {
    
    
        int result = MathUtils.max(1, 2, 3);
        if (result != 3) {
    
    
            System.out.println(String.format("max 方法有问题,期望结果是3,实际结果是%d", result));
        }
    }

    public static void testMin() {
    
    
        int result = MathUtils.min(1, 2, 3);
        if (result != 1) {
    
    
            System.out.println(String.format("min 方法有问题,期望结果是3,实际结果是%d", result));
        }
    }
}

上記でテストする必要があるメソッドは 2 つだけです。テストするメソッドが多数ある場合、多くのテスト コードを記述する必要があり、作業負荷は依然として非常に大きくなります。junit が行うことは上記と同様であり、それらはすべてテストしたメソッドが期待する結果と一致しているかどうかを判断するために使用され、一致しない場合はプロンプトが表示されますが、junit の方が使いやすく、さまざまな開発アイデア (Eclipse、アイデア) を組み合わせた方が優れており、スムーズに使用するための特別な。

2.junitの使い方の詳しい説明

2.1. 使用手順

1)、junit maven 構成を追加します。ここでは 4.13 を使用します。最新のものを使用することもできます。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>

2)、テスト ケースを作成し、作成したテスト メソッドに @Test アノテーションを追加します。たとえば、上記のケースでは max メソッドをテストする必要があります。通常は新しいテスト クラスを作成します。クラス名はテスト対象のクラスです。プラス Test サフィックス、つまり MathUtilsTest を追加し、次にこのクラスで max メソッドのテスト メソッドを記述する必要があります。次のように、@Test アノテーションを max メソッドに追加する必要があります。

package com.javacode2018.junit.demo1;

import org.junit.Assert;
import org.junit.Test;

public class MathUtilsTest {
    
    
    @Test
    public void max() throws Exception {
    
    
        int result = MathUtils.max(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 3);
    }
}

3. テスト ケースを実行します。テスト コードが記述されたので、テスト ケースを開始するクラスを作成しましょう。ここでは、次のように、JUnitCore.runClasses メソッドを使用してテスト ケースを実行する必要があります。

package com.javacode2018.junit.demo1;

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class Demo1TestRunner {
    
    
    public static void main(String[] args) {
    
    
        //使用JUnitCore.runClasses方法传入测试用例的类,然后获取测试用例的运行结果
        Result result = JUnitCore.runClasses(MathUtilsTest.class);
        //获取失败的用例
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        //获取所有测试用例是否执行成功
        System.out.println(result.wasSuccessful());
    }
}

2.2、複数のテスト ケースを同時に実行する

テスト クラスに複数のテスト メソッドを記述し、各メソッドに @Test アノテーションを追加して、JUnitCore を通じて実行できます。次のコードでは、MathUtils で max メソッドと min メソッドを実行する 2 つのメソッドを記述します。テストのために、意図的に実行結果が予期した結果と一致しない場合は、次のコードを実行して、実行結果を確認します。

package com.javacode2018.junit.demo2;

import com.javacode2018.junit.demo1.MathUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.manipulation.Ordering;
import org.junit.runner.notification.Failure;

public class MathUtilsTest2 {
    
    
    @Test
    public void max() throws Exception {
    
    
        int result = MathUtils.max(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 1);
    }

    @Test
    public void min() throws Exception {
    
    
        int result = MathUtils.min(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 3);
    }

    public static void main(String[] args) {
    
    
        Result result = JUnitCore.runClasses(MathUtilsTest2.class);

        System.out.println("失败用例个数:" + result.getFailures().size());
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        System.out.println("运行测试用例个数:" + result.getRunCount());
        System.out.println("运行测试用例总耗时(ms):" + result.getRunTime());
        System.out.println("测试用例是否都成功了:" + result.wasSuccessful());
    }
}

操作の出力は以下の通りです。2つのユースケースが実行され、2つは失敗し、テストの詳細情報が出力されました。

失败用例个数:2
max(com.javacode2018.junit.demo2.MathUtilsTest2): expected:<3> but was:<1>
min(com.javacode2018.junit.demo2.MathUtilsTest2): expected:<1> but was:<3>
运行测试用例个数:2
运行测试用例总耗时(ms):11
测试用例是否都成功了:false

2.3. アサーションの使用

アサーションとは何ですか?

アサーションは、プログラムの実行結果が期待される結果と一致しているかどうかを判断するために使用されます。一致しない場合は、例外がスローされます。アサーションには 3 つの重要な情報があります

1. テストするデータ

2. 期待されるデータ

3. 例外をスローする

アサーションによって提供されるメソッドは、テストされたデータと予期されるデータを比較します。それらが同じでない場合は例外がスローされ、プログラムはこの例外をキャッチできるため、テストが失敗したことがわかります。

junit のorg.junit.Assertクラスには、テストされたデータが予期されるデータと一致するかどうかを判断するための多数の静的メソッドが用意されています。一致しない場合は、例外がスローされます。ここでいくつかを見てみましょう。

//判断condition如果不是true,将抛出异常,异常的提示信息是message
public static void assertTrue(String message, boolean condition) 

//判断expected和actual是否相等,如果不相等,将抛出异常
public static void assertEquals(Object expected, Object actual)

使用例:

int result = MathUtils.max(1, 2, 3);
//判断测试结果和我们期望的结果是否一致
Assert.assertEquals(result, 1);

2.4. テストスイート: テストケースをバッチで実行する

これまでのところ、次のように一度に 1 つのテスト クラスのみを実行できます。

JUnitCore.runClasses(MathUtilsTest2.class)

しかし、実際のプロジェクトでは、バッチで実行する必要があるテスト クラスが多数存在する場合があります。

たとえば、次の 2 つのテスト クラスがあります。

MathUtilsTest3001.java

package com.javacode2018.junit.demo3;

import com.javacode2018.junit.demo1.MathUtils;
import org.junit.Assert;
import org.junit.Test;

public class MathUtilsTest3001 {
    
    
    @Test
    public void max() throws Exception {
    
    
        int result = MathUtils.max(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 3);
    }

    @Test
    public void min() throws Exception {
    
    
        int result = MathUtils.min(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 1);
    }
}

MathUtilsTest3002.java

package com.javacode2018.junit.demo3;

import com.javacode2018.junit.demo1.MathUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class MathUtilsTest3002 {
    
    
    @Test
    public void max() throws Exception {
    
    
        int result = MathUtils.max(100, 99, 200);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 200);
    }

    @Test
    public void min() throws Exception {
    
    
        int result = MathUtils.min(1, -1, 10);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, -1);
    }
}

ここで、上記の 2 つのテスト クラスを同時に実行したいと思います。AllTest.java クラスを作成することでこれを実行できます。このクラスには 2 つの特別なアノテーションがあり、どちらも junit によって提供されることに注意してください。@RunWith は次のことを示しますこれはテスト スイートクラスです。テスト クラスはバッチで実行する必要があります。具体的に実行する必要があるテスト クラスは **@Suite.SuiteClasses** で指定されます

package com.javacode2018.junit.demo3;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    
    MathUtilsTest3001.class, MathUtilsTest3002.class})
public class AllTest {
    
    
}

AllTest を JUnitCore.runClasses に渡すスタートアップ クラスは次のとおりです。

package com.javacode2018.junit.demo3;

import com.javacode2018.junit.demo1.MathUtilsTest;
import com.javacode2018.junit.demo2.MathUtilsTest2;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class Demo3TestRunner {
    
    
    public static void main(String[] args) {
    
    
        //@1:传入AllTest
        Result result = JUnitCore.runClasses(AllTest.class);

        System.out.println("失败用例个数:" + result.getFailures().size());
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        System.out.println("运行测试用例个数:" + result.getRunCount());
        System.out.println("运行测试用例总耗时(ms):" + result.getRunTime());
        System.out.println("测试用例是否都成功了:" + result.wasSuccessful());
    }
}

実行出力

失败用例个数:0
运行测试用例个数:4
运行测试用例总耗时(ms):12
测试用例是否都成功了:true

テスト スイートには、基本的なテスト クラスだけでなく、他のテスト スイートも含めることができるため、さまざまなモジュールの単体テスト コードを階層的に管理することが容易になります。たとえば、次のコード、Module2Test と Module2Test は両方ともテスト スイートです。

@RunWith(Suite.class)
@Suite.SuiteClasses({
    
    Test1.class, Test2.class})
public class Module2Test {
    
    
}

@RunWith(Suite.class)
@Suite.SuiteClasses({
    
    Test1.class, Test2.class})
public class Module2Test {
    
    
}

@RunWith(Suite.class)
@Suite.SuiteClasses({
    
    Module2Test.class, Module2Test.class, Test3.java})
public class AllTest {
    
    
}

//运行AllTest
JUnitCore.runClasses(AllTest.class);

2.5、Junit の共通アノテーション

1) @Test アノテーション

@Test: 通常のメソッドをテストメソッドに変更します。

@Test(Excepted=xx.class): xx.class は例外クラスを表します。つまり、テストのメソッドがこの例外をスローすると、通常のテストに合格したと見なされます。

@Test(timeout = ミリ秒): テスト メソッドの実行時間が期待どおりかどうか

2)@授業前

すべてのメソッドが実行される前に実行される、静的メソッド (グローバルは 1 回だけ実行され、最初に実行されます)

3)@アフタークラス

すべてのメソッドが実行された後に実行されます。静的メソッド (グローバルは 1 回だけ実行され、それが最後になります)。

4)@前

各テスト メソッドが実行される前に 1 回実行されます

5)@アフター

各テスト メソッドの実行後に 1 回実行されます

6)@無視

修飾されたテスト メソッドはテスト ランナーによって無視されます。

7)@RunWith

テストランナーは org.junit.runner.Runner から変更できます。

次のケースでは基本的に上記のすべてのアノテーションが使用されています。出力と組み合わせて理解しましょう。

package com.javacode2018.junit.demo4;

import com.javacode2018.junit.demo1.MathUtils;
import org.junit.*;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

import java.util.concurrent.TimeUnit;

public class MathUtilsTest4 {
    
    

    @BeforeClass
    public static void bc() {
    
    
        System.out.println("@BeforeClass");
        System.out.println("-----------------");
    }

    @AfterClass
    public static void ac() {
    
    
        System.out.println("@AfterClass");
    }

    @Before
    public void bf() {
    
    
        System.out.println("@Before:" + this);
    }

    @After
    public void af() {
    
    
        System.out.println("@After:" + this);
        System.out.println("##################");
    }

    @Test
    public void max() throws Throwable {
    
    
        System.out.println("max():" + this);
        int result = MathUtils.max(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 3);
    }

    @Test
    public void min() throws Exception {
    
    
        System.out.println("min():" + this);
        int result = MathUtils.min(1, 2, 3);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(result, 1);
    }

    //方法运行时间超过了timeout,表示测试用例运行失败
    @Test(timeout = 1000)
    public void timeOutTest() throws InterruptedException {
    
    
        System.out.println("timeOutTest():" + this);
        TimeUnit.SECONDS.sleep(2000);
    }

    //方法若未抛出expected指定的异常,表示测试用例运行失败
    @Test(expected = NullPointerException.class)
    public void expectedTest() {
    
    
        System.out.println("expectedTest():" + this);
        new RuntimeException("异常不匹配");
    }

    @Test
    @Ignore
    public void ignoredMethod() {
    
    
        System.out.println("我是被忽略的方法");
    }

    public static void main(String[] args) {
    
    
        Result result = JUnitCore.runClasses(MathUtilsTest4.class);
        System.out.println("-----------------");
        System.out.println("运行测试用例个数:" + result.getRunCount());
        System.out.println("失败用例个数:" + result.getFailures().size());
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        System.out.println("运行测试用例总耗时(ms):" + result.getRunTime());
        System.out.println("测试用例是否都成功了:" + result.wasSuccessful());

    }
}

操作の結果は次のとおりです

@BeforeClass
-----------------
@Before:com.javacode2018.junit.demo4.MathUtilsTest4@78e03bb5
timeOutTest():com.javacode2018.junit.demo4.MathUtilsTest4@78e03bb5
@After:com.javacode2018.junit.demo4.MathUtilsTest4@78e03bb5
##################
@Before:com.javacode2018.junit.demo4.MathUtilsTest4@48533e64
max():com.javacode2018.junit.demo4.MathUtilsTest4@48533e64
@After:com.javacode2018.junit.demo4.MathUtilsTest4@48533e64
##################
@Before:com.javacode2018.junit.demo4.MathUtilsTest4@7e0b37bc
min():com.javacode2018.junit.demo4.MathUtilsTest4@7e0b37bc
@After:com.javacode2018.junit.demo4.MathUtilsTest4@7e0b37bc
##################
@Before:com.javacode2018.junit.demo4.MathUtilsTest4@1a93a7ca
expectedTest():com.javacode2018.junit.demo4.MathUtilsTest4@1a93a7ca
@After:com.javacode2018.junit.demo4.MathUtilsTest4@1a93a7ca
##################
@AfterClass
-----------------
运行测试用例个数:4
失败用例个数:3
timeOutTest(com.javacode2018.junit.demo4.MathUtilsTest4): test timed out after 1000 milliseconds
max(com.javacode2018.junit.demo4.MathUtilsTest4): hah 
expectedTest(com.javacode2018.junit.demo4.MathUtilsTest4): Expected exception: java.lang.NullPointerException
运行测试用例总耗时(ms):1018
测试用例是否都成功了:false 

出力からわかるように、

  • @BeforeClass および @AfterClass でマークされたメソッドは 1 回だけ実行されます
  • @Test マーク付きの各メソッドは、実行前に @Before マーク付きメソッドを実行し、次に @Test マーク付きメソッドを実行してから @After を実行します。
  • この出力からわかるように、各 @Test が実行されると、現在のクラスのインスタンスが新しいクラスを再作成します。
  • @Test でマークされたメソッドが異常であるかどうかに関係なく、@AfterClass と @After でマークされたメソッドが実行され、例外はサブマージされ、出力には例外情報は表示されません。

2.6. パラメトリックテスト

Junit 4 では、新しい機能パラメータ化テストが導入されています。

パラメーター化されたテストを使用すると、開発者は異なる値を使用して同じテストを何度も実行できます。パラメーター化されたテストを作成するには、5 つの手順に従います

  • テスト クラスに @RunWith(Parameterized.class) のアノテーションを付けます。
  • @Parameters アノテーションが付けられたパブリック静的メソッドを作成し、オブジェクトのコレクション (配列) をテスト データ コレクションとして返します。
  • テスト データの行と同等のものを受け入れるパブリック コンストラクターを作成します。
  • テスト データの各列にインスタンス変数を作成します。
  • インスタンス変数をテスト データのソースとして使用してテスト ケースを作成します。

おそらく誰もが、上記の理解を読んでもまだ混乱しているでしょう。

たとえば、com.javacode2018.junit.demo1.MathUtils#max では、次の配列グループをテストします。

1,2,3
100,99,80
30,-1,100

我々は書ける

package com.javacode2018.junit.demo5;

import com.javacode2018.junit.demo1.MathUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;
import org.junit.runners.Parameterized;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@RunWith(Parameterized.class)
public class MathUtilsTest5 {
    
    

    public static class TestData {
    
    
        int[] testData;//测试数据
        int expectedValue;//预期的结果

        public TestData(int[] testData, int expectedValue) {
    
    
            this.testData = testData;
            this.expectedValue = expectedValue;
        }

        @Override
        public String toString() {
    
    
            return "TestData{" +
                    "testData=" + Arrays.toString(testData) +
                    ", expectedValue=" + expectedValue +
                    '}';
        }
    }

    private TestData testData;

    @Parameterized.Parameters
    public static List<TestData> initTestData() {
    
    
        System.out.println("initTestData()");
        //key:期望的结果,value:max方法需要测试的数据
        List<TestData> result = new ArrayList<>();
        result.add(new TestData(new int[]{
    
    1, 2, 3}, 3));
        result.add(new TestData(new int[]{
    
    100, 99, 80}, 100));
        result.add(new TestData(new int[]{
    
    30, -1, 100}, 100));
        return result;
    }

    public MathUtilsTest5(TestData testData) {
    
    
        System.out.println("MathUtilsTest5构造器:" + testData);
        this.testData = testData;
    }

    @Test
    public void maxTest() throws Throwable {
    
    
        System.out.println(this.hashCode() + ",maxTest():" + this.testData);
        int result = MathUtils.max(this.testData.testData);
        //判断测试结果和我们期望的结果是否一致
        Assert.assertEquals(this.testData.expectedValue, result);
        System.out.println("###################");
    }

    public static void main(String[] args) {
    
    
        Result result = JUnitCore.runClasses(MathUtilsTest5.class);
        System.out.println("-----------------");
        System.out.println("运行测试用例个数:" + result.getRunCount());
        System.out.println("失败用例个数:" + result.getFailures().size());
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        System.out.println("运行测试用例总耗时(ms):" + result.getRunTime());
        System.out.println("测试用例是否都成功了:" + result.wasSuccessful());

    }
}

コードの実行過程を誰でも理解しやすくするために、コードには大量のログ出力が追加されています。実行結果は次のとおりです。コードと出力を組み合わせると、理解しやすくなります。

initTestData()
MathUtilsTest5构造器:TestData{testData=[1, 2, 3], expectedValue=3}
721748895,maxTest():TestData{testData=[1, 2, 3], expectedValue=3}
###################
MathUtilsTest5构造器:TestData{testData=[100, 99, 80], expectedValue=100}
463345942,maxTest():TestData{testData=[100, 99, 80], expectedValue=100}
###################
MathUtilsTest5构造器:TestData{testData=[30, -1, 100], expectedValue=100}
195600860,maxTest():TestData{testData=[30, -1, 100], expectedValue=100}
###################
-----------------
运行测试用例个数:3
失败用例个数:0
运行测试用例总耗时(ms):12
测试用例是否都成功了:true

3. Spring は junit を統合します

Spring と junit を統合するのは比較的簡単なので、事例を挙げて体験してみましょう。

3.1、Maven 設定を追加

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency> 

3.2、春のエントリー構成クラスに入る

package com.javacode2018.springjunit;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MainConfig {
    
    
    @Bean
    public String name() {
    
    
        return "路人甲java";
    }

    @Bean
    public int age() {
    
    
        return 30;
    }
}

3.3、Spring を統合するために junit テストクラスに参加する

上記の MainConfig に登録された 2 つの Bean をテストするテスト クラスを用意しましょう

package com.javacode2018.springjunit;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class) //@1
@ContextConfiguration(classes = {
    
    MainConfig.class}) //@2
public class MainConfigTest {
    
    

    @Autowired
    private String name;

    @Autowired
    private int age;

    @Test
    public void nameTest() {
    
    
        System.out.println(this.name);
        Assert.assertEquals("路人甲java", this.name);
    }

    @Test
    public void ageTest() {
    
    
        System.out.println(this.age);
        Assert.assertEquals(30, this.age);
    }
}

上記の @1 と @2 のコードに注意してください。これは Spring 統合 junit のキー コードです。@Runwith の値は、@ContextConfiguration アノテーションが、classes 属性を通じて Spring スタートアップ クラスを指定します。XML の場合はorg.springframework.test.context.junit4.SpringRunner、別の属性値または場所を使用して、エントリ xml の場所を指定できます。

上記のコードの name 属性と age 属性には @Autowired アノテーションがあり、これら 2 つの属性は Spring コンテナーから自動的に挿入されます。

3.4、テストスタートアップクラスにお越しください

package com.javacode2018.springjunit;

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
    
    

    public static void main(String[] args) {
    
    
        Result result = JUnitCore.runClasses(MainConfigTest.class);
        System.out.println("-----------------");
        System.out.println("运行测试用例个数:" + result.getRunCount());
        System.out.println("失败用例个数:" + result.getFailures().size());
        for (Failure failure : result.getFailures()) {
    
    
            System.out.println(failure);
        }
        System.out.println("运行测试用例总耗时(ms):" + result.getRunTime());
        System.out.println("测试用例是否都成功了:" + result.wasSuccessful());

    }

}

実行出力

30
路人甲java
-----------------
运行测试用例个数:2
失败用例个数:0
运行测试用例总耗时(ms):422
测试用例是否都成功了:true

4.開発ツールでjunitを使用する

上記のすべてのケースでは、メイン メソッドで JUnitCore.runClasses を使用してテスト ケースを実行しますが、実際には、より簡単な方法があります。

Java の一般的な開発ツールには、junit が統合された eclipse と idea があり、開発ツールから継承された機能により、テスト ケースの実行がより便利になり、JUnitCore.runClasses コードを記述する必要がなくなりました。

以下に示すように、デモンストレーションしてみましょう

画像

1 の青い矢印をクリックすると、現在のテスト クラス内のすべてのユース ケース、つまり 2 つのテスト メソッドが実行されます。実行の効果は次のとおりです。左側に実行中のテスト ケースのリストが表示され、出力情報が表示されます右側に。

画像

図の 2 と 3 をクリックすることもでき、選択したテスト メソッドのみが実行されます。たとえば、2 をクリックすると、ユースケース nameTest() のみが実行されます。効果は次のとおりです。

画像

5. まとめ

1. この記事では、junit の使い方を詳しく紹介します。一般的に使用されるアノテーションには、@Test、@BeforeClass、@AfterClass、@Before、@After、@Ignore、@RunWith が含まれます。これらはすべてマスターする必要があります。

2. 春に junit を統合する。主な構成は、テスト クラスに次のコードを追加することです。

@RunWith(SpringRunner.class) //@1
@ContextConfiguration(classes = {
    
    MainConfig.class}) //@2

3.開発ツールでjunitを使用する方が簡単です

6. ケースのソースコード

git地址:
https://gitee.com/javacode2018/spring-series

本文案例对应源码:
    spring-series\lesson-008-junit
    spring-series\lesson-008-springjunit

スターの皆さん、すべてのシリーズ コードがこれに含まれており、すべての元の記事へのリンクも含まれているので、簡単に参照できます。

出典: https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648938501&idx=2&sn=8633be35988f5d4a51d69e9e9e457bb6&scene=21#wechat_redirect

行のテスト ケースのリスト。右側には出力情報が表示されます。

[外部リンク画像転送...(img-4leiS5Qb-1684760244756)]

図の 2 と 3 をクリックすることもでき、選択したテスト メソッドのみが実行されます。たとえば、2 をクリックすると、ユースケース nameTest() のみが実行されます。効果は次のとおりです。

[外部リンク画像転送...(img-2SNtKPDX-1684760244756)]

5. まとめ

1. この記事では、junit の使い方を詳しく紹介します。一般的に使用されるアノテーションには、@Test、@BeforeClass、@AfterClass、@Before、@After、@Ignore、@RunWith が含まれます。これらはすべてマスターする必要があります。

2. 春に junit を統合する。主な構成は、テスト クラスに次のコードを追加することです。

@RunWith(SpringRunner.class) //@1
@ContextConfiguration(classes = {
    
    MainConfig.class}) //@2

3.開発ツールでjunitを使用する方が簡単です

6. ケースのソースコード

git地址:
https://gitee.com/javacode2018/spring-series

本文案例对应源码:
    spring-series\lesson-008-junit
    spring-series\lesson-008-springjunit

スターの皆さん、すべてのシリーズ コードがこれに含まれており、すべての元の記事へのリンクも含まれているので、簡単に参照できます。

出典: https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648938501&idx=2&sn=8633be35988f5d4a51d69e9e9e457bb6&scene=21#wechat_redirect

おすすめ

転載: blog.csdn.net/china_coding/article/details/130815157