1. Что такое Junit4
JUnit4 — это простая в освоении и использовании среда модульного тестирования Java.Как правило, когда мы заканчиваем писать фрагмент кода или метод, нам нужно проверить правильность логики этого кода и этого метода. определенные данные, а возвращаемые данные не являются тем результатом, который нам нужен, то есть мы пишем один бизнес-код для проверки результата. Вот когда Junit пригодится.
2. Зачем использовать Junit4
Может быть, некоторые новички скажут, что недостаточно протестировать после завершения проекта? Если вы хотите так думать, то, поскольку ваш код увеличивается, вы будете включать в проект все больше и больше модулей и логики, что будет очень проблематично и подвержено ошибкам при тестировании. Junit, кажется, увеличивает объем кода, но может значительно сократить время последующего тестирования, улучшить качество кода и упростить его сопровождение.
3. Быстрый старт Junit4
Загрузите и импортируйте пакет Junitjar:
Во-первых, вам нужно загрузить jar-пакет Junit4 из Интернета, сохранить его на локальном компьютере, открыть myEclipse и создать новый проект Java, щелкнуть правой кнопкой мыши проект --> Путь сборки ---> Настроить путь сборки - -> Добавить внешние JAR-- -> Найдите только что сохраненный путь к банке и нажмите «ОК».
Создайте тестовую директорию:
Далее нам нужно установить специальный путь для нашего теста.Где этот специальный путь?Потому что наш тестовый код должен быть сохранен отдельно и его нельзя спутать с исходным кодом.Его можно удалить сразу после окончания проекта,и он будет не влияет на проект, оказывает воздействие. Как его создать: щелкните правой кнопкой мыши имя проекта ---> новый ---> папку suorce ---> введите имя тестового файла, которое вы хотите, и нажмите ОК.
Затем мы должны создать пакет в каталоге src проекта.Обратите внимание, что имя пакета здесь должно соответствовать имени пакета в тесте.Запишите логический метод нашего проекта в нашем пакете src и напишите наш проект в протокол испытаний.Метод испытаний, структура показана на рисунке,
Давайте напишем простой логический код для тестового сверла
package com.junit;
public class method_junti {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int division(int a, int b) {
return a / b;
}
}
Метод очень прост, это общее сложение, вычитание, умножение и деление. Теперь мы можем его протестировать. Как это проверить: Создайте новый тестовый класс junit_test в нашем тестовом каталоге, а затем определите метод тестирования. код показывает, как показано ниже:
package com.junit;
import static org.junit.Assert.*;
import org.junit.Test;
public class junit_test {
//测试方法必须有@test;
//该测试方法必须由public void修饰,没有返回值;
//该方法不带任何参数;
//新建一个源代码测试文件单独存放测试代码;
//测试类的包和被测试类的包保持一致;
//测试方法间互相独立没有任何依赖;
@Test
public void testAdd(){
assertEquals(4, new method_junti().add(3, 0));
}
@Test
public void testSubtract(){
assertEquals(3, new method_junti().subtract(6, 3));
}
@Test
public void testMultiply(){
assertEquals(6, new method_junti().multiply(6, 1));
}
@Test
public void testDivision(){
assertEquals(6, new method_junti().division(6, 1));
}
}
Давайте объясним функцию assertEquals(). Ее первый параметр — это ожидаемый результат, а второй параметр — функция, которую мы хотим протестировать. Для этой функции нам нужно сначала создать класс, в котором находится функция, а затем передать class Для вызова метода параметры в методе — это параметры, которые вы передаете при написании метода. Здесь лучше всего добавить тест перед методом, который нужно протестировать, чтобы он был более стандартизирован.
После написания вы можете щелкнуть тестовый класс, затем нажать «Выполнить как», а затем нажать «Тест Junit», вы можете увидеть результаты своего теста во всплывающем окне, оно подскажет вам количество сбоев и количество ошибок. Что делать, если вы хотите протестировать только метод, в созданном вами тестовом классе есть каталог, в списке будут перечислены все ваши методы тестирования, вы можете щелкнуть правой кнопкой мыши метод, который хотите протестировать, и запустить как --> junit test, после успешного прохождения теста вы увидите зеленую полосу, результат такой:
Здесь, если мы должны вручную набирать свой тестовый метод для каждого метода, здесь мы просто тестируем несколько методов, Если у нас есть много методов для тестирования в проекте, будет немного, если мы будем набирать их один за другим. , Это пустая трата времени, вот способ быстро сгенерировать тестовый метод: Щелкните method_junit.java под src ---> Щелкните правой кнопкой мыши новый ---> Посмотрите, есть ли тестовый пример Junit в окне подсказки позади, если Если нет, нажмите «Другое», введите «Junit» в поле подсказки, и оно появится ---> «Найти источник» во всплывающем диалоговом окне. папку, нажмите «Обзор», чтобы изменить его на каталог, содержащий тест, некоторые из которых могут предлагать повторяющиеся имена, просто измените имя ниже ---> нажмите «Далее» ---> вы увидите все методы в method_junit, вы можете выбрать их в на этот раз, и метод тестирования выглядит следующим образом:
package com.junit;
import static org.junit.Assert.*;
import org.junit.Test;
public class method_juntiTest2 {
@Test
public void testAdd() {
fail("Not yet implemented");
}
@Test
public void testSubtract() {
fail("Not yet implemented");
}
@Test
public void testMultiply() {
fail("Not yet implemented");
}
@Test
public void testDivision() {
fail("Not yet implemented");
}
}
Затем удалите оператор после сбоя внутри, и вы можете написать то, что хотите протестировать!
4. Есть две ситуации, в которых тест junit не проходит:
В предыдущих случаях мы все тестировали успешные примеры, но функция Junit состоит в том, чтобы проверить правильность возвращаемых данных в методе, но мы можем быть неверны, когда данные возвращаются правильно, например, если вы Что требуется это площадь прямоугольника, но вы используете формулу периметра, когда вы тестируете, он также выдаст вам успех теста и получит ожидаемые результаты, а это означает, что наши тестовые примеры бессильны для логических ошибок.
Первый случай сбоя теста
Тест завершается неудачей, когда ожидаемое значение отличается от результата выполнения программы:
Например, наш метод тестирования функции сложения выше:
@Test
public void testAdd(){
assertEquals(3, new method_junti().add(3, 0));
}
Если ожидаемый результат 3 изменится на 4, тест завершится неудачей, а после ошибки появится 1, указывающая на ошибку теста, которую можно увидеть во время выполнения.Это не должно быть трудно понять. Если вы посмотрите внимательно, ниже будут соответствующие советы, как показано на рисунке:
Случай сбоя теста 2:
Теперь давайте проверим деление:
@Test
public void testDivision(){
assertEquals(6, new method_junti().division(6, 1));
}
Если делитель изменить здесь на 0, что произойдет: номер ошибки в следующем окне подсказки изменится на 1, есть ошибка. Таким образом, мы получаем следующие два случая:
1. Сбой обычно вызван сбоем метода утверждения, используемого модульным тестом, что означает, что тестовая точка обнаружила проблему, то есть результат вывода программы отличается от ожидаемого. ошибка вызвана исключением кода, которое может быть ошибкой, скрытой в тестируемом коде из-за ошибки в самом тестовом коде.
5. Работающий процесс Junit:
Во-первых, мы создаем новый кейс junit в com.junit под тестовым пакетом и напрямую называем его junit_case. При создании выберите setUpBeforeClass(), tearDownAfterClass(), setUp(), tearDown(), чтобы получить следующий код:
package com.junit;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class Junit_case {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void test() {
fail("Not yet implemented");
}
}
Ниже мы вводим простой оператор вывода в каждый метод, чтобы увидеть их рабочий статус, как показано ниже:
package com.junit;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class Junit_test1 {
/* 1、BeforeClass修饰的方法会在所有方法被调用前执行
* 而且该方法是静态的,所以当测试类被加载后接着就执行它
* 在内存中它只会存在一份,适合加载配置文件
* 2、AfterClass修饰的方法用来对资源的清理,如关闭数据库的连接
* befoer和after修饰的方法在每个test修饰的方法执行前会被各执行一次,假如有两个
* test文件,before和after会被各执行两次;
* */
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeclass");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterclass");
}
@Before
public void setUp() throws Exception {
System.out.println("this is before");
}
@After
public void tearDown() throws Exception {
System.out.println("this is after");
}
@Test
public void test1() {
System.out.println("this is test1");
}
}
Если вы запустите приведенный выше код, вы получите следующий результат
6. Общие аннотации junit:
Выше я объяснил @test, @BeforeClass, @AfterClass, @Before, @After, эти аннотации подробно описаны в блоге этого человека, а соответствующие адреса приведены ниже:blog.CSDN.net/С детства 217/Ах…
Для @test, помимо оформления обычного метода в качестве тестового, он еще может обрабатывать исключения и устанавливать таймауты. Объясним обработку исключений теста.Тест имеет два параметра:ожидаемый и таймаут,то есть обработка исключений и установка таймаута.Если мы выполняем обработку исключений на методе у которого делитель 0 выше,то мы видим,что код может быть нормальным , тест пройден, код такой:
@Test(expected=ArithmeticException.class)
public void testDivision(){
assertEquals(6, new method_junti().division(6, 0));
}
При тестировании некоторых методов, требующих производительности, необходимо установить тайм-аут.Он может определить, может ли ваш код работать и давать результаты в течение этого периода времени.Метод установки следующий:
@Test(timeout=2000)//单位是毫秒
public void testWhile(){
while(true){
System.out.println("run forever");
}
}
@Ignore: добавьте эту модификацию в тестовый метод, и тестовый метод не будет выполняться во время теста;
@RunWith может изменить средство запуска тестов; в дополнение к использованию средства выполнения тестов, предоставленного junit, мы также можем настроить
Наш бегун просто наследует org.junit.runner.Runner
код показывает, как показано ниже:
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuitTest {
public void test(){
/*
* 由于在开发的项目中,测试的类很多,一个一个运行很浪费时间,于是可以写一个测试
* 套件把所有需要测试的类组合在一起测试运行
* 1、写一个测试入口,这个类不含其它的方法;
* 2、更改测试运行器@RunWith(Suite.class)
* 3、将要测试的类作为数组放在@Suite.SuiteClasses({})中;
*/
}
}
7. Настройки параметров junit
В приведенном выше тесте мы протестировали только один набор данных для метода, но в реальных проектах одного набора данных часто бывает недостаточно, нам нужно много наборов данных, если каждый набор массивов пишет тестовый метод Это утомляет наш персонал ! В настоящее время мы можем использовать настройки параметров для решения этой проблемы. код показывает, как показано ниже:
package com.junit;
import static org.junit.Assert.*;
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 {
//声明变量存放预期值和测试数据;
int expected=0;
int input1=0;
int input2=0;
@Parameters
public static Collection<Object[]> test(){
return Arrays.asList(new Object[][]{
{3,1,2},
{4,2,2}
});
}
public ParameterTest(int expected,int input1,int input2){
this.expected=expected;
this.input1=input1;
this.input2=input2;
}
@Test
public void testAdd(){
assertEquals(expected, new method_junti().add(input1, input2));
}
}
Нам нужно протестировать несколько наборов данных, затем нам нужно использовать массивы для хранения нескольких наборов данных, здесь мы используем Arrays.asList для получения.