Junit 4使用要約(五)suite
6668 ワード
一、Suiteテスト
Suite
テストは複数のテスト対象クラスをパッケージ化してテストできます.エントリ・テスト・クラスに2つのコメントを追加します.@RunWith(Suite.class)
@SuiteClasses(TestClass1.class, ...)
このエントリテストクラスを実行すると、フレームワークはパッケージされたすべてのテスト対象クラスをテストします.
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestFeatureLogin.class,
TestFeatureLogout.class,
TestFeatureNavigate.class,
TestFeatureUpdate.class
})
public class FeatureTestSuite {
// the class remains empty,
// used only as a holder for the above annotations
}
フレームワークは、テスト対象のクラスを実行し、
@Suite.SuiteClasses
にリストされた順序でテストを開始します.二、Parameterizedテスト
多くの場合、多くのテストデータで複数回テストする必要があります.どうしよう?貼り付けコードをコピーして実現しますか?疲れた...
この場合、JUnit 4フレームワークは、
Parameterized
テスタ(Runner
)を提供し、このようなニーズを実現する.次の例を見てください.
package mytest;
import static org.junit.Assert.*;
import java.util.Arrays;
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 FibonacciTest {
@Parameters
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private int fInput;
private int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
簡単で便利ですね.
@Parameters
で表記し、テストのために用意したデータ@Test
注釈@RunWith(Parameterized.class)
public class FibonacciTest {
@Parameters
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 2 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
@Parameter(0)
public int fInput;
@Parameter(1)
public int fExpected;
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
運転してみると爽やかではないでしょうか.
おそらく、あなたは完璧主義者で、実行後のエラーメッセージに満足していないかもしれませんが、今エラーを報告したときにフィードバックされた情報はそうかもしれません.
test[3](mytest.FibonacciTest): expected:<2> but was:<0>
エラーを報告したい場合は、テストの入力データを表示します.エラーを報告したい場合は、次のようにします.
test[the 3 test, input:3,2](mytest.FibonacciTest): expected:<2> but was:<0>
これを実現するには簡単ですが、
@Parameters
パラメータを追加name
コード全体は以下の通りです.package mytest;
import static org.junit.Assert.*;
import java.util.Arrays;
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 FibonacciTest {
@Parameters(name="the {index} test, input:{0},{1}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private int fInput;
private int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
ここでは、いくつかのパラメータの意味を少し説明する必要があります.
{index} ,
{0}
{1}
...
{n} n+1
三、Categoriesテスト
1つのテストクラスには多くのテスト対象の方法が含まれています.多くの場合、私たちはこれらのテスト対象の方法を分類し、ある方法をテストする必要があります.では、どうすればいいですか.
次の例を見てください.
public interface FastTests { /* category marker */ }
public interface SlowTests { /* category marker */ }
public class A {
@Test
public void a() {
fail();
}
@Category(SlowTests.class)
@Test
public void b() {
}
}
@Category({SlowTests.class, FastTests.class})
public class B {
@Test
public void c() {
}
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b and B.c, but not A.a
}
上記の例では、
name
とA.b
の2つの方法をテストしますが、テストしませんB.c
.次を見てください.
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b, but not A.a or B.c
}
今回は、
A.a
しか運行しておらず、A.b
とA.a
は運行していません.四、Theoriesテスト
いくつかの理論テスト.
まず例を見てみましょう.
@RunWith(Theories.class)
public class UserTest {
@DataPoint
public static String GOOD_USERNAME = "optimus";
@DataPoint
public static String USERNAME_WITH_SLASH = "optimus/prime";
@Theory
public void filenameIncludesUsername(String username) {
assumeThat(username, not(containsString("/")));
assertThat(new User(username).configFileName(), containsString(username));
}
}
少し苦くて分かりにくいのではないでしょうか.大丈夫です.一つ一つ説明します.
B.c
教示の枠組みであり、次の試験類は理論試験を行う.@RunWith(Theories.class)
フレームワークに、表示されているデータはすべてテスト用のデータであることを示す.@DataPoint
表記の方法は、理論テストが必要な方法である.@Theory
テストのデータ(assumeThat
表記のデータ)に対して検査を行い、該当するデータは引き続き下へ進み、該当しないデータは無視する.もし、すべてのデータが一致しない場合、@DataPoint
マークアップのテストは失敗(fail)となります.