ТиОПО ПР. Ознакомится с механизмом модульного тестирования для программ, написанных на языке Java, изучить основы разработки модульных тестов, изучить основы работы с junit и Hamcrest
Скачать 71.51 Kb.
|
Оглавление 1 Цель работы 3 2 Практическое задание 3 3 Ход работы 4 4 Вывод 7 5 Список использованных источников 8 Цель работы Ознакомится с механизмом модульного тестирования для программ, написанных на языке Java, изучить основы разработки модульных тестов, изучить основы работы с JUnit и Hamcrest. Практическое задание Написать программу-калькулятор, реализующий функции сложения, вычитания, умножения, деления и подсчёт факториала числа. Осуществить тестирование разрабатываемого проекта, с использованием JUnit и Hamcrest. Создать тестовый класс и реализовать тестирование на проверку сложения малых чисел (например, 0.0000001+0.00000007), больших чисел, деления на ноль, умножения на ноль, проверки подсчёта факториала отрицательного числа, проверки подсчёта факториала числа больше 20. Ход работы В ходе выполнения данной практической работы будет использоваться язык программирования Kotlin, который работает поверх виртуальной машины Java, поэтому поддерживает все написанные для Java библиотеки, включая JUnit и Hamcrest. В начале необходимо написать класс калькулятора, поддерживающего операции сложения, вычитания, умножения, деления и вычисления факториала числа. Исходный код класса показан на Листинге 1. Листинг 1 — Файл main.kt import java.math.BigInteger class Calculator { inner class DivByZeroException : Exception() inner class NegativeNumberException : Exception() fun plus(a: Double, b: Double) = a + b fun minus(a: Double, b: Double) = a - b fun mult(a: Double, b: Double) = a * b fun div(a: Double, b: Double) = when (b) { 0.0 -> throw DivByZeroException() else -> a / b } fun fact(a: Int): BigInteger = when { a < 0 -> throw NegativeNumberException() a == 0 -> 1.toBigInteger() else -> a.toBigInteger().multiply(fact(a - 1)) } } fun main() { val calc = Calculator() println(calc.fact(5)) } В методе div() производится проверка на нулевой знаменатель, поэтому при попытке поделить на ноль программа выбросит соответствующее исключение. Поскольку факториал определен только на множестве неотрицательных целых чисел, в методе fact() производится соответствующая проверка. При попытке вызвать данный метод с отрицательным аргументом программа выбросит соответствующее исключение. Кроме того, факториал является чрезвычайно быстро растущей функцией, поэтому уже при значении аргумента 21 происходит переполнение типа Long. По этой причине метод fact() принимает Int и возвращает BigInteger, поддерживающий большие числа. Далее необходимо написать тесты для класса Calculator. Для этого необходимо поставить курсор на название класса, затем нажать Alt+Enter и выбрать «Create test». В появившемся окне нужно выбрать все методы, которые требуется протестировать. В рамках данной практической работы нужно протестировать все методы класса. В сгенерированном классе CalculatorTest необходимо написать код, тестирующий работу всех методов в соответствии с заданием практической работы. Полный листинг класса для тестирования представлен на Листинге 2. Листинг 2 — Файл CalculatorTest.kt import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual.equalTo import java.math.BigInteger import Calculator.* internal class CalculatorTest { private val calc = Calculator() @org.junit.jupiter.api.Test fun plus() { Array(100) { i -> (Pair(i/500000.0, i/700000.0)) }.forEach { assertThat( "Test of plus operation (small numbers)", calc.plus(it.first, it.second), equalTo(it.first + it.second) )} Array(100) { i -> (Pair(i*500000.0, i*700000.0)) }.forEach { assertThat( "Test of plus (big numbers)", calc.plus(it.first, it.second), equalTo(it.first + it.second) )} } @org.junit.jupiter.api.Test fun minus() { assertThat( "Test of minus operation", calc.minus(234.23, 100.4), equalTo(234.23 - 100.4) ) } @org.junit.jupiter.api.Test fun mult() { repeat(5) { assertThat( "Test of multiplication", calc.mult(it.toDouble(), 123.4), equalTo(it.toDouble() * 123.4) ) } } @org.junit.jupiter.api.Test fun div() { repeat(5) { try { assertThat( "Test of multiplication", calc.div(123.4, it.toDouble()), equalTo(123.4 / it.toDouble()) ) } catch (e: Exception) { if (e !is DivByZeroException) { assertThat("Test of division by zero", false) } } } } @org.junit.jupiter.api.Test fun fact() { assertThat( "Test of factorial(30)", calc.fact(30), equalTo(BigInteger("265252859812191058636308480000000")) ) try { calc.fact(-10) } catch (e: Exception) { if (e !is NegativeNumberException) { assertThat("Test of negative factorial argument", false) } } } } Для большей читаемости тестирующего кода использовалась библиотека Hamcrest. Также, некоторые методы тестировались с помощью циклов с разными значениями. Такие операции калькулятора, как сложение, вычитание, умножение и деление, в процессе тестирования сравнивались с непосредственным выполнением соответствующих арифметических операций над типом Double. В результате исполнения тестирующего класса IDE показывает уведомление об успешном прохождении всех пяти тестов, как показано на Рисунке 1. Рисунок 1 — Успешное прохождение тестирования Вывод В ходе выполнения данной практической работы был освоен механизм модульного тестирования для программ, написанных на языке Kotlin, а также изучены основы разработки модульных тестов с использованием JUnit и Hamcrest. Список использованных источников Куликов, С. С. Тестирование программного обеспечения. Базовый курс / С. С. Куликов. — Минск: Четыре четверти, 2017. — 312 с. Тестирование ПО. URL: http://www.protesting.ru/testing/. (Дата обращения: 27.03.2021). Майерс, Г. Искусство тестирования программ / Г. Майерс, Т. Баджетт, К. Сандлер. – 3е изд., Москва : Диалектика, 2019. – 272 с. Software-Testing.ru. URL : https://www.software-testing.ru/. (Дата обращения: 27.03.2021) |