3、ユニットテスト——JUnit 4

8608 ワード

JUnit 4は、作成したテストを実行するためにAnnotationを全面的に導入しました.
1、JUnit 4はテストクラスにTestCase親クラスを継承するように要求し、1つのテストクラスで@Test注釈で修飾されたpublic、voidメソッドはtest caseであり、junitによって実行される.
Junit 4はテストメソッド名をtestで始まるように要求しないが、JUnit 3に従ったほうがいい.8の要求通りtestを試験方法名の先頭とする.
import static org.junit.Assert.assertEquals;

import org.junit.Test;
public class CalculatorTest
{
	
	@Test
	public void hello()
	{
		Calculator cal = new Calculator();
		int result = cal.add(3, 5);
		
		assertEquals(8,result);
	}
	
	@Test
	public void world()
	{
		Calculator cal = new Calculator();
		int result = cal.subtract(1,6);
		assertEquals(-5,result);
	}
	
	@Test
	public void testMultiply()
	{
		Calculator cal = new Calculator();
		int result = cal.multiply(2, 3);
		assertEquals(6,result);
	}
}

2、JUnit 4では@Before注記によりJUnit 3と実現する.8のsetUpメソッドと同様の機能を,@After注記によりJUnit 3を実現する.8のtearDownメソッドと同様の機能.
import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest
{
	private Calculator cal;
	
	@Before
	public void init()
	{
		System.out.println("befor");
	}
	
	@After
	public void destroy()
	{
		System.out.println("after");
	}
	@Test
	public void hello()
	{
		Calculator cal = new Calculator();
		int result = cal.add(3, 5);
		
		assertEquals(8,result);
	}
	
	@Test
	public void world()
	{
		Calculator cal = new Calculator();
		int result = cal.subtract(1,6);
		assertEquals(-5,result);
	}
	
	@Test
	public void testMultiply()
	{
		Calculator cal = new Calculator();
		int result = cal.multiply(2, 3);
		assertEquals(6,result);
	}
}

3、JUnit 4では、@BeforeClassと@AfterClass注釈を使用してpublic static void no-argを修飾する方法を使用することができ、@BeforeClass注釈によって修飾された方法はすべての試験方法の実行前に実行される.@AfterClass注記で修飾されたメソッドは、すべてのテストメソッドが実行された後に実行されます.
import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class CalculatorTest
{
	private Calculator cal;
	
	@BeforeClass
	public static void globalInit()
	{
		System.out.println("global invoke");
	}
	@AfterClass
	public static void globalDestroy()
	{
		System.out.println("globalDestroy invoke");
	}
	@Before
	public void init()
	{
		System.out.println("befor");
	}
	
	@After
	public void destroy()
	{
		System.out.println("after");
	}
	@Test
	public void hello()
	{
		Calculator cal = new Calculator();
		int result = cal.add(3, 5);
		
		assertEquals(8,result);
	}
	
	@Test
	public void world()
	{
		Calculator cal = new Calculator();
		int result = cal.subtract(1,6);
		assertEquals(-5,result);
	}
	
	@Test
	public void testMultiply()
	{
		Calculator cal = new Calculator();
		int result = cal.multiply(2, 3);
		assertEquals(6,result);
	}
}

4、@Test属性timeoutはテストがどのくらいの時間で終わることを望んで、この時間を超えて、テストが失敗したことを表します;属性expectedは、expected=Exceptionのような値を期待する.Class、所望の方法で異常を投げ出す
import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class CalculatorTest
{
	private Calculator cal;
	
	@BeforeClass
	public static void globalInit()
	{
		System.out.println("global invoke");
	}
	@AfterClass
	public static void globalDestroy()
	{
		System.out.println("globalDestroy invoke");
	}
	@Before
	public void init()
	{
		cal = new Calculator();
		System.out.println("befor");
	}
	
	@After
	public void destroy()
	{
		System.out.println("after");
	}
	@Test
	public void hello()
	{
		int result = cal.add(3, 5);
		
		assertEquals(8,result);
	}
	
	@Test
	public void world()
	{
		int result = cal.subtract(1,6);
		assertEquals(-5,result);
	}
	
	@Test
	public void testMultiply()
	{
		int result = cal.multiply(2, 3);
		assertEquals(6,result);
	}
	
	@Test(expected = Exception.class)
	public void testDevide() throws Exception
	{
		cal.divide(1, 0);
	}
}

int配列最大数テスト
import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class LargestTest
{
	private Largest largest;

	@Before
	public void setUp() throws Exception
	{
		largest = new Largest();
	}

	@After
	public void tearDown() throws Exception
	{
	}
	@Test
	public  void testGetLargest()
	{
		int[] array = {1,6,-1,-20,23,43};
		int result = 0;
		try
		{
			result = largest.getLargest(array);
		}
		catch(Exception e)
		{
			Assert.fail(" ");
		}
		Assert.assertEquals(43, result);
	}
	
	@Test(expected = Exception.class)
	public void testLargest2() throws Exception
	{
		largest.getLargest(null);
	}
	
	@Test(expected = Exception.class)
	public void testLargest3() throws Exception
	{
		largest.getLargest(new int[]{});
	}

}

5、@Ignore注記は、クラスを修飾するときにクラス内のすべてのテストメソッドを無視することを示すテストクラスとテストメソッドを修飾するために使用できます.テストメソッドを修飾すると、このテストメソッドは無視されます.
6、パラメトリックテスト(parameters):テストクラスがパラメトリックランナを使用して実行する場合、クラスの宣言に@RunWith(Parameterized.class)注釈を付ける必要があります.これは、クラスがJUnitに組み込まれたランナを使用して実行せず、パラメトリックランナを使用して実行することを意味します.パラメータ化実行クラスでパラメータを提供する方法では@parameters注記を使用して修飾し、テストクラスの構築方法で各パラメータに値を割り当て(構築方法はJunitによって呼び出される)、最後にテストクラスを作成し、パラメータのグループ数に基づいてテストを複数回実行します.
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;

import org.junit.Before;
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 ParametersTest
{
	private int expected;
	private int input1;
	private int input2;
	private Calculator cal;
	
	@Parameters
	public static Collection prepareData()
	{
		Object[][] object = {{3,1,2},{-4,-1,-3},{5,2,3},{12,4,8}};
		
		return Arrays.asList(object);
	}
	@Before
	public void setUp()
	{
		cal = new Calculator();
	}
	
	public ParametersTest(int expected,int input1,int input2)
	{
		this.expected = expected;
		this.input1 = input1;
		this.input2 = input2;
	}
	
	@Test
	public void testAdd()
	{
		assertEquals(this.expected,cal.add(this.input1, this.input2));
	}
}

7、JUnit 4のテストキット:@RunWith(Suite.class)と@Suiteを使用する.SuiteClasses({})注記
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorTest.class,LargestTest.class,ParametersTest.class})
public class TestAll
{

}

テストプログラムにはコードは必要ありません.Suiteだけです.SuiteClassesで実行するテストクラスをリストアップすればいいです
上記のプログラムの名前がTestAllであれば
それでもいい
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses(TestAll.class)
public class TestAll2
{

}

JUnit 4では、複数のテストを同時に実行するには、@RunWith(Suite.class)と@Suiteの2つの注記が必要です.SuiteClasses()は、Suiteドライバを使用してテストを実行するか、実行するテストクラスを指定します[email protected]でSuiteを指定し続けると、JUnitは中のテストクラスを探して、実行可能なTestCaseを見つけて実行します.