Junit4 Junit框架介绍

1.什么是JUnit?

JUnit是Java编程语言的单元测试框架。JUnit在测试驱动开发的开发中非常重要,并且是从JUnit起源的一组单元测试框架(统称为xUnit)之一。
JUnit功能包括:
  • 用于测试预期结果的断言
  • 用于共享通用测试数据的测试装置
  • 运行JUnit的测试运行程序最初由Erich Gamma和Kent Beck编写 。

2.使用JUnit的好处

  1. JUnit是一个测试框架,开发人员可以在开发软件时用来编写测试用例。他们将为他们编写的每个函数编写并运行测试用例。因此,使用此代码可以确保每行代码都会受到测试。
  2. 每次对代码(在任何函数中)进行小或大修改时,都可以通过一次为该函数编写所有JUnit测试用例来确保该函数运行良好且没有破坏任何较旧的功能。因此,您一次编写一个测试用例,然后一次又一次地使用该测试用例,以确保-每次修改软件时,它都能按预期运行!
  3. 使用JUnit,您可以轻松创建并且最重要的是为整个软件管理丰富的单元测试用例套件。
  4. 团队中的任何新成员都可以轻松理解使用JUnit编写和管理的测试用例,从而有助于编写更多的测试用例以开发健壮的软件。
  5. JUnit已成为使用Java编程语言进行测试的标准,并且几乎受所有IDE(例如Netbeans,Eclipse等)的支持。因此,在任何标准化的IDE环境中工作,您都可以在其中找到JUnit的支持。

3. JUnit简单基础模板

以下模板是一个很好的起点。复制/粘贴和编辑这些模板以适合您的编码样式。
这是一个 代表基本测试模板的SampleTest类:
import static org.junit.Assert.*;
/**
 * 一点教程网: http://www.yiidian.com
 */
public class SampleTest {
 
    private java.util.List emptyList;
 
    /**
     * Sets up the test fixture. 
     * (Called before every test case method.)
     */
    @Before
    public void setUp() {
        emptyList = new java.util.ArrayList();
    }
 
    /**
     * Tears down the test fixture. 
     * (Called after every test case method.)
     */
    @After
    public void tearDown() {
        emptyList = null;
    }
    
    @Test
    public void testSomeBehavior() {
        assertEquals("Empty list should have 0 elements", 0, emptyList.size());
    }
 
    @Test(expected=IndexOutOfBoundsException.class)
    public void testForException() {
        Object o = emptyList.get(0);
    }
}

4.Fixture

测试装置是一组对象的固定状态,用作运行测试的基准。测试装置的目的是确保在众所周知的固定环境中进行测试,以便结果可重复。固定装置示例:
  • 准备输入数据以及设置/创建伪造或模拟对象
  • 用一组已知的特定数据加载数据库
  • 复制一组特定的已知文件以创建测试夹具,将创建一组初始化为某些状态的对象。
在Junit4中,没有setup() 或tearDown() 方法,相反,我们具有@Before和@After批注。 通过使用@Before,可以将任何方法设置为setup() ,通过使用@After,可以将任何方法设置为teardown() 。 
 
您可以将@BeforeClass批注添加到要在类中的所有测试之前运行的方法,并将@AfterClass批注添加到要在类中的所有测试之后运行的方法。 
 

这是一个例子:

import org.junit.*;
import static org.junit.Assert.*;
import java.util.*;
/**
 * 一点教程网: http://www.yiidian.com
 */
public class SimpleTest {
 
    private Collection collection;
    
    @BeforeClass
    public static void oneTimeSetUp() {
        // one-time initialization code        
    }
 
    @AfterClass
    public static void oneTimeTearDown() {
        // one-time cleanup code
    }
 
    @Before
    public void setUp() {
        collection = new ArrayList();
    }
    
    @After
    public void tearDown() {
        collection.clear();
    }
 
    @Test
    public void testEmptyCollection() {
        assertTrue(collection.isEmpty());
    }
    
    @Test
    public void testOneItemCollection() {
        collection.add("itemA");
        assertEquals(1, collection.size());
    }
}
在进行此测试后,这些方法将按以下顺序执行:
oneTimeSetUp()
setUp()
testEmptyCollection()
tearDown()
setUp()
testOneItemCollection()
tearDown()
oneTimeTearDown()

 

5.创建简单的JUnit测试用例

让我们快速看一下如何创建一个非常简单的JUnit测试,以下是步骤:
  1. 创建方法并使用@ org.junit.Test注释方法 
  2. 使用assertEquals断言可验证期望值和实际值是否相等。
  3. 使用IDE或命令行运行测试,或者使用mvn test 命令运行项目maven  。
该的assertEquals断言验证,预期与实际值相等:
/**
 * 一点教程网: http://www.yiidian.com
 */
@Test
public void whenAssertingEquality_thenEqual() {
    String expected = "Ramesh";
    String actual = "Ramesh"; 
    assertEquals(expected, actual);
}

6.使用JUnit Framework的实际示例

让我们了解更多有关在实际示例中使用JUnit测试的信息。
考虑我们有一个 School Management System 应用程序,并且我们想为School实体编写一个示例测试用例。 
在此示例中,我们将看到School 实体的示例CRUD JUnit测试用例 :
/**
 * 一点教程网: http://www.yiidian.com
 */
public class SchoolServiceImplTest { 
    private SchoolService schoolService;
       
    /**
     * This method initialize all domain objects required for test methods.
     */
    @Before
    public final void setUp() throws Exception {

        // Instantiates a School instance;
        school = new School();
        school.setName("BVB School");
        school.setAddress("BVB School");
        school.setContactNo("0778563251");
        school.setFaxNo("0778563251");
        school.setWebsite("javaguides.new");
        school.setStartedDate(date);
        school.setModifiedTime(date);        
    }
  
    @Test
    public final void testAddSchool() throws Exception {
            School newSchool = schoolService.addSchool(school);
            assertNotNull("School Type object should not null ", newSchool);  
    }

   
    @Test
    public final void testUpdateSchool() {
            School newSchool = schoolService.addSchool(school);
            assertNotNull(newSchool);
            newSchool.setContactNo("0145785545");
            schoolService.updateSchool(newSchool);
    }

    @Test
    public final void testFindSchool() throws AkuraAppException {

            School newSchool = schoolService.addSchool(school);
            assertNotNull(newSchool);
            School findSchool = schoolService.findSchool(
                    newSchool.getSchoolId());
            assertNotNull("School Type object should not null ", findSchool);
    }

   
    @Test
    public final void testGetSchoolList() throws AkuraAppException {
            School newSchool = schoolService.addSchool(school);
            assertNotNull(newSchool);
            List<School> schoolList = schoolService.getSchoolList();
    }

   
    @After
    public final void teardown() throws SchoolNotFoundException {   
         schoolDao.delete(school);
    }
}

7.预期的异常

您如何验证代码是否按预期抛出异常?
验证代码是否正常完成只是编程的一部分。确保代码在特殊情况下的行为符合预期也是编程技巧的一部分。 
例如:
new ArrayList<Object>().get(0);

此代码应引发 IndexOutOfBoundsException。在 @Test 注解有预期的可选参数,需要为值的子类 的Throwable。如果我们想验证 ArrayList 抛出正确的异常,我们将编写:

@Test(expected= IndexOutOfBoundsException.class)
public void empty() {
    new ArrayList<Object>().get(0);
}

8.结论

在本文中,我们讨论了什么是JUnit框架,它的好处,基本模板,Fixture。 

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码