
Лаб. 2 ТПО
.docxЛабораторная работа №2
Планирование и разработка Unit-тестов
Цель работы: научиться планировать и разрабатывать модульные тесты
Задание
Интерфейс
package org.example; public interface Calculator { /** * Вычисляет сумму двух чисел */ double sum(double a, double b); /** * Вычисляет разность двух чисел a - b */ double subtract(double a, double b); /** * Вычисляет произведение двух чисел */ double multiply(double a, double b); /** * Вычисляет отношение числа а к числу b. * Должен выбросить {@link java.lang.ArithmeticException} если |b| < 10e-8 */ double divide(double a, double b); }
Класс
package org.example; public class CalculatorClass implements Calculator{ public CalculatorClass() { } @Override public double sum(double a, double b){ return a + b; } @Override public double subtract(double a, double b){ return a - b; } @Override public double multiply(double a, double b){ return a * b; } @Override public double divide(double a, double b){ if (Math.abs(b) < 10e-8){ throw new ArithmeticException("Значение b слишком мало: |b| < 10e-8"); } return a / b; } }
Тесты
package org.example; import org.junit.Before; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { CalculatorClass calculator = new CalculatorClass(); @Test void testSum() { assertEquals(5.0, calculator.sum(2.0, 3.0)); assertEquals(-1.0, calculator.sum(-2.0, 1.0)); } @Test void testSubtract() { assertEquals(1.0, calculator.subtract(3.0, 2.0)); assertEquals(-3.0, calculator.subtract(-2.0, 1.0)); } @Test void testMultiply() { assertEquals(6.0, calculator.multiply(2.0, 3.0)); assertEquals(-2.0, calculator.multiply(-2.0, 1.0)); } @Test void testDivide() { assertEquals(2.0, calculator.divide(6.0, 3.0)); assertEquals(-2.0, calculator.divide(-6.0, 3.0)); } @Test void testDivideThrowsException() { Exception exception = assertThrows(ArithmeticException.class, () -> { calculator.divide(1.0, 1e-9); }); assertEquals("Значение b слишком мало: |b| < 10e-8", exception.getMessage()); assertEquals(3.0, calculator.divide(12.0, 4.0)); } }
Результаты
Интерфейс
package org.example; public interface CalculatorView { /** * Отображает результат вычисления */ void printResult(double result); /** * Показывает ошибку, например деление на 0, пустые аргументы и прочее */ void displayError(String message); /** * Возвращает значение, введенное в поле первого аргументы */ String getFirstArgumentAsString(); /** * Возвращает значение, введенное в поле второго аргументы */ String getSecondArgumentAsString(); }
Класс
package org.example; public class CalculatorViewClass implements CalculatorView { private String firstArgumentAsString; private String secondArgumentAsString; public CalculatorViewClass(String firstArgumentAsString, String secondArgumentAsString) { this.firstArgumentAsString = firstArgumentAsString; this.secondArgumentAsString = secondArgumentAsString; } @Override public void printResult(double result){ System.out.println("Результат вычисления: " + result); } @Override public void displayError(String message){ System.out.println("Полученная ошибка: " + message); } @Override public String getFirstArgumentAsString(){ return firstArgumentAsString; } @Override public String getSecondArgumentAsString(){ return secondArgumentAsString; } }
Тесты
package org.example; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorViewTest { private CalculatorViewClass calculatorView; @BeforeEach void setUp() { calculatorView = new CalculatorViewClass("5", "10"); } @Test void testPrintResult() { final java.io.ByteArrayOutputStream outContent = new java.io.ByteArrayOutputStream(); System.setOut(new java.io.PrintStream(outContent)); calculatorView.printResult(15.0); String expected = "Результат вычисления: 15.0"; String actual = outContent.toString(); assertEquals(expected.trim(), actual.trim()); } @Test void testDisplayError() { final java.io.ByteArrayOutputStream outContent = new java.io.ByteArrayOutputStream(); System.setOut(new java.io.PrintStream(outContent)); calculatorView.displayError("Деление на ноль"); String expected = "Полученная ошибка: Деление на ноль"; String actual = outContent.toString(); assertEquals(expected.trim(), actual.trim()); } @Test void testGetFirstArgumentAsString() { assertEquals("5", calculatorView.getFirstArgumentAsString()); } @Test void testGetSecondArgumentAsString() { assertEquals("10", calculatorView.getSecondArgumentAsString()); } }
Результаты