Разделы портала

Онлайн-тренинги

.
Генерация полезных дат для тестирования
30.08.2021 00:00

Автор: Корина Пип (Corina Pip)
Оригинал статьи
Перевод: Ольга Алифанова

Если для тестов вам нужно сгенерировать даты для, к примеру, сегодняшнего или вчерашнего дня, или этого дня год назад, или последнего дня текущего месяца, то эта статья поможет вам в этом. Используя LocalDate в Java, вы легко сможете сгенерировать дату (то есть год, месяц, день), которая необходима вашим тестам.

Красота этого подхода в том, что вам, тестировщику, не нужно знать, какова текущая дата, так как она будет генерироваться при каждом прогоне теста. Допустим, вам нужно, чтобы тест выполнял определенное действие, если сегодня пятница. Выяснить, пятница ли на дворе при прогоне теста, легко можно с LocalDate. Также предположим, что вы хотите ввести в поле последний день текущего месяца. Так как тесты запускаются постоянно, это может быть 30, 31, 28 или даже 29 число. LocalDate поможет и в этом без особых трудностей. Читайте дальше, чтобы узнать, как именно.

Прежде чем что-то делать, нужно импортировать LocalDate в секции импорта тест-класса, где будут генерироваться даты:

import java.time.LocalDate;

Сегодня

Теперь в тест-классе нужно создать переменную LocalDate. В этом примере она инициализируется как сегодняшний день и будет называться "currentDate":

LocalDate currentDate = LocalDate.now();

Допустим, сегодня 22 сентября 2019 года. Значение в переменной "currentDate" будет 2019-09-22.

Получение дня месяца

Допустим, вам надо узнать, какой день месяца сегодня, в форме числа. В смысле, 1 сегодня число, 12 или 22? На основании текущей даты, которая уже хранится в "currentDateЭ, мы можем получить день месяца, используя метод ‘getDayOfMonth()’. Он возвращает целое число.

currentDate.getDayOfMonth()

К примеру, если сегодня 22 сентября 2019, то метод вернет 22.

Получение дня недели

Теперь предположим, что вам надо узнать, какой сегодня день недели – воскресенье? Понедельник? Для этого снова воспользуемся переменной "currentDate" и методом "getDayOfWeek()" – мы получим строку, представляющую собой день недели в верхнем регистре.

currentDate.getDayOfWeek()

Если сегодня 22 сентября 2019 года, то это воскресенье, и результатом вызова метода будет SUNDAY.

Получение месяца

Если вам нужно знать, какой сейчас месяц, то у вас два варианта. Первый: получить название месяца в верхнем регистре как строку, вызывая метод "getMonth()" для переменной "currentDate":

currentDate.getMonth()

Если сегодня 22 сентября 2019 года, то вернувшаяся строка будет SEPTEMBER.

Второй вариант – получить месяц как число. это значит, что для если для той же даты, 22 сентября 2019, мы хотим получить значение 9 как число, то мы воспользуемся методом "getMonthValue()" для переменной "currentDate":

currentDate.getMonthValue()

Завтра (и другие дни в будущем)

Чтобы сгенерировать завтрашнюю дату (на основании сегодняшней, хранящейся в переменной "currentDate"), можно использовать метод "plusDays()". Он принимает число как параметр, определяющий, сколько дней нужно добавить к текущей дате. Если нам нужно получить завтрашнюю дату, мы вызываем метод "plusDays()" с 1 в качестве параметра.

currentDate.plusDays(1))

Если сегодня 22 сентября 2019 года, то метод вернет 2019-09-23.

Если, к примеру, нам нужна дата через три дня после сегодняшней, воспользуемся тем же методом с параметром 3 на этот раз:

currentDate.plusDays(3))

Обратите внимание, что этот метод возвращает тип LocalDate, поэтому если вам нужно сохранить его как строку, нужно вызвать метод toString() для результата:

currentDate.plusDays(3).toString()

Вчера (и другие дни в прошлом)

Теперь, чтобы получить вчерашнюю дату (или дату несколько дней назад), воспользуемся похожим методом – "minusDays()". Он принимает число как параметр, определяющий, на сколько дней в прошлое нам нужно сдвинуться. Если мы хотим получить вчерашнюю дату, значение параметра будет 1:

currentDate.minusDays(1)

Этот метод тоже возвращает тип ‘LocalDate’, и если вам нужна строка, то воспользуйтесь методом toString() для результата:

currentDate.minusDays(1).toString()

