ホームページ  >  記事  >  Java  >  Spring Boot Junit 単体テストの導入と使用

Spring Boot Junit 単体テストの導入と使用

零下一度
零下一度オリジナル
2017-07-16 10:01:561807ブラウズ

単体テスト (モジュールテスト): テスト対象のコードの小さくて明確な機能が正しいかどうかを確認するために開発者によって書かれた小さなコードです。一般に、単体テストは、特定の条件 (またはシナリオ) での特定の機能の動作を判断するために使用されます。たとえば、並べ替えられたリストに大きな値を入力し、その値がリストの最後に表示されるようにすることができます。あるいは、string からパターンに一致する文字を削除し、その文字列にそれらの文字が実際に含まれていないことを確認することもできます。

簡単に言えば、単体テストとは、プログラム内の最小の機能モジュールをテストすることです。C 言語では関数、Java ではメソッドまたはクラスです。

目的はコードの品質を向上させることです。

古いテクノロジーである Junit が再び言及されていますが、それは他の目的ではなく、プロジェクトにおけるその重要性をある程度説明するためです。


私自身の感覚と経験に基づくと、Junit のユースケースが標準に従って完全に記述されており、プロジェクト内のビジネス コードのほとんどをカバーしている場合、半分を超えてはいけないはずです。

少し前に SpringBoot についていくつかの記事を書いたばかりですが、今回は Junit を取り出して、いくつかの初心者にとって参考になると思われるいくつかの側面からそれについて話します。

それでは、なぜテストケースを書く必要があるのか​​について簡単に説明します


1. より良いテストを行うために、テストの効率を向上させることができます


2.プロジェクトがパッケージ化される前にテスト検証を実行できます


3. コードの変更によって引き起こされる新しい問題を時間内に発見し、時間内に解決することができます

そこで、この記事では次の点から Junit の使用方法を説明します。 Junit 4 は 3 よりもはるかに便利です。詳細は自分で理解できます。主な理由は、バージョン 4 ではメソッドの名前付け形式の要件がなく、TestCase を継承する必要がないためです。注釈。

1. SpringBoot Web プロジェクトで通常の Java クラスを作成する Junit

の方法 Junit4 では、TestCase クラスを継承する必要はありません。


私たちは Web プロジェクトなので、作成した Java クラスにアノテーションを追加します。

@RunWith(SpringJUnit4ClassRunner.class) // SpringJUnit支持,由此引入Spring-Test框架支持! 
@SpringApplicationConfiguration(classes = SpringBootSampleApplication.class) // 指定我们SpringBoot工程的Application启动类
@WebAppConfiguration // 由于是Web项目,Junit需要模拟ServletContext,因此我们需要给我们的测试类加上@WebAppConfiguration。


その後、テスト メソッドを記述できます。テスト メソッドには @Test アノテーションを付けることができます。


このクラスでは、開発中に通常どおり、 @Autowired を直接使用して、テストしたいクラス インスタンスを挿入できます。


以下は完全なコードです:


package org.springboot.sample;

import static org.junit.Assert.assertArrayEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springboot.sample.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

/**
 *
 * @author  单红宇(365384722)
 * @create  2016年2月23日
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringBootSampleApplication.class)
@WebAppConfiguration
public class StudentTest {

  @Autowired
  private StudentService studentService;

  @Test
  public void likeName() {
    assertArrayEquals(
        new Object[]{
            studentService.likeName("小明2").size() > 0,
            studentService.likeName("坏").size() > 0,
            studentService.likeName("莉莉").size() > 0
          }, 
        new Object[]{
            true,
            false,
            true
          }
    );
//   assertTrue(studentService.likeName("小明2").size() > 0);
  }

}


次に、開発したプログラムの有効性を確認するために、無数のテスト クラスを追加し、無数のテスト メソッドを記述する必要があります。

2. JUnit の基本的なアノテーションの紹介

JUnit には、テスト コードを呼び出す役割を担うランナーが多数あります。テストコードを実行するためのさまざまなランナー。

通常の Java テストを実行するだけで Spring Web プロジェクトが関与しない場合は、@RunWith アノテーションを省略して、システムが自動的にデフォルトの Runner を使用してコードを実行するようにすることができます。

3. パラメータ化されたテスト

Junit が提供するパラメータ化されたテストは @RunWith(Parameterized.class) を使用する必要があります

ただし、Junit は @RunWith を使用して Runner を指定するため、多くの場合 @ RunWith を使用する必要があります。 (SpringJUnit4ClassRunner.class) を使用して Spring エンジニアリング メソッドをテストするため、assertArrayEquals を使用してメソッドを複数の可能性についてテストできます。

以下はパラメータ化されたテストの簡単な例です:


//在所有测试方法前执行一次,一般在其中写上整体初始化的代码 
@BeforeClass

//在所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码 
@AfterClass

//在每个测试方法前执行,一般用来初始化方法(比如我们在测试别的方法时,类中与其他测试方法共享的值已经被改变,为了保证测试结果的有效性,我们会在@Before注解的方法中重置数据) 
@Before

//在每个测试方法后执行,在方法执行完成后要做的事情 
@After

// 测试方法执行超过1000毫秒后算超时,测试将失败 
@Test(timeout = 1000)

// 测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败 
@Test(expected = Exception.class)

// 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类 
@Ignore(“not ready yet”) 
@Test

@RunWith


4. パッケージ化されたテスト


通常、5 つのテスト クラスを作成し、それらを 1 つずつ実行する必要があります。

テストのパッケージ化とは、新しいクラスを追加し、一緒に作成した他のテスト クラスを構成し、このクラスを直接実行して、他のいくつかのテストを同時に実行するという目的を達成することを意味します。

コードは次のとおりです:


package org.springboot.sample;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ParameterTest {

  private String name;
  private boolean result;

  /**
   * 该构造方法的参数与下面@Parameters注解的方法中的Object数组中值的顺序对应
   * @param name
   * @param result
   */
  public ParameterTest(String name, boolean result) {
    super();
    this.name = name;
    this.result = result;
  }

  @Test
  public void test() {
    assertTrue(name.contains("小") == result);
  }

  /**
   * 该方法返回Collection
   *
   * @return
   * @author SHANHY
   * @create 2016年2月26日
   */
  @Parameters
  public static Collection<?> data(){
    // Object 数组中值的顺序注意要和上面的构造方法ParameterTest的参数对应
    return Arrays.asList(new Object[][]{
      {"小明2", true},
      {"坏", false},
      {"莉莉", false},
    });
  }
}


5. Junitを使用してHTTP APIインターフェイスをテストします


内部単体テスト要件が満たされていない場合は、これを直接使用できます。非常に厳密です。外部 API は完全にテストできることを保証します。API は多くの内部メソッドを呼び出すため、統合テストとして考えてみましょう。

以下は簡単な例です:

@RunWith(Suite.class) 
@SuiteClasses({ATest.class, BTest.class, CTest.class}) 
public class ABCSuite {
  // 类中不需要编写代码
}

6. 出力をキャプチャします

OutputCapture を使用して、指定されたメソッドの実行開始後に、System.out 出力やログ ログを含むすべての出力をキャプチャします。次のコードに示すように、


OutputCapture には @Rule アノテーションを付ける必要があり、インスタンス化されたオブジェクトは public で修飾する必要があります。

以上がSpring Boot Junit 単体テストの導入と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。