{"id":19411629,"url":"https://github.com/levvolkov/patterns2","last_synced_at":"2026-04-13T12:01:58.156Z","repository":{"id":230265246,"uuid":"778935464","full_name":"levvolkov/patterns2","owner":"levvolkov","description":"5.2 «Patterns»  ","archived":false,"fork":false,"pushed_at":"2024-03-28T18:14:57.000Z","size":10128,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-29T03:54:45.926Z","etag":null,"topics":["automated-testing","github-actions","gradle","patterns"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/levvolkov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-28T17:42:37.000Z","updated_at":"2025-02-02T16:01:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"f78552a1-9323-4f50-85b2-de3ba0bea745","html_url":"https://github.com/levvolkov/patterns2","commit_stats":null,"previous_names":["levvolkov/patterns2"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/levvolkov/patterns2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2Fpatterns2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2Fpatterns2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2Fpatterns2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2Fpatterns2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/levvolkov","download_url":"https://codeload.github.com/levvolkov/patterns2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2Fpatterns2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31751705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automated-testing","github-actions","gradle","patterns"],"created_at":"2024-11-10T12:22:24.462Z","updated_at":"2026-04-13T12:01:58.126Z","avatar_url":"https://github.com/levvolkov.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Java CI with Gradle](https://github.com/LevVolkov/Patterns2/actions/workflows/gradle.yml/badge.svg)](https://github.com/LevVolkov/Patterns2/actions/workflows/gradle.yml)\n\n# 5.2 Домашнее задание к занятию «2.3. Patterns»\n\nВ качестве результата пришлите ссылку на ваш GitHub-проект в личном кабинете студента на сайте [netology.ru](https://netology.ru).\n\nВсе задачи этого занятия нужно делать **в разных репозиториях**.\n\n[Шаблон для ДЗ](https://github.com/netology-code/aqa-code/tree/master/patterns).\n\n**Важно**: проекты с решением задач по данной теме реализуются с использованием Selenide.\n\n**Важно**: если у вас что-то не получилось, то оформляйте issue [по установленным правилам](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).\n\n**Важно**: не делайте ДЗ всех занятий в одном репозитории. Иначе вам потом придётся достаточно сложно подключать системы Continuous integration.\n\n## Как сдавать задачи\n\n1. Инициализируйте на своём компьютере пустой Git-репозиторий.\n1. Добавьте в него готовый файл [.gitignore](https://github.com/netology-code/aqa-homeworks/blob/master/.gitignore).\n1. Добавьте в этот же каталог код ваших автотестов.\n1. Сделайте необходимые коммиты.\n1. Добавьте в каталог `artifacts` целевой сервис: [app-replan-delivery.jar](https://github.com/netology-code/aqa-homeworks/blob/master/patterns/app-replan-delivery.jar) для первой задачи, [app-ibank.jar](https://github.com/netology-code/aqa-homeworks/blob/master/patterns/app-ibank.jar) для второй задачи.        \n1. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым.\n1. Сделайте пуш — удостоверьтесь, что ваш код появился на GitHub.\n1. Выполните интеграцию проекта с Github Actions ([инструкция](https://github.com/netology-code/aqa-homeworks/tree/master/github-actions-integration)) или Appveyor ([инструкция](https://github.com/netology-code/aqa-homeworks/tree/master/api-ci#appveyor)) на выбор, удостоверьтесь что автотесты в CI выполняются.       \n1. Поставьте бейджик сборки вашего проекта в файл README.md.\n1. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](https://netology.ru).\n1. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачёта.\n1. Автотесты могут падать и сборка может быть красной из-за багов тестируемого приложения. В таком случае должны быть заведены репорты на обнаруженные в ходе тестирования дефекты в отдельных issues, [придерживайтесь схемы при описании](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).\n\n## Настройка CI\n    \nНастройка CI осуществляется аналогично предыдущему заданию, за исключением того, что файл целевого сервиса может называться по-другому. Для второй задачи вам также понадобится указать нужный флаг запуска для тестового режима.\n\n## Задача №1: заказ доставки карты (изменение даты)\n\nВам необходимо автоматизировать тестирование новой функции формы заказа доставки карты:\n\n![](https://github.com/netology-code/aqa-homeworks/blob/master/patterns/pic/order.png)\n\nТребования к содержимому полей, сообщения и другие элементы, по словам заказчика и разработчиков, такие же, они ничего не меняли.\n\nПримечание: личный совет — не забудьте это перепроверить, никому нельзя доверять 😈\n\nТестируемая функциональность: если заполнить форму повторно теми же данными, за исключением «Даты встречи», то система предложит перепланировать время встречи:\n\n![](https://github.com/netology-code/aqa-homeworks/blob/master/patterns/pic/replan.png)\n\nПосле нажатия кнопки «Перепланировать» произойдёт перепланирование встречи:\n\n![](https://github.com/netology-code/aqa-homeworks/blob/master/patterns/pic/success.png)\n\n**Важно:** в этот раз вы не должны хардкодить данные прямо в тест. Используйте Faker, Lombok, data-классы для группировки нужных полей и утилитный класс-генератор данных — см. пример в презентации. \n\nУтилитными называют классы, у которых приватный конструктор и статичные методы.\n\nОбратите внимание, что Faker может генерировать не совсем в нужном для вас формате.\n\nПоскольку файлы с расширением `.jar` находятся в списках `.gitignore`, вам нужно принудительно \u003c/br\u003e заставить Git следить за ними: `git add -f artifacts/app-replan-delivery.jar`.\n\nДля запуска учебного сервиса, находясь в папке проекта, выполните в терминале команду        \n```\njava -jar ./artifacts/app-replan-delivery.jar\n```\n\nПосле чего сделать `git push`. Обязательно удостоверьтесь, что файл попал в репозиторий.\n## Задача №2: тестовый режим\n\nРазработчики интернет-банка, изрядно поворчав, предоставили вам тестовый режим запуска целевого сервиса, в котором открыта программная возможность создания клиентов банка, чтобы вы могли протестировать хотя бы функцию входа.\n\nДля удобства вам предоставили документацию, которая описывает возможность программного создания клиентов банка через API. Вот дословно представленное ими описание:\n```\nДля создания клиента нужно делать запрос вида:\n\nPOST /api/system/users\nContent-Type: application/json\n\n{\n    \"login\": \"vasya\",\n    \"password\": \"password\",\n    \"status\": \"active\" \n}\n\nВозможные значения поля «Статус»:\n* «active» — пользователь активен,\n* «blocked» — пользователь заблокирован.\n\nВ случае успешного создания пользователя возвращается код 200.\n\nПри повторной передаче пользователя с таким же логином будет выполнена перезапись данных пользователя.\n```\n\nДавайте вместе разбираться. Мы уже проходили:\n* клиент-серверное взаимодействие,\n* HTTP-методы и коды ответов,\n* формат данных JSON,\n* REST-assured.\n\nМы настоятельно рекомендуем ознакомиться с документацией и примерами на [Rest-assured](http://rest-assured.io).\n\nПодключается обычным образом в Gradle:\n```groovy\ntestImplementation 'io.rest-assured:rest-assured:4.3.0'\ntestImplementation 'com.google.code.gson:gson:2.8.6'\n```\n\nБиблиотека [Gson](https://github.com/google/gson) нужна для того, чтобы иметь возможность сериализовать Java-объекты в JSON.\n\nТо есть мы не руками пишем JSON, а создаём data-классы, объекты которых и преобразуются в JSON.\n\nДальнейшее использование выглядит следующим образом:\n```java\n// спецификация нужна для того, чтобы переиспользовать настройки в разных запросах\nclass AuthTest {\n    private static RequestSpecification requestSpec = new RequestSpecBuilder()\n        .setBaseUri(\"http://localhost\")\n        .setPort(9999)\n        .setAccept(ContentType.JSON)\n        .setContentType(ContentType.JSON)\n        .log(LogDetail.ALL)\n        .build();\n\n    @BeforeAll\n    static void setUpAll() {\n        // сам запрос\n        given() // \"дано\"\n            .spec(requestSpec) // указываем, какую спецификацию используем \n            .body(new RegistrationDto(\"vasya\", \"password\", \"active\")) // передаём в теле объект, который будет преобразован в JSON\n        .when() // \"когда\" \n            .post(\"/api/system/users\") // на какой путь относительно BaseUri отправляем запрос\n        .then() // \"тогда ожидаем\"\n            .statusCode(200); // код 200 OK\n    }\n    ...\n}\n```\n\nЭто не лучший формат организации, будет лучше, если, как в предыдущей задаче, вы вынесете это в класс-генератор, который по требованию вам будет создавать рандомного пользователя, сохранять его через API и возвращать вам в тест.\n\nВ логах теста вы увидите:\n```\nRequest method:\tPOST\nRequest URI:\thttp://localhost:9999/api/system/users\nProxy:\t\t\t\u003cnone\u003e\nRequest params:\t\u003cnone\u003e\nQuery params:\t\u003cnone\u003e\nForm params:\t\u003cnone\u003e\nPath params:\t\u003cnone\u003e\nHeaders:\t\tAccept=application/json, application/javascript, text/javascript, text/json\n\t\t\t\tContent-Type=application/json; charset=UTF-8\nCookies:\t\t\u003cnone\u003e\nMultiparts:\t\t\u003cnone\u003e\nBody:\n{\n    \"login\": \"vasya\",\n    \"password\": \"password\",\n    \"status\": \"active\" \n}\n```\n\nПоскольку файлы с расширением `.jar` находятся в списках `.gitignore`, вам нужно \u003c/br\u003e принудительно заставить Git следить за ними: `git add -f artifacts/app-ibank.jar`.\n\n\nДля активации этого тестового режима при запуске SUT нужно указать флаг `-P:profile=test`, то есть:\n`java -jar app-ibank.jar -P:profile=test`.\n\n**Важно:** если вы не активируете тестовый режим, любые запросы на http://localhost:9999/api/system/users будут вам возвращать 404 Not Found. \n\nВам нужно самостоятельно изучить реакцию приложения на различные комбинации случаев, для этого придётся вспомнить комбинаторику:\n* наличие пользователя;\n* статус пользователя;\n* невалидный логин;\n* невалидный пароль.\n\nДополнительно: оцените время, которое вы затратили на автоматизацию, и время, за которое вы проверили бы те же сценарии вручную, используя для тестирования интерфейса браузер и Postman для доступа к открытому API.\n\nПриложите к решению задачи в формате:\n* время, затраченное на ручное тестирование (минут): x;\n* время, затраченное на автоматизацию (минут): y.\n\n#### Подсказка\n\n\u003e Не читайте этот раздел сразу, попытайтесь сначала решить задачу самостоятельно :)\n\n\u003cdetails\u003e\n\n\u003csummary\u003eКак подключить Lombok\u003c/summary\u003e\n\nПосмотрите видео «Lombok \u0026 Lambda» в уроке «Основы автоматизации».\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fpatterns2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flevvolkov%2Fpatterns2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fpatterns2/lists"}