Результатом вызова этого метода для параметра со значением 1, если сегодня 22 сентября 2019 года, будет 2019-09-21.

Следующий месяц (или несколько месяцев в будущем)

Существует также метод для добавления месяцев к текущей дате – "plusMonths()". Он тоже принимает число в качестве параметра, определяющего, сколько месяцев добавить к текущей дате. В результате получится дата типа LocalDate, , и если вам нужна строка, то воспользуйтесь методом toString().

Три месяца к текущей дате можно добавить так:

currentDate.plusMonths(3)

Если сегодня 22 сентября 2019 года, то в результате мы получим 2019-12-22.

Прошлый месяц (или несколько месяцев назад)

Получить дату месячной давности от текущей можно методом "minusMonths()". Он принимает число в качестве параметра, определяющего, сколько месяцев нужно вычесть из текущей даты, и возвращает результат типа LocalDate.

Чтобы получить дату на 3 месяца назад от текущей, нужно сделать так:

currentDate.minusMonths(3)

Если сегодня 22 сентября 2019 года, то в результате мы получим 2019-06-22.

Следующий год (или несколько лет в будущем)

Получить дату, следующую спустя несколько лет после текущей, можно методом "plusYears()". Числовой параметр, передаваемый в этот метод, задает, на сколько лет нужно сдвинуться в будущее. Получить дату год спустя типа LocalDate можно вот так:

currentDate.plusYears(1)

Если сегодня 22 сентября 2019 года, то этот метод вернет 2020-09-22.

Прошлый год (или несколько лет назад)

Генерация даты в прошлом путем вычета лет из текущей даты делается через метод "minusYears()". Числовой параметр этого метода определяет, на сколько лет нужно сдвинуться в прошлое.

Получить дату на год назад типа LocalDate можно вот так:

currentDate.minusYears(1)

Если сегодня 22 сентября 2019 года, то метод вернет 2018-09-22.

Сколько дней в месяце

Если вашим тестам нужно знать, сколько дней в определенном месяце, это можно легко выяснить, не генерируя кучу кода. Метод "lengthOfMonth()" даст вам эту информацию. Если нам нужно получить количество дней в текущем месяце на основании переменной "currentDate", это делается так:

currentDate.lengthOfMonth()

Если сейчас сентябрь, метод вернет 30.

Изменить день (месяц, год) текущей даты

Допустим, у вас есть текущая дата, хранящаяся в переменной "currentDate", и вам нужно изменить только день, или месяц, или год в этой дате. Это можно сделать, используя специальные методы: ‘withDayOfMonth()’, ‘withYear()’ и ‘withMonth()’. Каждый из них принимает число в качестве параметра, определяющего, на какой день, год или месяц установить исходное значение.

К примеру, если сегодня 22 сентября 2019 года, но вы хотите изменить дату на 3 сентября 2019 года, нужно сделать вот что:

currentDate.withDayOfMonth(3)

Это фактически меняет значение дня с 22 на значение переданного в "withDayOfMonth()" метод параметра, который равен трем. Результат: 2019-09-03.

Установка даты на последний день месяца

Допустим, текущая дата хранится в переменной "currentDate", но нам нужно изменить ее на последний день текущего месяца. Тут мы используем комбинацию методов ‘withDayOfMonth()’ и ‘lengthOfMonth()’, вот так:

currentDate.withDayOfMonth(currentDate.lengthOfMonth()))

Если сегодня 22 сентября 2019 года, то в результате мы получим 2019-09-30.

Форматирование дат

Как можно отметить, все значения LocalDate имеют формат "год-месяц-день".

Если нам нужна дата в другом формате, вроде "день-месяц-год", можно использовать DateTimeFormatter. Допустим, мы сгенерировали дату недельной давности (используя метод "minusWeeks()"):

LocalDate currentDate = LocalDate.now().minusWeeks(1);

Результат в переменной currentDate, если сегодня 22 сентября 2019 года, будет 2019-09-15.

Теперь нам нужно задать формат, необходимый нам для даты, используя класс DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

Задав формат, нам нужно применить его к "currentDate", передав его как параметр в метод "format()":

String formattedCurrentDate = currentDate.format(formatter);

Значение в переменной "formatterCurrentDate" будет 15-09-2019.

The value stored in the ‘formattedCurrentDate’ variable will now be: 15-09-2019.

Примеры на GitHub

Весь код из статьи можно найти в проекте GitHub: https://github.com/iamalittletester/little-project/blob/master/src/test/java/com/imalittletester/usefuldates/UsefulDatesTest.java

Обсудить в форуме