{"id":19411639,"url":"https://github.com/levvolkov/cashbackhacker","last_synced_at":"2026-05-15T18:33:28.217Z","repository":{"id":226487812,"uuid":"768826388","full_name":"levvolkov/cashBackHacker","owner":"levvolkov","description":"1 «Основы автоматизации»     ","archived":false,"fork":false,"pushed_at":"2024-03-23T13:30:28.000Z","size":86,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-12T00:46:54.967Z","etag":null,"topics":["automated-testing","gradle","issues","junit4","test-ng"],"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-07T20:04:57.000Z","updated_at":"2025-02-02T16:02:11.000Z","dependencies_parsed_at":"2024-03-07T21:25:26.868Z","dependency_job_id":"5d1b0273-3b18-450d-be37-6d8cc425f7f1","html_url":"https://github.com/levvolkov/cashBackHacker","commit_stats":null,"previous_names":["levvolkov/cashbackhacker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/levvolkov/cashBackHacker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FcashBackHacker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FcashBackHacker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FcashBackHacker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FcashBackHacker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/levvolkov","download_url":"https://codeload.github.com/levvolkov/cashBackHacker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FcashBackHacker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33074844,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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","gradle","issues","junit4","test-ng"],"created_at":"2024-11-10T12:22:26.383Z","updated_at":"2026-05-15T18:33:28.197Z","avatar_url":"https://github.com/levvolkov.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 1. Домашнее задание к занятию «1.1. Основы автоматизации»\n\n[Инструкция по созданию нового проекта](https://github.com/netology-code/aqa-homeworks/tree/master/basics/project_creation)\n\nВ качестве результата пришлите ссылку на ваш GitHub-проект в личном кабинете студента на сайте [netology.ru](https://netology.ru).\n\nВсе задачи этого занятия нужно делать **в одном репозитории**.\n\n**Важно**: если у вас что-то не получилось, то оформляйте Issue [по установленным правилам](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).\n\n## Как сдавать задачи\n\n1. Инициализируйте на своём компьютере пустой Git-репозиторий.\n1. Добавьте в него готовый файл [.gitignore](https://github.com/netology-code/aqa-homeworks/blob/master/.gitignore).\n1. Добавьте в этот же каталог код вашего приложения.\n1. Сделайте необходимые коммиты.\n1. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым. Не забудьте настроить CI на ветках или PR.\n1. Сделайте пуш — удостоверьтесь, что ваш код появился на GitHub.\n1. Если ваши тесты нашли баг — создайте баг-репорт в GitHub Issue.\n1. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](https://netology.ru).\n1. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачёта.\n\n\n## Задача №1: CashBackHacker\n\n### Введение\n\nВы участвуете в проекте CashBackHacker — это небольшой сервис, который сообщает пользователю о том, сколько ему нужно докупить в рамках конкретной траты, чтобы получить максимальное количество кешбека.\n\nПодробнее: кешбек начисляется за каждую потраченную полную тысячу рублей, поэтому, если вы покупаете что-то на 900 рублей, сервис должен посоветовать вам докупить ещё чего-нибудь на 100 рублей.\n\nКод сервиса выглядит следующим образом:\n\n```java\npackage ru.netology.service;\n\npublic class CashbackHackService {\n    private final int boundary = 1000;\n\n    public int remain(int amount) {\n        return boundary - amount % boundary;\n    }\n}\n```\n\nВам нужно создать проект на базе Gradle, как на лекции, не добавляя в него внешних зависимостей.\n\nВыложите полученный проект на GitHub. Не забудьте о файле [.gitignore](https://github.com/netology-code/aqa-homeworks/blob/master/.gitignore). Подключите GitHub Actions. Можете воспользоваться [примером файла](https://github.com/netology-code/aqa-homeworks/blob/master/basics/gradle.yml) для конфигурации gradle-сборки в Github Actions.\n\n### Легенда\n\nПоскольку вы уже умеете работать с JUnit5, вам поручили провести небольшое исследование, в рамках которого попробовать использовать TestNG и JUnit4 — тот самый пресловутый кейс — попробуем что-то сделать, а потом уже будем принимать решения.\n\n### Часть 1. TestNG\n\n#### Описание\n\nTestNG сравнительно неплохо [документирован](https://testng.org/#_testng_documentation).\n\nНа этом уровне, **с точки зрения пользователя**, почти всё, что поменяется, — мы подключим другую библиотеку и будем использовать аннотации из неё и asserts.\n\n[Ключевые аннотации](https://testng.org/#_annotations) (вы можете прочитать [Javadoc](https://www.javadoc.io/doc/org.testng/testng/7.1.0/org/testng/annotations/package-summary.html)).\n\n[Ключевые asserts](https://testng.org/#_success_failure_and_assert) (вы можете прочитать [Javadoc](https://www.javadoc.io/doc/org.testng/testng/7.1.0/org/testng/asserts/package-summary.html)).\n\n#### Что нужно сделать\n\nСделайте ветку testng, в которой:\n\n1\\. Добавьте в зависимости TestNG:\n```groovy\ndependencies {\n    testImplementation 'org.testng:testng:7.1.0'\n\n}\n\ntest {\n    useTestNG()\n}\n```\n\n2\\. Напишите простые автотесты без параметризации на основании материала следующего раздела.\n\n#### Особенности\n\nНа этом уровне для нас поменяется всего три вещи:\n1. Аннотация `@Test` должна иметь Fully Qualified Name `org.testng.annotations.Test`.\n2. Asserts расположены в классе `org.testng.Assert`. **Обратите внимание**: в TestNG принято `actual, expected` вместо `expected, actual`.\n3. Класс и тестовые методы должны иметь модификатор доступа `public`. Именно поэтому мы вам рекомендовали прописывать модификаторы в тестовых классах. \n\n### Часть 2. JUnit4\n\n#### Описание\n\nJUnit4, по сравнению с JUnit5, практически не документирован, поэтому всё, что нам доступно, — это [Javadoc](https://junit.org/junit4/javadoc/latest/index.html) и [FAQ](https://junit.org/junit4/faq.html).\n\nНа этом уровне, **с точки зрения пользователя**, почти всё, что поменяется, — мы подключим другую библиотеку и будем использовать аннотации из неё и asserts.\n\nКлючевые аннотации (вы можете прочитать Javadoc на них):\n![](https://github.com/netology-code/aqa-homeworks/blob/master/basics/pic/junit4-annotations.png) \n\nКлючевые asserts (вы можете прочитать Javadoc на них):\n![](https://github.com/netology-code/aqa-homeworks/blob/master/basics/pic/junit4-asserts.png) \n\n\n#### Что нужно сделать\n\nСделайте ветку junit4, в которой:\n\n1\\. Добавьте в зависимости JUnit:\n```groovy\ndependencies {\n    testImplementation 'junit:junit:4.13'\n}\n\ntest {\n    useJUnit()\n}\n```\n\n2\\. Напишите простые автотесты без параметризации.\n\n#### Особенности\n\nНа этом уровне для нас поменяется всего три вещи:\n1. Аннотация `@Test` должна иметь Fully Qualified Name `org.junit.Test`.\n2. Asserts расположены в классе `org.junit.Assert`.\n3. Класс и тестовые методы должны иметь модификатор доступа `public`. Именно поэтому мы вам рекомендовали прописывать модификаторы в тестовых классах.\n\n### Об ошибках\n\nВ сервисе точно есть ошибка, поэтому один из ваших автотестов должен падать. На обнаруженный дефект должен быть оформлен репорт [по установленным правилам](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md) \n\n\u003cdetails\u003e\n    \u003csummary\u003eПодсказка\u003c/summary\u003e\n\n    Если пользователь купил ровно на 1000 рублей, то приложение не должно ему говорить, что нужно купить ещё на 1000.\n\u003c/details\u003e\n\n## Задача №2: JUnit5 и legacy (необязательно)\n\n## Легенда\n\nАвтотесты — это тоже код, и он подвержен тем же проблемам, что и обычный код.\n\nДовольно часто встречается ситуация, когда в вашем проекте большое наследие (legacy) кода автотестов, например, на JUnit4.\n\nНо новые тесты хочется писать, используя JUnit5. Что же делать в этом случае?\n\n## Описание\n\nJUnit5 представляет из себя комплексный проект, состоящий из трёх частей: JUnit Platform + JUnit Jupiter + JUnit Vintage.\n\n![](https://github.com/netology-code/aqa-homeworks/blob/master/basics/pic/architecture.png) \n\nДо этого мы достаточно вольно использовали названия JUnit5 и JUnit Jupiter, фактически как синонимы, но начиная с этого ДЗ, мы должны их различать.\n\n- JUnit Platform отвечает за запуск тестовых фреймворков на JVM и определяет интерфейс [`TestEngine`](https://junit.org/junit5/docs/current/api/org.junit.platform.engine/org/junit/platform/engine/TestEngine.html). Это интерфейс, определяющий движок для поиска и запуска тестов. \n- JUnit Jupiter определяет API и реализацию `TestEngine` для запуска тестов, использующих данное API, junit-jupiter-engine — уже готовая реализация `JupiterTestEngine`.\n- JUnit Vintage предоставляет `TestEngine` для запуска тестов, использующих JUnit4 и JUnit3.\n\n#### Что нужно сделать\n\nИз ветки junit4 создайте ветку junit4-platform, в которой:\n\n1\\. Добавьте в зависимости JUnit Vintage:\n```groovy\ndependencies {\n    testImplementation 'junit:junit:4.13'\n    testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.6.2'\n}\n\ntest {\n    useJUnitPlatform()\n}\n```\n\n2\\. Удостоверьтесь, что ваши тесты запускаются.\n\n3\\. Добавьте в зависимости JUnit Jupiter (по факту — замените код из п.1):\n```groovy\ndependencies {\n    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.1'\n    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.1'\n\n    testImplementation 'junit:junit:4.13'\n    testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.6.2'\n}\n\ntest {\n    useJUnitPlatform()\n}\n```\n\n4\\. Напишите те же тесты, но с использованием API JUnit Jupiter.\n\n5\\. Удостоверьтесь, что запускаются и тесты JUnit4, и тесты JUnit Jupiter.\n\n6\\. Соберите отчёты и запакуйте их в zip-архив. Напоминаем, они должны выглядеть примерно так:\n\n![](https://github.com/netology-code/aqa-homeworks/blob/master/basics/pic/report.png)\n\n7\\. Создайте в проекте issue, к которому приложите отчёты. В личном кабинете вам нужно будет отправить ссылку на тот issue, что вы создали для демонстрационного проекта: https://github.com/netology-code/aqa-hw-sample/issues/1.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fcashbackhacker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flevvolkov%2Fcashbackhacker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fcashbackhacker/lists"}