diff --git a/README.md b/README.md index 49a5146..3d4c8bb 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,18 @@ -![](https://i.postimg.cc/D0zVsMFv/5fb0706dfacf60e0d6152bfa2c39d6db.png) +# Введение -[**>>> ЧИТАТЬ <<<**](https://vladislaveremeev.gitbook.io/qa_bible/) +![](https://lh4.googleusercontent.com/3vOk0NqvhT3rVjNa-n8BtCfTWXq2sdBu1dUVsZvK3-gkD8c3KhsH2BL6TPX5KDFr2lEhuSqm\_bcy3UwAQFOpY6MlE\_PEBiR5g9uzJuS5SaAZI9oyhAG77QhmJXHvXhPuFVRTa\_wK) -**Что это за проект?** +**Что это за проект?** “Библия QA” - это обновляемая база знаний объемом 560+ страниц: - - * Ответы на самые популярные вопросы новичков о профессии и старте карьеры; * Крупнейшая подборка ссылок и полезных ресурсов; * Конспект всевозможной теории и ответов на вопросы с реальных собеседований. **Дисклеймер**: - - * Материал не проектировался как обучающий, за этим на хорошие курсы или в фундаментальные книги; * Здесь можно найти очень многое, но это не значит, что всё это нужно знать. Это копилка, а не учебник. Перечень тем для джунов есть в f.a.q; * Конспект теории авторский и составлен одним простым человеком, который не senior. Каждую из тем наверняка можно написать полнее и правильнее, ссылки подобрать получше, но на это уйдет еще не один год; -* Проект находится в свободном доступе, не содержит рекламы и открыт для контрибьютинга. +* Проект находится в свободном доступе, не содержит рекламы и открыт для контрибьютинга. diff --git a/SUMMARY.md b/SUMMARY.md index fb6dd4b..5dee6ab 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,3 +1,213 @@ # Table of contents -* [Page 1](README.md) +* [Введение](README.md) +* [FAQ для новичков](faq-dlya-novichkov/README.md) + * [Ответы на самые популярные вопросы новичков в чатах](faq-dlya-novichkov/otvety-na-samye-populyarnye-voprosy-novichkov-v-chatakh.md) + * [Качества и навыки, которыми нужно обладать тестировщику?](faq-dlya-novichkov/kachestva-i-navyki-kotorymi-nuzhno-obladat-testirovshiku.md) + * [Что должен знать и уметь Junior? Что спросят на собеседовании?](faq-dlya-novichkov/chto-dolzhen-znat-i-umet-junior-chto-sprosyat-na-sobesedovanii.md) + * [С чего начать обучение и куда развиваться?](faq-dlya-novichkov/s-chego-nachat-obuchenie-i-kuda-razvivatsya.md) + * [Как составить резюме?](faq-dlya-novichkov/kak-sostavit-rezyume.md) + * [Где искать работу?](faq-dlya-novichkov/gde-iskat-rabotu.md) + * [Как происходит процесс найма?](faq-dlya-novichkov/kak-proiskhodit-process-naima.md) + * [Как проходить собеседование?](faq-dlya-novichkov/kak-prokhodit-sobesedovanie.md) + * [Начало работы Junior-тестировщика](faq-dlya-novichkov/nachalo-raboty-junior-testirovshika.md) + * [Ошибки в работе у начинающих тестировщиков](faq-dlya-novichkov/oshibki-v-rabote-u-nachinayushikh-testirovshikov.md) + * [Как взаимодействовать с коллегами?](faq-dlya-novichkov/kak-vzaimodeistvovat-s-kollegami.md) + * [Перспективы профессии](faq-dlya-novichkov/perspektivy-professii.md) +* [Полезные ссылки](poleznye-ssylki/README.md) + * [Список полезных ресурсов на разных платформах](poleznye-ssylki/spisok-poleznykh-resursov-na-raznykh-platformakh.md) + * [Список ресурсов по инструментам тестировщика](poleznye-ssylki/spisok-resursov-po-instrumentam-testirovshika.md) +* [Общее](obshee/README.md) + * [QA/QC/Testing](obshee/qa-qc-testing.md) + * [Почему требуется тестирование ПО?](obshee/pochemu-trebuetsya-testirovanie-po.md) + * [Качество ПО (Software Quality)](obshee/kachestvo-po-software-quality.md) + * [Принципы тестирования](obshee/principy-testirovaniya.md) + * [Верификация и валидация (Verification and Validation)](obshee/verifikaciya-i-validaciya-verification-and-validation.md) + * [Дефекты и ошибки](obshee/defekty-i-oshibki.md) + * [Серьезность и приоритет Дефекта (Severity & Priority)](obshee/sereznost-i-prioritet-defekta-severity-and-priority.md) + * [Альфа- и бета- тестирование (Alpha Testing and Beta Testing)](obshee/alfa-i-beta-testirovanie-alpha-testing-and-beta-testing.md) + * [Процесс тестирования (test process) (draft)](obshee/process-testirovaniya-test-process-draft.md) + * [Техники оценки тестов/оценка трудозатрат на тестирование (Test Estimation)](obshee/tekhniki-ocenki-testov-ocenka-trudozatrat-na-testirovanie-test-estimation.md) + * [Экономика тестирования/стоимость качества (Cost of quality)](obshee/ekonomika-testirovaniya-stoimost-kachestva-cost-of-quality.md) + * [Подход к тестированию (Test Approach)](obshee/podkhod-k-testirovaniyu-test-approach.md) + * [Импакт анализ (анализ влияния, Impact Analysis)](obshee/impakt-analiz-analiz-vliyaniya-impact-analysis.md) + * [Анализ первопричин (RCA - Root Cause Analysis)](obshee/analiz-pervoprichin-rca-root-cause-analysis.md) + * [Тестирование со сдвигом влево (Shift left testing)](obshee/testirovanie-so-sdvigom-vlevo-shift-left-testing.md) + * [Модель зрелости возможностей (CMM - Capability Maturity Model)](obshee/model-zrelosti-vozmozhnostei-cmm-capability-maturity-model.md) + * [Тестовая среда и тестовый стенд (Test Environment/Test Bed)](obshee/testovaya-sreda-i-testovyi-stend-test-environment-test-bed.md) + * [Бизнес-логика (Business logic)](obshee/biznes-logika-business-logic.md) + * [Политика отсутствия багов (ZBP - Zero Bug Policy)](obshee/politika-otsutstviya-bagov-zbp-zero-bug-policy.md) + * [Независимое тестирование (Independent testing)](obshee/nezavisimoe-testirovanie-independent-testing.md) + * [Роли/должности в команде](obshee/roli-dolzhnosti-v-komande.md) + * [Эвристики и мнемоники](obshee/evristiki-i-mnemoniki.md) +* [Виды-методы-уровни тестирования](vidy-metody-urovni-testirovaniya/README.md) + * [Методы тестирования (White/Black/Grey Box)](vidy-metody-urovni-testirovaniya/metody-testirovaniya-white-black-grey-box.md) + * [Тестирование методом черного ящика (Black Box Testing)](vidy-metody-urovni-testirovaniya/testirovanie-metodom-chernogo-yashika-black-box-testing.md) + * [Тестирование методом белого ящика (White Box Testing)](vidy-metody-urovni-testirovaniya/testirovanie-metodom-belogo-yashika-white-box-testing.md) + * [Тестирование методом серого ящика (Grey Box Testing)](vidy-metody-urovni-testirovaniya/testirovanie-metodom-serogo-yashika-grey-box-testing.md) + * [Статическое и динамическое тестирование (Static Testing, Dynamic Testing)](vidy-metody-urovni-testirovaniya/staticheskoe-i-dinamicheskoe-testirovanie-static-testing-dynamic-testing.md) + * [Пирамида / уровни тестирования (Test Pyramid / Testing Levels)](vidy-metody-urovni-testirovaniya/piramida-urovni-testirovaniya-test-pyramid-testing-levels.md) + * [Модульное/юнит/компонентное тестирование (Module/Unit/Component testing)](vidy-metody-urovni-testirovaniya/modulnoe-yunit-komponentnoe-testirovanie-module-unit-component-testing.md) + * [Интеграционное тестирование (Integration testing)](vidy-metody-urovni-testirovaniya/integracionnoe-testirovanie-integration-testing.md) + * [Системное тестирование (System Testing)](vidy-metody-urovni-testirovaniya/sistemnoe-testirovanie-system-testing.md) + * [Приемочное тестирование (AT - Acceptance testing)](vidy-metody-urovni-testirovaniya/priemochnoe-testirovanie-at-acceptance-testing.md) + * [Основные виды тестирования ПО](vidy-metody-urovni-testirovaniya/osnovnye-vidy-testirovaniya-po.md) + * [Функциональное тестирование (Functional/Behavioral testing)](vidy-metody-urovni-testirovaniya/funkcionalnoe-testirovanie-functional-behavioral-testing.md) + * [Нефункциональное тестирование (Non-Functional testing)](vidy-metody-urovni-testirovaniya/nefunkcionalnoe-testirovanie-non-functional-testing.md) + * [Тестирование производительности (Performance testing)](vidy-metody-urovni-testirovaniya/testirovanie-proizvoditelnosti-performance-testing.md) + * [Тестирование емкости (Capacity testing)](vidy-metody-urovni-testirovaniya/testirovanie-emkosti-capacity-testing.md) + * [Нагрузочное тестирование (Load testing)](vidy-metody-urovni-testirovaniya/nagruzochnoe-testirovanie-load-testing.md) + * [Стрессовое тестирование (Stress testing)](vidy-metody-urovni-testirovaniya/stressovoe-testirovanie-stress-testing.md) + * [Тестирование масштабируемости (Scalability testing)](vidy-metody-urovni-testirovaniya/testirovanie-masshtabiruemosti-scalability-testing.md) + * [Объемное тестирование (Volume testing)](vidy-metody-urovni-testirovaniya/obemnoe-testirovanie-volume-testing.md) + * [Тестирование выносливости/стабильности (Endurance/Soak/Stability testing)](vidy-metody-urovni-testirovaniya/testirovanie-vynoslivosti-stabilnosti-endurance-soak-stability-testing.md) + * [Тестирование устойчивости (Resilience testing)](vidy-metody-urovni-testirovaniya/testirovanie-ustoichivosti-resilience-testing.md) + * [Тестирование надежности (Reliability Testing)](vidy-metody-urovni-testirovaniya/testirovanie-nadezhnosti-reliability-testing.md) + * [Тестирование на отказ и восстановление (Failover and Recovery testing)](vidy-metody-urovni-testirovaniya/testirovanie-na-otkaz-i-vosstanovlenie-failover-and-recovery-testing.md) + * [Эталонное и базовое тестирование (Benchmark and Baseline Testing)](vidy-metody-urovni-testirovaniya/etalonnoe-i-bazovoe-testirovanie-benchmark-and-baseline-testing.md) + * [Тестирование хранилища (Storage testing)](vidy-metody-urovni-testirovaniya/testirovanie-khranilisha-storage-testing.md) + * [Одновременное / многопользовательское тестирование (Concurrency/Multi-user testing)](vidy-metody-urovni-testirovaniya/odnovremennoe-mnogopolzovatelskoe-testirovanie-concurrency-multi-user-testing.md) + * [Тестирование сервиса (Service Testing)](vidy-metody-urovni-testirovaniya/testirovanie-servisa-service-testing.md) + * [Тестирование безопасности (Security and Access Control testing)](vidy-metody-urovni-testirovaniya/testirovanie-bezopasnosti-security-and-access-control-testing.md) + * [Оценка уязвимости/защищенности (Vulnerability Assessment)](vidy-metody-urovni-testirovaniya/ocenka-uyazvimosti-zashishennosti-vulnerability-assessment.md) + * [Фаззинг-тестирование (Fuzz testing)](vidy-metody-urovni-testirovaniya/fazzing-testirovanie-fuzz-testing.md) + * [Можно ли отнести тестирование безопасности или нагрузочное тестирование к функциональным видам тести](vidy-metody-urovni-testirovaniya/mozhno-li-otnesti-testirovanie-bezopasnosti-ili-nagruzochnoe-testirovanie-k-funkcionalnym-vidam-test.md) + * [Тестирование совместимости/взаимодействия (Compatibility/Interoperability testing)](vidy-metody-urovni-testirovaniya/testirovanie-sovmestimosti-vzaimodeistviya-compatibility-interoperability-testing.md) + * [Конфигурационное тестирование (Configuration testing)](vidy-metody-urovni-testirovaniya/konfiguracionnoe-testirovanie-configuration-testing.md) + * [Инсталляционное тестирование (Installation Testing)](vidy-metody-urovni-testirovaniya/installyacionnoe-testirovanie-installation-testing.md) + * [Тестирование на соответствие (Conformance/Compliance testing)](vidy-metody-urovni-testirovaniya/testirovanie-na-sootvetstvie-conformance-compliance-testing.md) + * [Тестирование удобства пользования (Usability testing)](vidy-metody-urovni-testirovaniya/testirovanie-udobstva-polzovaniya-usability-testing.md) + * [Тестирование доступности (Accessibility testing)](vidy-metody-urovni-testirovaniya/testirovanie-dostupnosti-accessibility-testing.md) + * [Тестирование локализации, глобализации и интернационализации (Localization/ globalization/internatio](vidy-metody-urovni-testirovaniya/testirovanie-lokalizacii-globalizacii-i-internacionalizacii-localization-globalization-internatio.md) + * [Исследовательское тестирование (Exploratory testing)](vidy-metody-urovni-testirovaniya/issledovatelskoe-testirovanie-exploratory-testing.md) + * [Свободное / Интуитивное тестирование (Adhoc, Ad-hoc Testing)](vidy-metody-urovni-testirovaniya/svobodnoe-intuitivnoe-testirovanie-adhoc-ad-hoc-testing.md) + * [Тестирование поддержки (Maintenance testing)](vidy-metody-urovni-testirovaniya/testirovanie-podderzhki-maintenance-testing.md) + * [Регрессионные виды тестирования (Regression testing)](vidy-metody-urovni-testirovaniya/regressionnye-vidy-testirovaniya-regression-testing.md) + * [Тестирование клиентской части и серверной (Frontend testing Vs. Backend testing)](vidy-metody-urovni-testirovaniya/testirovanie-klientskoi-chasti-i-servernoi-frontend-testing-vs.-backend-testing.md) + * [Тестирование графического интерфейса/визуальное тестирование (GUI - Graphical User Interface testing](vidy-metody-urovni-testirovaniya/testirovanie-graficheskogo-interfeisa-vizualnoe-testirovanie-gui-graphical-user-interface-testing.md) + * [Тестирование API (API - Application Programming Interface)](vidy-metody-urovni-testirovaniya/testirovanie-api-api-application-programming-interface.md) + * [A/B тестирование (A/B Testing)](vidy-metody-urovni-testirovaniya/a-b-testirovanie-a-b-testing.md) + * [Деструктивное и недеструктивное тестирование (DT - Destructive testing and NDT - Non Destructive tes](vidy-metody-urovni-testirovaniya/destruktivnoe-i-nedestruktivnoe-testirovanie-dt-destructive-testing-and-ndt-non-destructive-tes.md) + * [Выборочное/хаотическое тестирование (Random/monkey testing)](vidy-metody-urovni-testirovaniya/vyborochnoe-khaoticheskoe-testirovanie-random-monkey-testing.md) + * [Тестирование рабочего процесса/воркфлоу (Workflow testing)](vidy-metody-urovni-testirovaniya/testirovanie-rabochego-processa-vorkflou-workflow-testing.md) + * [Тестирование документации (Documentation testing)](vidy-metody-urovni-testirovaniya/testirovanie-dokumentacii-documentation-testing.md) + * [Как протестировать продукт без требований?](vidy-metody-urovni-testirovaniya/kak-protestirovat-produkt-bez-trebovanii.md) + * [Кроссбраузерное тестирование (Cross-browser testing)](vidy-metody-urovni-testirovaniya/krossbrauzernoe-testirovanie-cross-browser-testing.md) + * [Тестирование, основанное на рисках (Risk-Based Testing)](vidy-metody-urovni-testirovaniya/testirovanie-osnovannoe-na-riskakh-risk-based-testing.md) + * [Разница тестирования ПО и железа (Software Vs. Hardware testing)](vidy-metody-urovni-testirovaniya/raznica-testirovaniya-po-i-zheleza-software-vs.-hardware-testing.md) + * [Тестирование качества данных (Data Quality Testing)](vidy-metody-urovni-testirovaniya/testirovanie-kachestva-dannykh-data-quality-testing.md) +* [Тест дизайн](test-dizain/README.md) + * [Тест-дизайн и техники тест-дизайна (Test Design and Software Testing Techniques)](test-dizain/test-dizain-i-tekhniki-test-dizaina-test-design-and-software-testing-techniques.md) + * [Static - Reviews](test-dizain/static-reviews.md) + * [Static - Static Analysis](test-dizain/static-static-analysis.md) + * [Dynamic - White box](test-dizain/dynamic-white-box.md) + * [Dynamic - Black box](test-dizain/dynamic-black-box.md) + * [Dynamic - Experience based](test-dizain/dynamic-experience-based.md) +* [Тестовая документация и артефакты (Test Deliverablestest artifacts)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/README.md) + * [Виды тестовой документации](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/vidy-testovoi-dokumentacii.md) + * [Политика качества и политика тестирования (Quality policy and Test policy)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/politika-kachestva-i-politika-testirovaniya-quality-policy-and-test-policy.md) + * [Стратегия тестирования (Test strategy)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/strategiya-testirovaniya-test-strategy.md) + * [План тестирования (Test plan)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/plan-testirovaniya-test-plan.md) + * [Тестовый сценарий (Test scenario)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/testovyi-scenarii-test-scenario.md) + * [Тест-кейс (Test case)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/test-keis-test-case.md) + * [Чек-лист (Check List)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/chek-list-check-list.md) + * [Баг-репорт (Defect/bug report)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/bag-report-defect-bug-report.md) + * [Требования (Requirements)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/trebovaniya-requirements.md) + * [Пользовательские истории (User stories)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/polzovatelskie-istorii-user-stories.md) + * [Критерии приемки (Acceptance Criteria)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/kriterii-priemki-acceptance-criteria.md) + * [Виды отчетов (Reports)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/vidy-otchetov-reports.md) + * [Базис тестирования (Test basis)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/bazis-testirovaniya-test-basis.md) + * [Матрица трассируемости (RTM - Requirement Traceability Matrix)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/matrica-trassiruemosti-rtm-requirement-traceability-matrix.md) + * [Метрики тестирования (Software Test Metrics)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/metriki-testirovaniya-software-test-metrics.md) + * [Тестовый оракул (Test oracle)](testovaya-dokumentaciya-i-artefakty-test-deliverablestest-artifacts/testovyi-orakul-test-oracle.md) +* [Мобильное тестирование](mobilnoe-testirovanie/README.md) + * [Особенности в тестировании мобильных приложений](mobilnoe-testirovanie/osobennosti-v-testirovanii-mobilnykh-prilozhenii.md) + * [Типы мобильных приложений](mobilnoe-testirovanie/tipy-mobilnykh-prilozhenii.md) + * [Симуляторы и эмуляторы](mobilnoe-testirovanie/simulyatory-i-emulyatory.md) + * [Архитектура Android OS](mobilnoe-testirovanie/arkhitektura-android-os.md) + * [Архитектура Android Application](mobilnoe-testirovanie/arkhitektura-android-application.md) + * [Архитектура iOS](mobilnoe-testirovanie/arkhitektura-ios.md) + * [Архитектура iOS Application](mobilnoe-testirovanie/arkhitektura-ios-application.md) + * [Android/iOS Developer Settings](mobilnoe-testirovanie/android-ios-developer-settings.md) + * [Основные различия Android/iOS](mobilnoe-testirovanie/osnovnye-razlichiya-android-ios.md) + * [Последнее обновление Android/iOS, что нового?](mobilnoe-testirovanie/poslednee-obnovlenie-android-ios-chto-novogo.md) + * [Основные проверки при тестировании мобильного приложения](mobilnoe-testirovanie/osnovnye-proverki-pri-testirovanii-mobilnogo-prilozheniya.md) + * [Каким образом тестировщик получает приложение на тест?](mobilnoe-testirovanie/kakim-obrazom-testirovshik-poluchaet-prilozhenie-na-test.md) + * [Как успешно зарелизить продукт в App Store и Google Play](mobilnoe-testirovanie/kak-uspeshno-zarelizit-produkt-v-app-store-i-google-play.md) + * [Тестирование требований к мобильным приложениям](mobilnoe-testirovanie/testirovanie-trebovanii-k-mobilnym-prilozheniyam.md) + * [Тестирование push-уведомлений](mobilnoe-testirovanie/testirovanie-push-uvedomlenii.md) + * [Тестирование дип линков (mobile deep links)](mobilnoe-testirovanie/testirovanie-dip-linkov-mobile-deep-links.md) + * [Тестирование сохраненных поисков](mobilnoe-testirovanie/testirovanie-sokhranennykh-poiskov.md) + * [Тестирование покупок в Android-приложениях](mobilnoe-testirovanie/testirovanie-pokupok-v-android-prilozheniyakh.md) + * [Тестирование покупок в iOS-приложениях](mobilnoe-testirovanie/testirovanie-pokupok-v-ios-prilozheniyakh.md) + * [Тестирование рекламы](mobilnoe-testirovanie/testirovanie-reklamy.md) + * [Тестирование просмотренных товаров](mobilnoe-testirovanie/testirovanie-prosmotrennykh-tovarov.md) + * [Покрытие девайсов](mobilnoe-testirovanie/pokrytie-devaisov.md) + * [Middleware](mobilnoe-testirovanie/middleware.md) + * [Android Debug Bridge (ADB)](mobilnoe-testirovanie/android-debug-bridge-adb.md) + * [Как проверить использование ресурсов на Android](mobilnoe-testirovanie/kak-proverit-ispolzovanie-resursov-na-android.md) + * [Как протестировать приложение для другой страны?](mobilnoe-testirovanie/kak-protestirovat-prilozhenie-dlya-drugoi-strany.md) +* [Тестирование в разных сферах-областях (testing different domains)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/README.md) + * [Тестирование веб-сайта или веб-приложения (Web application)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-veb-saita-ili-veb-prilozheniya-web-application.md) + * [Тестирование интернет-магазина (eCommerce)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-internet-magazina-ecommerce.md) + * [Тестирование платежного шлюза (Payment Gateway)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-platezhnogo-shlyuza-payment-gateway.md) + * [Тестирование игр (Game testing)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-igr-game-testing.md) + * [Тестирование VR программного обеспечения](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-vr-programmnogo-obespecheniya.md) + * [Тестирование мессенджера (Messenger)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-messendzhera-messenger.md) + * [Тестирование чат-бота (Chatbot)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-chat-bota-chatbot.md) + * [Тестирование электронных писем (E-mail)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-elektronnykh-pisem-e-mail.md) + * [Тестирование интернета вещей (IoT - Internet of Things)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-interneta-veshei-iot-internet-of-things.md) + * [Тестирование облачных решений (Cloud testing)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-oblachnykh-reshenii-cloud-testing.md) + * [Тестирование сервис-ориентированной архитектуры (SOA - Service Oriented Architecture)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-servis-orientirovannoi-arkhitektury-soa-service-oriented-architecture.md) + * [Тестирование микросервисной архитектуры (MSA/Microservices)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-mikroservisnoi-arkhitektury-msa-microservices.md) + * [Тестирование платформы электронного обучения (E-learning platform)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-platformy-elektronnogo-obucheniya-e-learning-platform.md) + * [Тестирование систем розничной торговли (POS - Point Of Sale)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-sistem-roznichnoi-torgovli-pos-point-of-sale.md) + * [Тестирование банковского ПО (Banking domain applications/BFSI)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-bankovskogo-po-banking-domain-applications-bfsi.md) + * [Тестирование страхового ПО (Insurance)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-strakhovogo-po-insurance.md) + * [Тестирование в сфере телекоммуникаций (Telecom)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-v-sfere-telekommunikacii-telecom.md) + * [Тестирование планирования ресурсов предприятия (ERP - Enterprise Resource Planning)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-planirovaniya-resursov-predpriyatiya-erp-enterprise-resource-planning.md) + * [Тестирование миграции данных (ETL)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-migracii-dannykh-etl.md) + * [Тестирование баз данных (Database)](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/testirovanie-baz-dannykh-database.md) + * [Другое](testirovanie-v-raznykh-sferakh-oblastyakh-testing-different-domains/drugoe.md) +* [SDLC и STLC](sdlc-i-stlc/README.md) + * [Жизненный цикл разработки ПО (SDLC - Software Development Lifecycle)](sdlc-i-stlc/zhiznennyi-cikl-razrabotki-po-sdlc-software-development-lifecycle.md) + * [Жизненный цикл тестирования ПО (STLC - Software Testing Lifecycle)](sdlc-i-stlc/zhiznennyi-cikl-testirovaniya-po-stlc-software-testing-lifecycle.md) + * [Модели разработки ПО](sdlc-i-stlc/modeli-razrabotki-po.md) + * [Agile](sdlc-i-stlc/agile.md) + * [Scrum](sdlc-i-stlc/scrum.md) + * [Подходы к разработке/тестированию (... - driven development/testing)](sdlc-i-stlc/podkhody-k-razrabotke-testirovaniyu-...-driven-development-testing.md) +* [Сети и около них](seti-i-okolo-nikh/README.md) + * [База по сетям](seti-i-okolo-nikh/baza-po-setyam.md) + * [Клиент - серверная архитектура (Client-Server Architecture)](seti-i-okolo-nikh/klient-servernaya-arkhitektura-client-server-architecture.md) + * [Микросервисная архитектура (Microservice Architecture)](seti-i-okolo-nikh/mikroservisnaya-arkhitektura-microservice-architecture.md) + * [Эталонные модели OSI и TCP/IP](seti-i-okolo-nikh/etalonnye-modeli-osi-i-tcp-ip.md) + * [HTTP](seti-i-okolo-nikh/http.md) + * [Идентификация ресурсов в сети (Identifying resources on the Web)](seti-i-okolo-nikh/identifikaciya-resursov-v-seti-identifying-resources-on-the-web.md) + * [Веб-сервис (WS - Web service)](seti-i-okolo-nikh/veb-servis-ws-web-service.md) + * [REST/SOAP/gRPC](seti-i-okolo-nikh/rest-soap-grpc.md) + * [Сокет/веб-сокет (socket/websocket)](seti-i-okolo-nikh/soket-veb-soket-socket-websocket.md) + * [Хранилище на стороне клиента (Client-side storage)](seti-i-okolo-nikh/khranilishe-na-storone-klienta-client-side-storage.md) + * [Кэш (Cache)](seti-i-okolo-nikh/kesh-cache.md) + * [Аутентификация и авторизация (Authentication and authorization)](seti-i-okolo-nikh/autentifikaciya-i-avtorizaciya-authentication-and-authorization.md) + * [Рендеринг в интернете (Rendering on the Web)](seti-i-okolo-nikh/rendering-v-internete-rendering-on-the-web.md) +* [Практическая часть](prakticheskaya-chast/README.md) + * [Логические задачи](prakticheskaya-chast/logicheskie-zadachi.md) + * [Тестирование полей и форм](prakticheskaya-chast/testirovanie-polei-i-form.md) + * [Примеры задач на собеседованиях и тестовых заданий](prakticheskaya-chast/primery-zadach-na-sobesedovaniyakh-i-testovykh-zadanii.md) + * [Платформы для тренировок и квизы](prakticheskaya-chast/platformy-dlya-trenirovok-i-kvizy.md) +* [Автоматизация (beta)](avtomatizaciya-beta/README.md) + * [Общее](avtomatizaciya-beta/obshee.md) + * [Полезные ссылки](avtomatizaciya-beta/poleznye-ssylki.md) + * [Как стать автоматизатором и вопросы с собеседований](avtomatizaciya-beta/kak-stat-avtomatizatorom-i-voprosy-s-sobesedovanii.md) + * [Что нужно автоматизировать?](avtomatizaciya-beta/chto-nuzhno-avtomatizirovat.md) + * [Виды и инструменты автоматизации](avtomatizaciya-beta/vidy-i-instrumenty-avtomatizacii.md) + * [Инфраструктура и пайплайн (CI/CD)](avtomatizaciya-beta/infrastruktura-i-paiplain-ci-cd.md) + * [Процессы и автоматизация проекта с нуля](avtomatizaciya-beta/processy-i-avtomatizaciya-proekta-s-nulya.md) + * [Лучшие практики автоматизации](avtomatizaciya-beta/luchshie-praktiki-avtomatizacii.md) + * [Что такое flaky tests?](avtomatizaciya-beta/chto-takoe-flaky-tests.md) + * [Мутационное тестирование (Mutation testing)](avtomatizaciya-beta/mutacionnoe-testirovanie-mutation-testing.md) + * [Параллельное тестирование (Parallel testing)](avtomatizaciya-beta/parallelnoe-testirovanie-parallel-testing.md) + * [Подкожный тест (Subcutaneous test)](avtomatizaciya-beta/podkozhnyi-test-subcutaneous-test.md) + * [Разница между coupling и cohesion](avtomatizaciya-beta/raznica-mezhdu-coupling-i-cohesion.md) + * [Другое (ссылки)](avtomatizaciya-beta/drugoe-ssylki.md) +* [Контакты](kontakty.md) diff --git a/avtomatizaciya-beta/README.md b/avtomatizaciya-beta/README.md new file mode 100644 index 0000000..793a874 --- /dev/null +++ b/avtomatizaciya-beta/README.md @@ -0,0 +1,3 @@ +# Автоматизация (beta) + +_Это черновик большого раздела автоматизации тестирования. Здесь не будет подробных гайдов по инструментам с практикой и кодом. Вместо этого, в рамках своих скромных компетенций, я бы хотел рассмотреть азы, дающие представление об общей картине: что это, зачем оно надо, какая бывает автоматизация, что следует автоматизировать, общие сведения о CI/CD, инфраструктуре, месте автотестов в общем пайплайне, механизме их запуска и отчетности, а также темы, полезные для поиска работы автоматизатором._ diff --git a/avtomatizaciya-beta/chto-nuzhno-avtomatizirovat.md b/avtomatizaciya-beta/chto-nuzhno-avtomatizirovat.md new file mode 100644 index 0000000..39070b0 --- /dev/null +++ b/avtomatizaciya-beta/chto-nuzhno-avtomatizirovat.md @@ -0,0 +1,29 @@ +# Что нужно автоматизировать? + +![](https://lh6.googleusercontent.com/yDbU5SIioPOuXUCODDzKU\_bID9PTPggk12UDYTBN9UTdP02fGiaKqbV5YL0KgWbnz-HLpzLQje\_5ROaA1t0GHhrappPZZOQxvABAQaAHMhllGxmPmRFnMlT\_j\_R0OhVDoubluW70) + +**Какие модули и места следует подвергать автоматизации?** + +* Участки кода, исполнение которых трудно визуализировать и получить осязаемую информацию о протекающих процессах (back-end процессы, занесение в базу данных, занесение логов в файл); +* Функциональность продукта, которая будет использоваться наиболее часто и возникновение ошибок которой связано с достаточно высоким риском. Автоматизированное тестирование узловых моментов функциональности потребует меньше времени для поиска ошибок. И соответственно, сократит время на их устранение; +* Типовые часто выполняемые операции, которые обычно связаны с обработкой данных (CRUD). Например - формы, в которых количество заполняемых граф и полей довольно значительное. Цель - автоматизировать занесение требуемых данных в нужное поле и проверить правильность выполнения задачи после сохранения результата; +* Сообщения об ошибках. Требуется автоматизация разнесения некорректных данных по соответствующим полям и тестирование корректности проверки правильности данных и сообщений об ошибках; +* Комплексная проверка поведения всей системы, как целостного объекта (end-to-end testing); +* Проверка числовых массивов, нужных для достоверных математических операций; +* Тестирование корректности отображаемых результатов поиска в ответ на запрос по нужным данным; +* Предложенный список только ориентировочный. Всё зависит от предъявляемых к проверяемой системе требований, возможностей, которые позволяет реализовать выбранный для автоматического тестирования инструмент. + +Источники: + +* [Какие места в проекте нужно автоматизировать в первую очередь?](https://software-testing.org/automation-testing/kakie-mesta-v-proekte-nuzhno-avtomatizirovat-v-pervuyu-ochered.html) + +Доп. материал: + +* [Автоматизировать или нет: спорные кейсы, плюсы и минусы автотестов](https://habr.com/ru/post/653721/) +* [How To Select Correct Test Cases For Automation Testing (And Ultimately Achieve A Positive Automation ROI)](https://www.softwaretestinghelp.com/manual-to-automation-testing-process-challenges/) +* [How To Implement Efficient Test Automation In The Agile World](https://www.softwaretestinghelp.com/automation-in-agile-world/) +* [Right Tests for Automation](https://www.softwaretestinghelp.com/automation-testing-tutorial-1/#:\~:text=to%20strategize%20automation.-,Right%20Tests%20for%20Automation,-The%20best%20way) +* [Решаем, что и когда автоматизировать, и нужно ли](https://testengineer.ru/reshaem-chto-i-kogda-avtomatizirovat/) +* [Не автоматизируйте test cases](https://habr.com/ru/post/652499/) +* [Автоматизация тестирования: что можно, а что не нужно](https://cleverics.ru/digital/2021/01/sw-testing-automation/) +* [Лучшие практики автоматизации тестирования: решение, что и когда автоматизировать](https://telegra.ph/Luchshie-praktiki-avtomatizacii-testirovaniya-reshenie-chto-i-kogda-avtomatizirovat-05-06) diff --git a/avtomatizaciya-beta/chto-takoe-flaky-tests.md b/avtomatizaciya-beta/chto-takoe-flaky-tests.md new file mode 100644 index 0000000..cf48c69 --- /dev/null +++ b/avtomatizaciya-beta/chto-takoe-flaky-tests.md @@ -0,0 +1,56 @@ +# Что такое flaky tests? + +Флейки-тесты, они же “флаки”, они же нестабильные, они же ненадежные, они же “моргающие”, они же “случайно успешные” + +Flaky-тест, буквально “хлопчатый”, “рассыпающийся на кусочки”, в индустрии ИТ-тестирования означает нестабильный, ненадежный тест, который иногда “pass”, иногда “fail”, и трудно понять, по какой закономерности. Убийца времени тестировщика, источник нервозности в команде. + +На такие тесты тратится много времени. Возникает задержка, пока команда не разберется, в чем дело. Конечно, страдает продуктивность. + +**Причины кратко** + +* Тестовый фреймворк изначально плохо собран. Его код не проверен на соответствие задачам. Совет: код фреймворка должен быть в достаточной мере чистым; должны соблюдаться принципы DRY, использоваться Object design pattern страницы, или Factory design pattern. +* В тесте слишком много hardcoded-данных. Нестабильность результатов тестов возникает, когда эти тесты запускаются в другом окружении. Надо откорректировать hardcoded-данные (практика показывает, что это чаще всего неправильно прописанные пути к чему-то, неправильные IP-адреса и т.п.). +* Кэширование предыдущего состояния теста и запуск нового теста с кэшированными данными. Лучше чистить кэш для каждого выполнения тестов. Проверяй данные перед каждым тестом, и очищай их состояние после каждого теста. +* По внешней причине, не связанной с самими тестами. Плохое подключение к интернету или к конкретной базе данных; неподходящая версия браузера; утечки памяти. +* “Потеря связи” со сторонним (3rd party) компонентом также приводит к ненадежности; здесь поможет тщательная проверка сторонних компонентов перед запуском. +* Неэффективные селекторы элементов (например XPATH), или некорректные координаты элементов. Селекторы можно поменять достаточно легко, корректируя дизайн страницы. Рекомендуется работать с более надежными селекторами (например “id” или “name”). +* Злоупотребление “sleep”-командами, останавливающими выполнение в ожидании чего-то. Здесь помогает замена “sleep”-ожидания на более надежное в этом плане “wait”-ожидание (пока элемент появится). Это экономит время и (почти) устраняет “моргание” тестов во многих случаях. + +**Что делать** + +Если есть время, надо документировать такие тесты, и отправлять в “карантин”. После выполнения тестов, проверь выведенные данные. Проверь логи, дампы памяти, текущее состояние системы. Возможно скриншоты, если это UI-тесты. В 90% случаев причина выяснится уже на этом этапе! Если нет, создай тикеты насчет этих тестов, и проверь их по одному в карантине, тщательно. Исключи тесты в карантине из пайплайна до конца проверки, пока не добьешься стабильности. В Google тоже бывают flaky-тесты, говорит Hala Samir из Google; как они решают эту проблему? Стандартно, например анализируют выведенные данные, проверяя корреляцию с функциями возможно вызвавшими нестабильность, по возможности без перезапуска тестов. + +**Еще раз о причинах** + +Если разделить причины по происхождению: + +* Тесты сами по себе имеют “склонность к нестабильности” +* Проблемы с фреймворком +* Проблемы в подключаемых библиотеках/сервисах +* Проблемы в операционной системе / в устройстве + +**Подробнее.** + +Как уже говорилось выше, нестабильность результатов часто возникает из-за неправильной инициализации, или «очистки». Реже, но тоже случается - от неправильно подобранных тестовых данных. Головная боль тестировщиков - асинхронные действия, на это следует обращать особое внимание. Более простая причина - неправильный порядок запуска тестов. + +Проблемы с фреймворком: часто фреймворк не сконфигурирован на выделение достаточных системных ресурсов; или неправильно планирует очередность запуска тестов, из-за чего они “перекрываются” между собой. + +Если в проекте много сторонних библиотек или подключаемых сервисов, у них может быть свое “дерево зависимостей”, где и таятся причины нестабильности. Например переменные некорректно инициализируются; память “утекает”; какой-то ресурс не отвечает на запрос; и т.п. Чтобы исключить эти проблемы, в идеале надо стремиться к “герметичности” тестовой среды, то есть тестовая среда не должна иметь внешних зависимостей. + +Операционная система и тестовые устройства. Банально, но причиной иногда бывает нестабильное интернет-подключение. Также банальная причина - ошибки чтения/записи на физический носитель данных. + +**Статистика** + +Статистически (со слов тестировщиков), основные причины нестабильности это: на первом месте по «сложности разбора» асинхронные операции (async wait); затем многопоточные операции; затем неправильный порядок запуска тестов; затем аппаратные проблемы (с сетью и синхронизацией времени, или с памятью). + +Ну, а если найти причину нестабильных тестов и исправить их - не получается никак, то, как говорил вице-президент Unity3D Алан Берд, “нестабильные тесты это еще хуже, чем вообще без тестов”. + +Источники: + +* [Нестабильные тесты. Почему они существуют и что с ними делать](https://testengineer.ru/nestabilnye-testy-pochemu-oni-sushchestvuyut-i-chto-s-nimi-delat/) + +Доп. материал: + +* [Blog: Flaky Testing](https://www.developsense.com/blog/2021/02/flaky-testing/) +* [Flaky-тесты: Откуда ноги растут. Опыт Uber](https://habr.com/ru/post/565806/) +* [Flaky тесты (они же моргающие или "случайно успешные")](https://www.maxshulga.ru/2021/04/flaky-tests-or-random-success.html) diff --git a/avtomatizaciya-beta/drugoe-ssylki.md b/avtomatizaciya-beta/drugoe-ssylki.md new file mode 100644 index 0000000..0388f9f --- /dev/null +++ b/avtomatizaciya-beta/drugoe-ssylki.md @@ -0,0 +1,64 @@ +# Другое (ссылки) + +_Всякое из сохраненного, что пока не определилось в другие темы_ + +**Тренды автоматизации тестирования** + +* [AI/ML in Software Test Automation](https://medium.com/slalom-build/ai-ml-in-software-test-automation-979d18396ffa) +* [Top 10 Automation Testing Trends for 2021](https://hackernoon.com/top-10-automation-testing-trends-for-2021-ra53354c) +* [Топ тренды автоматизации тестирования, на которые следует обратить внимание в 2021 году](https://telegra.ph/Top-trendy-avtomatizacii-testirovaniya-na-kotorye-sleduet-obratit-vnimanie-v-2021-godu-03-04) +* [Заменит ли автоматизация мануальщиков](https://www.developsense.com/blog/2021/08/alternatives-to-manual-testing-experiential-attended-exploratory/) +* [Может ли автоматизированное тестирование заменить ручное?](https://habr.com/ru/post/565352/) + +**DevOps & TestOps** + +* [A Brief Guide to Testing in DevOps](https://dzone.com/articles/a-brief-guide-to-testing-in-devops) +* [Артем Ерошенко - TestOps: DevOps для тестировщиков](https://www.youtube.com/watch?v=Iam2NlTukFQ\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=3) +* [Почему TestOps - это DevOps для тестировщиков](https://www.youtube.com/watch?v=s-cXhMcYwQM\&list=PLd\_j4Ug00ng1y\_qvfszViFH53fhOTZoPn\&index=35) +* [Обновленный обзор Allure TestOps](https://www.youtube.com/watch?v=F8cY8YN3DiE) +* [Управление тестами в TestOps: храните информацию, а не выводы](https://habr.com/ru/post/558594/) +* [Готовим QA-команду к внедрению DevOps: 5 советов](https://testengineer.ru/gotovim-qa-komandu-k-vnedreniyu-devops/) + +**Test case as a code** + +* [Артем Ерошенко - Тест-кейсы как код](https://www.youtube.com/watch?v=Prm2-c\_5mYs) +* [Test as Text Approach in IntelliJ IDEA](https://blog.jetbrains.com/qa/2021/08/test-as-text-approach-in-intellij-idea/) +* [Test case-as-code BDD, или управление ручными и автоматическими тестами](https://www.youtube.com/watch?v=6sK\_uaRyO5A) + +**Разное** + +* [Сколько стоит избавиться от ручного тестирования?](https://habr.com/ru/post/558074/) +* [When To Opt For Automation Testing?](https://www.softwaretestinghelp.com/software-automation-testing-should-automate-project-testing/) +* [По следам приложения - мониторинг](https://www.youtube.com/watch?v=2Xd9pAGGLk8) +* [Внедряем Snapshot testing в UI-тесты iOS](https://habr.com/ru/company/vivid\_money/blog/569032/) +* [Интеграционная шина и автоматизация бп](https://www.inpolus.ru/esb/) +* [QA митап SuperJob](https://www.youtube.com/watch?v=LcEBjho7Ems) +* [Manual Testing Vs. Automated Testing: Which One Is The Best Fit For You?](https://hackernoon.com/manual-testing-vs-automated-testing-which-one-is-the-best-fit-for-you-f226372o) +* [AUTOMATED TESTING W/ TESTRIGOR CEO ARTEM GOLUBEV & PAUL GROSSMAN](https://theqalead.com/podcast/automated-testing-artem-golubev-paul-grossman/) +* [THE GENERATION OF AUTONOMOUS AUTOMATION AND WHAT IT LOOKS LIKE (WITH BERTOLD KOLICS FROM MABL)](https://theqalead.com/podcast/the-generation-of-autonomous-automation-and-what-it-looks-like-with-bertold-kolics-from-mabl/) +* [How To Make End-to-End Testing Your Friend](https://hackernoon.com/how-to-make-end-to-end-testing-your-friend) +* [TEAMWORK, AI, AND CONTAINERIZATION (WITH NASA’S MICHAEL RITCHSON)](https://theqalead.com/podcast/teamwork-ai-and-containerization-with-nasas-michael-ritchson/) +* [«Автотестеры, которые не ошибаются: как это сделать»](https://www.youtube.com/watch?v=fusFaT24F3o\&t=1225s) +* [Автотесты на расширениях](https://habr.com/ru/company/sportmaster\_lab/blog/581696/) +* [MVVM и МBT в контексте автоматизации UI](https://habr.com/ru/post/581206/) +* [You shall not pass, или Как мы настроили мониторинг тестовых окружений](https://habr.com/ru/company/dins/blog/580712/) +* [Тест дизайн методом Interface - Model - State](https://egor-romanov.medium.com/%D1%82%D0%B5%D1%81%D1%82-%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC-interface-model-state-7fa89c43934d) +* [Автоматическое тестирование аналитики в браузере](https://habr.com/ru/company/ozontech/blog/592295/) +* [Тестирование производительности приложений как часть ежедневного цикла разработки](https://habr.com/ru/company/veeam/blog/586666/) +* [Паттерны и Методологии Автоматизации UI: Примеры из жизни](https://telegra.ph/Patterny-I-Metodologii-Avtomatizacii-UI-Primery-iz-zhizni-02-13) +* [Три паттерна для улучшения работы с автотестами](https://habr.com/ru/company/badoo/blog/558496/) +* [Свидетели DevOps: мифы и байки про девопсов и тех, кто их нанимает](https://habr.com/ru/company/croc/blog/544028/) +* [Так как же не страдать от функциональных тестов?](https://habr.com/ru/post/553820/) +* [Как оценить покрытие автоматизации](https://software-testing.ru/library/testing/testing-automation/3589-how-to-document-coverage-of-automation) +* [Координация автоматизированного и ручного тест-менеджмента](https://software-testing.ru/library/around-testing/management/3586-coordinating-manual-and-automatic-testing) +* [THE PITFALLS OF TEST AUTOMATION](https://theqalead.com/topics/pitfalls-of-test-automation/) +* [Три паттерна для улучшения работы с автотестами](https://software-testing.ru/library/testing/testing-automation/3616-how-3-process-patterns-will-change-the-way-you-do-test-automation) +* [Software Tester or Lazy Developer?](https://thinkingtester.com/software-tester-or-lazy-developer/) +* [Проверка эффективности автотестов](https://habr.com/ru/company/vivid\_money/blog/556988/) +* [Test Markup in QA Automation](https://www.youtube.com/watch?v=Y4I6Vp4sk\_o) +* [Алексей Баранцев: Десять правил построения хороших локаторов](https://www.youtube.com/watch?v=\_TNh2ydpoOw\&t=2s) +* [Did You Test the Right Things? Test Gap Analysis Can Tell You](https://www.tricentis.com/blog/test-gap-analysis/) +* [Using Gap Analysis In The Testing Process To Align Devs and Testers](https://www.functionize.com/blog/bridging-gap-devs-testers-test-gap-analysis-solution/) +* [Семь самых распространенных ошибок при переходе на CI/CD](https://habr.com/ru/company/vk/blog/489430/) +* [Как сократить издержки на автотестах](https://habr.com/ru/company/X5Group/blog/515752/) +* [Меньше, чем пара. Еще один способ сокращения количества тестов](https://habr.com/ru/company/tinkoff/blog/516132/) diff --git a/avtomatizaciya-beta/infrastruktura-i-paiplain-ci-cd.md b/avtomatizaciya-beta/infrastruktura-i-paiplain-ci-cd.md new file mode 100644 index 0000000..b92dab1 --- /dev/null +++ b/avtomatizaciya-beta/infrastruktura-i-paiplain-ci-cd.md @@ -0,0 +1,158 @@ +# Инфраструктура и пайплайн (CI/CD) + +В этой теме у меня мало опыта, вероятность белиберды увеличена втрое. + +Сейчас компетентность в сфере TestOps является таким же базовым требованием к QA-инженерам, как и написание автоматизированных тестов. Причина - в активном развитии CI/CD в проектах и необходимости QA-инженерам работать с пайплайнами + +Многие начинающие автоматизаторы бросаются учить язык программирования, пишут первые учебные тесты и даже успешно делают тестовые задания по автоматизации тест-кейсов. Однако не все задумываются о том, что с этими тестами в реальной работе делать дальше. Кто их будет запускать? Когда? Каким образом? Здесь я бы хотел рассказать о пайплайне CI, месте автотестов в нем, а так же как и на чем тесты запускаются. + +Прежде всего, откуда этот пайплайн взялся и что за CI/CD. + +**Непрерывная интеграция** (Continuous Integration, CI) и непрерывная поставка (Continuous Delivery, CD) представляют собой культуру, набор принципов и практик, которые позволяют разработчикам чаще и надежнее развертывать изменения программного обеспечения. + +CI/CD - это одна из DevOps-практик. Она также относится и к agile-практикам: автоматизация развертывания позволяет разработчикам сосредоточиться на реализации бизнес-требований, на качестве кода и безопасности. + +Непрерывная интеграция - это методология разработки и набор практик, при которых в код вносятся небольшие изменения с частыми коммитами. И поскольку большинство современных приложений разрабатываются с использованием различных платформ и инструментов, то появляется необходимость в механизме интеграции и тестировании вносимых изменений. С технической точки зрения, цель CI - обеспечить последовательный и автоматизированный способ сборки, упаковки и тестирования приложений. При налаженном процессе непрерывной интеграции разработчики с большей вероятностью будут делать частые коммиты, что, в свою очередь, будет способствовать улучшению коммуникации и повышению качества программного обеспечения. + +**Непрерывная поставка** начинается там, где заканчивается непрерывная интеграция. Она автоматизирует развертывание приложений в различные **окружения**: большинство разработчиков работают как с продакшн-окружением, так и со средами разработки и тестирования. + +Инструменты CI/CD помогают настраивать специфические параметры окружения, которые конфигурируются при развертывании. А также CI/CD-автоматизация выполняет необходимые запросы к веб-серверам, базам данных и другим сервисам, которые могут нуждаться в перезапуске или выполнении каких-то дополнительных действий при развертывании приложения. + +Непрерывная интеграция и непрерывная поставка нуждаются в непрерывном тестировании, поскольку конечная цель - разработка качественных приложений. Непрерывное тестирование часто реализуется в виде набора различных автоматизированных тестов (регрессионных, производительности и других), которые выполняются в **CI/CD-конвейере** (pipeline, build chain и т.д.). Зрелая практика CI/CD позволяет реализовать непрерывное развертывание: при успешном прохождении кода через CI/CD-конвейер, сборки автоматически развертываются в продакшн-окружении. Команды, практикующие непрерывную поставку, могут позволить себе ежедневное или даже ежечасное развертывание. + +Типичный CD-**конвейер** состоит из этапов сборки, тестирования и развертывания. Более сложные конвейеры включают в себя следующие этапы: + +* Получение кода из системы контроля версий и выполнение сборки; +* Настройка инфраструктуры, автоматизированной через подход “инфраструктура как код”; +* Копирование кода в целевую среду; +* Настройка [переменных](https://theqalead.com/topics/api-smoke-tests-cd-pipeline/#:\~:text=Step%20Five%3A%20Organize%20Your%20Variables) окружения для целевой среды; +* Развертывание компонентов приложения (веб-серверы, API-сервисы, базы данных); +* Выполнение дополнительных действий, таких как перезапуск сервисов или вызов сервисов, необходимых для работоспособности новых изменений; +* Выполнение тестов и откат изменений окружения в случае провала тестов; +* Логирование и отправка оповещений о состоянии поставки. + +Например, в Jenkins конвейер определяется в файле Jenkinsfile, в котором описываются различные этапы, такие как сборка (build), тестирование (test) и развертывание (deploy). Там же описываются переменные окружения, секретные ключи, сертификаты и другие параметры, которые можно использовать в этапах конвейера. В разделе post настраивается обработка ошибок и уведомления. В более сложном CD-конвейере могут быть дополнительные этапы, такие как синхронизация данных, архивирование информационных ресурсов, установка обновлений и патчей. CI/CD-инструменты обычно поддерживают плагины. Например, у Jenkins есть более 1500 плагинов для интеграции со сторонними платформами, для расширения пользовательского интерфейса, администрирования, управления исходным кодом и сборкой. + +Многие команды, использующие CI/CD-конвейеры в облаках используют **контейнеры**, такие как [Docker](https://www.software-testing.ru/library/testing/testing-for-beginners/3661-docker), и **системы оркестрации**, такие как Kubernetes. Контейнеры позволяют стандартизировать упаковку, поставку и упростить масштабирование и уничтожение окружений с непостоянной нагрузкой. Есть множество вариантов совместного использования контейнеров, инфраструктуры как код (**Iaas**) и CI/CD-конвейеров. Архитектура бессерверных вычислений представляет собой еще один способ развертывания и масштабирования приложений. В бессерверном окружении инфраструктурой полностью управляет поставщик облачных услуг, а приложение потребляет ресурсы по мере необходимости в соответствии с его настройками. Например, в AWS бессерверные приложения запускаются через функции AWS Lambda, развертывание которых может быть интегрировано в CI/CD-конвейер Jenkins с помощью плагина. + +_Больше о CI/CD можно почитать_ [_тут_](https://martinfowler.com/articles/continuousIntegration.html) _и_ [_тут_](https://martinfowler.com/delivery.html)_._ + +**Этапы конвейера** + +В момент, когда триггерится сборка, например, когда разработчик сделал коммит в свою ветку, запускается процесс, который выполняется специально написанными скриптами и утилитами. Этот процесс состоит из нескольких обязательных шагов. Простой пример для PR: + +* При открытии каждого Pull Request, Git-сервер отправляет уведомление CI-серверу; +* CI-сервер клонирует репозиторий, проверяет исходную ветку (например bugfix/wrong-sorting), и сливает код с кодом master-ветке; +* Тогда запускается билд-скрипт (сценарий сборки). Например ./gradlew build; +* Если эта команда возвращает код ответа “0”, то билд успешно выполнен. (Другой ответ означает ошибку); +* CI-сервер направляет уведомление об успешном билде на Git-сервере; +* Если билд был успешен, то Pull Request разрешается слить с существующим кодом. (Если не успешен, то, соответственно, не разрешается). + +Ошибка в любом из шагов приводит к полному падению всей сборки. Ну и, само собой разумеется, шаги расположены в таком порядке, чтобы сужать воронку потенциальных проблем. Если Quality Gate предыдущего этапа не пройдет, то на проверку следующего уже можно не тратить ресурсы. + +Пример Quality Gates, которые встроены в pipeline [отсюда](https://habr.com/ru/company/otkritie/blog/568612/): + +* Сборка сервиса: + * Проверка наличия конфигурации корректного формата; + * Проверка стандартов оформления кода; + * Проверка на необходимое покрытие Unit-тестами; + * Генерации и публикации контрактов (контроль обратной совместимости). +* Запуск Beta-тестов; +* Обязательный code-review; +* Сканирование на уязвимости. + +Пример сферического пайплайна в вакууме [отсюда](https://habr.com/ru/company/rabota/blog/560922/): + +* Code scanning: код проверяется на соответствие общему гайдлайну (linters), уязвимости (code security) и качество (code quality); +* Unit tests; +* Build: этап для сборки artifacts/packages/images и т.д. Здесь уже можно задуматься о том, каким будет стратегия версионирования всего приложения. Во времена контейнеризации, в первую очередь интересуют образы для контейнеров и способы их версионирования; +* Scan package: пакет/образ собрали. Теперь нужно просканировать его на уязвимости. Современные registry уже содержат инструментарий для этого; +* Deploy: стадия для развертывания приложения в различных окружениях; +* Integration testing: приложение задеплоили. Оно где-то живет в отдельном контуре. Наступает этап интеграционного тестирования. Тестирование может быть как ручным, так и автоматизированным; +* Performance testing (load/stress testing): данный вид тестирования имеет смысл проводить на stage/pre-production окружениях. С тем условием, что ресурсные мощности на нем такие же, как в production; +* Code Review / Approved: одним из важнейших этапов являются Merge Request. Именно в них могут производиться отдельные действия в pipeline перед слиянием, а также назначаться группы лиц, требующих одобрения перед слиянием. + +_Больше про build-agent можно почитать тут:_ [_TeamCity: настраиваем CI/CD в вашей команде_](https://habr.com/ru/company/tinkoff/blog/532546/) _и тут_ [_Что такое сборщик продукта_](https://habr.com/ru/post/595375/)_, про окружения тут\*\* \*\*_[_Создаем инфраструктуру для интеграционных тестов_](https://habr.com/ru/company/2gis/blog/575688/) + +**Е2Е автотесты** + +Теперь пора поговорить непосредственно про то, что чаще всего касается рядового автоматизатора - **Е2Е автотесты**. Как мы выяснили выше, до прогона Е2Е сборка сначала проходит несколько шагов, а условиями запуска чаще являются ключевые моменты: commit, pull request и merge request. В моей прошлой компании был очень простой конвейер, где на коммит в фича-ветку запускались тесты разработчика, на вливание в develop стартовали критичные Е2Е тесты, а на вливание в main уже всё что есть, включая регрессионные тесты. Теперь, когда известны места автотестов в конвейере, нужно еще понять, на чем эти тесты будут прогоняться и как имея скрипт автотеста его запустить в конвейере. + +Все эти моменты конфигурируются в самом CI-агенте, в jenkins это были джобы (job). Пример: [How to Add your First Android Job to Jenkins](https://bugfender.com/blog/how-to-add-your-first-android-job-to-jenkins/). За запуск кода тестов, когда вы инициируете запуск из конвейера или локально, отвечает **Test Runner**. Это лишь одна из задач, в зону ответственности раннера [входят](https://habr.com/ru/company/avito/blog/516650/): + +* подготовка окружения; +* формирование набора тестов для исполнения; +* запуск тестов; +* получение результатов выполнения тестов; +* подготовка отчетов о прохождении тестов; +* сбор статистики. + +Несмотря на то, что с фреймворком поставляется также и раннер, существует возможность использования более совершенных сторонних раннеров. + +Параллельно с вопросом о том, какой раннер выбрать для тестов, перед вами встает другой: а на чем лучше запускать тесты? Есть три опции: + +* Настоящий девайс. + * Плюсы. Покажет проблемы, специфичные для конкретных устройств и прошивок. Многие производители меняют Android под себя - как UI, так и логику работы ОС. И бывает полезно проверить, что ваше приложение корректно работает в таком окружении. + * Минусы. Необходимо где-то добыть ферму устройств, организовать специальное помещение под них - необходима низкая температура, нежелательно попадание прямых солнечных лучей и т. д. Кроме того, аккумуляторы имеют свойство вздуваться и выходить из строя. А еще сами тесты могут менять состояние устройства, и вы не можете просто взять и откатиться на какой-то стабильный снепшот. +* Чистый эмулятор. Под «чистым» мы подразумеваем, что вы запускаете эмулятор у себя или где-то на машине, используя установленный на эту машину AVD Manager. + * Плюсы. Быстрее, удобнее и стабильнее настоящего устройства. Создание нового эмулятора занимает считаные минуты. Никаких проблем с отдельным помещением, аккумуляторами и прочим. + * Минусы. Отсутствие упомянутых выше device specifics. Однако зачастую количество тестовых сценариев, завязанных на специфику устройства, ничтожно мало, и они не высокоприоритетные. Но самый главный минус - это плохая масштабируемость. Простая задача залить новую версию эмулятора на все хосты превращается в мучение. +* Docker-образ Android-эмулятора. Docker решает недостатки чистых эмуляторов. + * Плюсы. Docker и соответствующая обвязка в виде подготовки и раскатки образа эмулятора - это полноценное масштабируемое решение, позволяющее быстро и качественно готовить эмуляторы и раскатывать их на все хосты, обеспечивая их достаточную изолированность. + * Минусы. Более высокий входной порог. + +В сети есть разные Docker-образы Android-эмуляторов: + +* [Docker image от Avito](https://avito-tech.github.io/avito-android/docs/ci/containers/); +* [Docker image от Google](https://github.com/google/android-emulator-container-scripts); +* [Docker image от Agoda](https://github.com/agoda-com/docker-emulator-android). + +Предстоит сделать сложный выбор между облачным решением, локальным решением с нуля и локальным решением на базе чего-то, если в компании есть своя инфраструктура по запуску тестов других платформ. Вся эта инфраструктура уже связывается с раннером для запуска тестов, после чего уже решаются остальные моменты, такие как вывод отчета по прогону тестов (например, Allure) и внедрение/синхронизация с TMS. + +Источники: + +* [Что такое CI/CD? Разбираемся с непрерывной интеграцией и непрерывной поставкой](https://habr.com/ru/company/otus/blog/515078/) +* [Разбираемся в CI/CD](https://testengineer.ru/razbiraemsya-v-ci-cd/) +* [Автотесты на Android. Картина целиком](https://habr.com/ru/company/kaspersky/blog/510230/) + +Доп. материал: + +* [DevOps инструменты не только для DevOps. Процесс построения инфраструктуры автоматизации тестирования с нуля](https://habr.com/ru/post/497918/) +* [Руководство для начинающих: создаем DevOps-пайплайн](https://habr.com/ru/company/skillfactory/blog/509964/) +* [Зачем CI/CD тестировщикам?](https://habr.com/ru/company/JetBrains/blog/650757/) +* [Jenkins Pipeline. Что это и как использовать в тестировании](https://habr.com/ru/company/yoomoney/blog/538664/) +* [ГДЕ И КАК ПРОГОНЯТЬ UI ТЕСТЫ](https://www.youtube.com/watch?v=0AQlKbskhkM\&t=3963s) +* [Инфраструктура + тестирование = любовь](https://habr.com/ru/post/655671/) +* [Leadership in test: a guide to infrastructure and environments](https://theqalead.com/topics/infrastructure/) +* [Leadership in test: testing tools](https://theqalead.com/topics/testing-tools/) +* [Создаем инфраструктуру для интеграционных тестов](https://habr.com/ru/company/2gis/blog/575688/) +* [HOW TO RUN API SMOKE TESTS IN YOUR CONTINUOUS DEPLOYMENT PIPELINE](https://theqalead.com/topics/api-smoke-tests-cd-pipeline/) +* [Разбираемся в CI/CD](https://testengineer.ru/razbiraemsya-v-ci-cd/) +* [Что такое CI (Continuous Integration)](https://habr.com/ru/post/508216/) +* [Как мы настроили CI/CD, чтобы релизить часто и без страха](https://habr.com/ru/company/otkritie/blog/568612/) +* [Как настроить Pipeline для Jenkins, Selenoid, Allure](https://habr.com/ru/company/simbirsoft/blog/597703/) +* [CI-билд - это не елка](https://telegra.ph/CI-bild--ehto-ne-elka-02-15) +* [Идеальный пайплайн в вакууме](https://habr.com/ru/company/rabota/blog/560922/) +* [Основные подходы к CI/CD для целей тестирования ПО](https://www.youtube.com/watch?v=oiSUH4eHYoc\&t=5980s) +* [How To Have Seamless Script Execution Planning And Reporting For Success Of An Automation Project](https://www.softwaretestinghelp.com/automation-testing-tutorial-6/) +* [Что такое сборщик продукта](https://habr.com/ru/post/595375/) +* [#8 QA инфраструктура компании на локальной машине. Docker, Jenkins, Jira, Selenoid, Allure.](https://www.youtube.com/watch?v=LeA2\_GJ1e70\&list=WL\&index=9\&t=3047s) +* [Автотесты и Docker](https://testengineer.ru/avtotesty-i-docker/) +* [Интеграция с Allure: структурировать, упростить, стабилизировать](https://habr.com/ru/company/wrike/blog/588873/) +* [Автоматизация расчета покрытия требований и его визуализация в Allure Report](https://www.youtube.com/watch?v=oPpVRc7xvDc) +* [Что такое Docker](https://www.software-testing.ru/library/testing/testing-for-beginners/3661-docker) +* [Continuous Integration with Jenkins](https://learn.epam.com/detailsPage?id=62dc3947-e941-4c30-ba32-552eb363978e) +* [Стратегии деплоя в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B-тестирование)](https://habr.com/ru/company/flant/blog/471620/) +* [Как e2e автотесты на Selenide помогают QA-команде при частых релизах](https://habr.com/ru/company/croc/blog/546430/) +* [Как ускорить автотесты](https://habr.com/ru/company/vk/blog/645695/) +* [Тестируем CI Pipeline](https://www.youtube.com/watch?v=OvhjxN9fY5c) +* [Switchboard: набор инструментов для управления авто-тестами](https://www.youtube.com/watch?v=2RDT1gsSjcE) +* [Централизованное логирование в Docker с применением ELK Stack](https://habr.com/ru/company/otus/blog/542144/) +* [Строим домашний CI/CD при помощи GitHub Actions и Python](https://habr.com/ru/post/476368/) +* [Нагрузочное тестирование как CI-сервис для разработчиков](https://habr.com/ru/company/pt/blog/504290/) +* [Автоматическое тестирование микросервисов в Docker для непрерывной интеграции](https://habr.com/ru/company/auriga/blog/503334/) +* [Тесты на pytest с генерацией отчетов в Allure с использованием Docker и Gitlab Pages и частично selenium](https://habr.com/ru/post/513432/) +* [Автоматизация системных тестов на базе QEMU (Часть 1/2)](https://habr.com/ru/post/520310/) +* [Как сократить время сборки образов Docker в GitLab CI](https://habr.com/ru/company/otus/blog/537780/) +* [Crash-crash, baby. Автоматический мониторинг фатальных ошибок мобильных приложений](https://habr.com/ru/company/avito/blog/518222/) +* [git-flow](https://danielkummer.github.io/git-flow-cheatsheet/index.ru\_RU.html), [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow), [GitLab Flow](https://docs.gitlab.com/ee/topics/gitlab\_flow.html) diff --git a/avtomatizaciya-beta/kak-stat-avtomatizatorom-i-voprosy-s-sobesedovanii.md b/avtomatizaciya-beta/kak-stat-avtomatizatorom-i-voprosy-s-sobesedovanii.md new file mode 100644 index 0000000..3b733ca --- /dev/null +++ b/avtomatizaciya-beta/kak-stat-avtomatizatorom-i-voprosy-s-sobesedovanii.md @@ -0,0 +1,119 @@ +# Как стать автоматизатором и вопросы с собеседований + +**Можно ли стать автоматизатором без опыта ручного тестирования?** + +Можно, если у вас есть опыт в программировании. В каких-то компаниях это действительно так и работает. Ручные тестировщики пишут тест-кейсы (шаги + ожидаемый результат), автоматизатор их берет и переносит в код. В принципе, такой подход вполне валиден и работает, но я вижу в нем некоторые недостатки. + +Во-первых, когда сам пишешь автотесты на функционал, который хорошо знаешь, ты можешь по ходу добавлять какие-то проверки, которые мог пропустить во время написания тест-кейсов. Плюс знаешь другие автотесты, которые можно дополнить. Соответственно, тебе легче поддерживать актуальность автотестов. + +Во-вторых, автоматизация тестирования - это интересно и полезно. Ты начинаешь изучать код, расширяешь свои знания о продукте, понимаешь, как всё работает изнутри. Это полезно и для ручного тестирования в том числе. Начинаешь чуть лучше понимать разработчиков. + +**Можно ли писать автотесты автоматически? Не хочется учиться программированию.** + +Попробовать можно. Мы пробовали. Для таких дел существуют рекордеры. Но те тесты, которые ими создаются - это монструозные и неподдерживаемые куски кода. + +Возможно, это будет работать, если, допустим, в приложении есть какая-то кнопка, которая никогда не будет меняться. Не изменится ни путь до нее, ни ее функциональность и положение. Тогда код этого теста никогда не нужно будет менять, и пусть этот тест будет жить. Но увы, на практике так не работает. Тесты должны быть легко поддерживаемыми, понятными, читаемыми. Рекордером такого не добьешься. + +Можно использовать рекордеры в каких-нибудь сложных местах приложения, чтобы посмотреть, как можно повзаимодействовать с каким-нибудь труднонаходимым элементом. То есть использовать его как помощника, как вспомогательный инструмент, но не как основное средство автоматизации. + +**За сколько тестировщик превращается в автотестировщика** + +Опять же, по нашему опыту, мы нанимаем человека без опыта автоматизации и на испытательный срок (3 месяца) ему ставится задача - написать свой первый автотест на любую из платформ, которая ему понравится больше или покажется проще. И у нас еще никто не провалил испытательный срок. + +Естественно, большую роль играет то, что человек пишет автотесты не совсем с нуля. У нас уже есть и готовые автотесты, которые можно смотреть и писать по аналогии, и люди, которые готовы помогать и отвечать на вопросы. + +По итогу за 3 месяца мы получаем человека, который уже понимает, как писать автотесты минимум для одной из платформ. Следующим шагом будет написать такой же тест для второй платформы. Еще через 3-4 месяца мы получим самостоятельного автоматизатора мобильных приложений под обе платформы, которому еще какое-то время, возможно, нужна будет помощь с какими-то сложными вещами. Но вот свободно писать легкие автотесты под обе платформы он будет уже через полгода. + +**Карьерный путь автоматизатора** + +* [Что учить, чтоб стать автоматизатором тестирования](https://www.youtube.com/watch?v=d5yCDe0\_ddE) +* [Карьерный путь автоматизатора](https://software-testing.ru/library/around-testing/job/3626-test-automation-career-path) + +Роадмапы в основном включают и мануал и авто, их можно посмотреть в теме “Что должен знать и уметь Junior? Что спросят на собеседовании?”. + +**Вопросы для подготовки к собеседованию** можно условно поделить на 3 большие группы: + +* джуна наверняка всё-равно будут спрашивать общую теория тестирования по мануалу, хотя бы по верхам; +* всё то, что касается непосредственно автоматизации: какая бывает, инструменты в общем и конкретно под вакансию, представление об инфраструктуре CI/CD, лучшие практики автоматизации и т.п.; +* core языка программирования, указанного в вакансии и всё, что вокруг этого. + +**Вопросы по автоматизации**: + +* Что такое автоматизация и зачем она нужна? +* Когда нужно начинать автоматизацию на проекте? +* Какая бывает автоматизация (виды, методы, платформы и т.п.)? +* Популярные фреймворки и инструменты автоматизации, запуска тестов и генерации отчетности; +* Инфраструктура CI/CD, пайплайн, место автотестов в нем; +* Что следует автоматизировать в первую очередь? +* Какая тестовая документация нужна для автоматизированного тестирования? + +**Вопросы по языкам программирования**: + +Java: + +* дизайн-паттерны; +* дата-типы; +* коллекции, Map...; +* модификаторы доступа. Public, Private, Abstract классы и методы; +* Что такое Интерфейс? +* Что такое лямбда функция? +* дженерики; +* коллекции; +* методы класса object; +* больше [тут](https://github.com/enhorse/java-interview) или в гугле. + +**Вопросы общие** по типу: + +* Разница между библиотекой и фреймворком? +* Что означает слово SNAPSHOT в версии библиотеки? +* Что такое SDK? + +**Практические навыки**: + +* уметь писать код; +* Git; +* консоль; +* типовые инструменты для платформы; +* моки запросов (Swifter/Wiremock); +* инструменты отчетности (Allure); +* инструменты CI. + +[Пример](https://t.me/qa\_interviews/64422) вопросов от кандидата работодателю: + +* Сколько IOS разработчиков в приложении? +* Сколько Unit Test’ов и сколько UI Test’ов на данный момент? +* С какой периодичностью запускаются тесты? +* Какой релизный цикл? Сколько сейчас времени на регресс? +* Кто добавляет Accebility Identifier’ы в приложение? +* Какая минимальная версия IOS поддерживается? +* Сколько времени тратится на сборку приложения локально? +* Какая система сборки используется на проекте? +* Автоматизируете ли разрешение конфликтов в project.pbxproj ? + +Источники: + +* [ТОП-5 вопросов ручных тестировщиков про автоматизацию](https://habr.com/ru/company/hh/blog/575390/) +* [ТОП-5 вопросов технического директора про автоматизацию](https://habr.com/ru/company/hh/blog/582968/) + +Доп. материал: + +* [Чек-лист для начинающего автотестера на Java](https://testit.software/blog/post/chek-list-dlya-nachinayushchego-avtotestera-na-java) +* [**39 TOP Automation Testing Interview Questions And Answers**](https://www.softwaretestinghelp.com/test-automation-interview-questions/) +* [**50 Most Popularly Asked Selenium Interview Questions And Answers**](https://www.softwaretestinghelp.com/selenium-interview-questions-answers/) +* [**Automation Testing Interview Questions And Answers (Updated 2022**](https://www.softwaretestingmaterial.com/automation-testing-interview-questions/)**)** +* [**Interview Prep Questions**](https://docs.google.com/document/d/1UQR1Zvwyrgyuo600qEVAWt4d25LWo5B5KLGe-c09aU4/edit#heading=h.tu27eqwwcawn) +* [50 вопросов по Docker, которые задают на собеседованиях, и ответы на них](https://habr.com/ru/company/southbridge/blog/528206/) +* [Как начать карьеру QA Automation Engineer: один простой совет](https://vc.ru/hr/350932-kak-nachat-kareru-qa-automation-engineer-odin-prostoy-sovet) +* [Нужно ли знать программирование для qa автоматизатора?](https://www.youtube.com/watch?v=y2Xh25f5O9U) +* [Как стать QA AUTOMATION engineer с нуля самостоятельно](https://www.youtube.com/watch?v=k0LFk9yH98c) +* [Дмитрий Бормотов - Трансформация из Manual QA в Automation](https://www.youtube.com/watch?v=FkhWIgqtmZ8\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=12) +* [Как стать автоматизатором тестирования?](https://habr.com/ru/post/253867/) +* [Какие вопросы ожидать на позицию автоматизатора и причем тут сортировка?](https://habr.com/ru/post/550510/) +* [Что спрашивают на собеседовании у джуна, или как я искала свою вторую работу в ИТ](https://habr.com/ru/post/442348/) +* [10 Awesome Tips To Become A Better Automation Tester](https://www.softwaretestinghelp.com/how-to-become-better-automation-tester/) +* [Какие ошибки совершает начинающий QA Automation Engineer? Как их избежать?](https://www.youtube.com/watch?v=8QQVe5LYgdw) +* [Три типичных ошибки автоматизатора](https://testengineer.ru/tipichnye-oshibki-avtomatizatora/) +* [QAGuild#54: Что должен знать тестировщик? Топ 3 навыка для QA Automation engineer](https://www.youtube.com/watch?v=XgMGjRAQZJg) +* [Как стать Java разработчиком за 1,5 года](https://habr.com/ru/post/439432/) +* [Как я изучал структуры данных и алгоритмы для собеседования в FAANG](https://habr.com/ru/company/skillfactory/blog/539058/) +* [Как я готовился к собеседованию в Google](https://habr.com/ru/company/skillfactory/blog/538536/) diff --git a/avtomatizaciya-beta/luchshie-praktiki-avtomatizacii.md b/avtomatizaciya-beta/luchshie-praktiki-avtomatizacii.md new file mode 100644 index 0000000..1b12d68 --- /dev/null +++ b/avtomatizaciya-beta/luchshie-praktiki-avtomatizacii.md @@ -0,0 +1,114 @@ +# Лучшие практики автоматизации + +В каждой статье свой топ лучших практик, характеристик хороших тестов и подобного, так что я просто скопировал наиболее полезные на мой взгляд списки. + +**7 характеристик отлично написанных тестов** + +* **Тест полностью автоматизирован** (очевидно): Иногда попадаются такие тесты, которые автоматизированы не полностью. Самые распространенные причины: либо это очень сложно, либо просто невозможно; +* **Тест повторяем**: тест не ломается, если приложение не поменялось: Это относится к основам генерации уникальных данных. Например, мы тестируем регистрацию. Очевидно, что если не генерировать уникальный емейл, то на продакшене такой тест, скорее всего, не будет работать; +* **Тест заканчивается валидацией**: За исключением случаев, где нужно выполнить действия по зачистке данных и подобных действий, завершение валидацией является лучшей практикой. Это помогает убедиться, что последнее действие прошло успешно; +* **Тест достаточно стабилен, чтобы его использовать в CI/CD**: Если тест регулярно ломается, то он недостаточно стабилен, чтобы использовать его в CI/CD. Так как практически любая компания пытается добиться CI или даже CD, то часто такой тест не просто бесполезен, но даже вреден, так как отнимает большое количество времени и все равно не может использоваться в CI автоматически; +* **Тест очень легко читать**: Мы обычно не пишем тесты в одиночку. Часто это команда людей и нашим коллегам тоже приходится поддерживать наши тесты. Крайне важно, чтобы любой член команды мог разобраться в структуре теста, не тратя на это излишнее количество времени. Даже если мы пишем тесты в одиночку, иногда бывает очень тяжело понять, что тест делает и как, если он не написан специально для облегчения понимания; +* **Тест требует минимальной поддержки**: Пункт очевидный, но не всегда соблюдаемый. Чем меньше мы тратим времени на поддержку, тем больше у нас времени на то, чтобы сделать что-то полезное, как, например, написать больше тестов; +* **Тест работает параллельно с другими тестами и не ломается**: В какой-то момент, особенно для end-to-end тестов, мы сталкиваемся с тем, что прогон тестов занимает слишком много времени, это снижает скорость разработки и приводит к таким эффектам, как неоттестированный патч. На этом этапе мы обычно задумываемся о параллелизации, чтобы ускорить исполнение тестов. Если тесты были написаны так, что они могут быть запущены параллельно в любой последовательности и не пересекаться друг с другом, то это делает задачу параллельного исполнения просто задачей настройки инфраструктуры, а не задачей переписывания тестов. + +**Еще десять заповедей автоматизации** + +1. **Не автоматизируй только "по тест-кейсам"** + +Существует распространенное заблуждение, что тест-автоматизация обязана произрастать из тест-кейсов. Автоматизаторы берут существующие или свежесозданные тест-кейсы и превращают их в автоматизированные сценарии. Это называется "автокафе". В этом подходе может быть смысл, но другие подходы принесут не меньше, а то и больше выгоды. Расширяя определение автоматизации за рамки "тест-кейс - инструмент - тест-скрипт" до "продуманного применения технологии с целью помочь людям выполнять свою работу", мы можем использовать компьютерные мощности для задач, для которых они предназначены, а люди - тестировщики - пусть делают все остальное. К счастью, в большинстве задач, где хороши люди, компьютеры выступают плохо - и наоборот. + +**2. Обращайся с разработкой автоматизации, как с разработкой ПО** + +Разработка автоматизации - это и есть разработка ПО. Даже если мы используем интерфейс перетаскивания или записи и воспроизведения для создания автоматизации, то где-то под капотом или за занавесом над нашими действиями работает код. Мы должны начать обращаться с автоматизацией как с разработкой ПО, иначе мы окажемся с чем-то неподдерживаемым на руках, и проект умрет, едва родившись. Подход к автоматизации как к разработке ПО означает, что мы должны учитывать большинство (если не все) процессов и видов деятельности, требуемых при разработке ПО. Включая: + +* Дизайн - мы должны решить, что внедрять и как это делать, чтобы это было поддерживаемым и пригодным к эксплуатации. +* Внедрение - надо написать код. +* Хранение - код и его артефакты должны где-то храниться. +* Тестирование - тестировать тесты? Естественно! Мы должны быть достаточно уверены, что автоматизация ведет себя так, как нам хочется. Если мы не доверяем автотестам, в них нет смысла. +* Баги - в любом ПО есть баги; автоматизация, как ПО, не исключение. Тестирование поможет нам, но не отловит все баги на свете. Выделите время на исправление багов. +* Логи - это артерия автоматизации. Без них мы не поймем, что автоматизация делает, и не сможем ее починить, когда она сломается. К тому же мы не сможем сказать, в автоматизации ли кроется проблема, или же в тестируемом ПО. + +**3. Следуй стандартам и идиомам программирования** + +Помимо обращения с автоматизацией как с разработкой ПО, мы должны встраивать в нее соответствующие идеи по внедрению. Каждый инструмент и язык имеют свои собственные идиомы и хитрости, но общепринятые подходы к проектированию и внедрению обычно годятся для всего. Эта статья про инкапсуляцию и абстракцию рассказывает об образцовых практиках, которое можно переносить в другие специфичные области. + +**4. Не забывай про поддержку и обслуживание** + +ПО не идеально и никогда не бывает полностью готово; с автоматизацией то же самое. В ней будут баги. С изменением тестируемого приложения нужно будет соответственно менять автоматизацию. Мы не можем это предотвратить, но можем разработать наше ПО так, чтобы снизить затраты на его поддержку и обслуживание; и на них тоже надо выделить время. Эта статья и этот пост в блоге рассказывают о факторах, которые надо учитывать, планируя будущую поддержку. + +**5. Не делай скрипты зависимыми друг от друга** + +Создание тест-скрипта, зависимого от результатов другого теста - как правило, мощный анти-паттерн. Если скрипты зависят друг от друга, их нельзя прогонять поодиночке, и это усложняет дебаг автоматизации и проблем приложения. К тому же зависимые скрипты нельзя запускать параллельно с теми, от которых они зависят. Тут есть граничный случай, когда абсолютно все скрипты зависят от одного-единственного. Этот единичный скрипт обычно настраивает тест-окружение и тестовые данные. В условиях современных фреймворков автоматизации и непрерывной развертки это все большая редкость, но этот сценарий может быть уместен в ситуациях, когда фреймворки недоступны или не подходят для специфической автоматизационной задачи. + +**6. Внедряй грамотное логирование и отчеты** + +Как описано здесь, грамотные логи, результаты и сообщения об ошибках критично важны для понимания, доверия к, и поддержки автоматизации. Эти логи - наш детализированный образ прогона автотестов: что запускалось, как именно, что упало, как оно упало, как оно преуспело, и т. д. Конечно, если мы тщательно внедрили грамотное логирование, которое дает нам эту информацию в читабельной форме. + +**7. Влияй на тестируемость и автоматизируемость** + +Тестируемость, та степень, до которой приложение или фича могут быть протестированы, и автоматизируемость, степень, до которой тест-деятельность может выполняться автоматически - это не то, что могут создавать тестировщики, QA и QE, но, конечно, есть вещи, на которые мы можем повлиять. Осуществление этого влияния - наша обязательная задача. Разработчики не всегда знают, что нам нужно для тестирования и для создания автотестов. Мы должны донести это до них. Статьи здесь и здесь рассказывают о некоторых аспектах тестируемости и автоматизируемости. + +**8. Не попадайся в ловушку невозвратных затрат** + +Иногда мы делаем ошибки. Иногда это крупные ошибки. Мы извлекаем максимум из информации, которой располагаем в моменте, но это не всегда срабатывает. Когда что-то в нашем плане идет не так, мы инстинктивно стараемся это исправить и продолжать исправлять. Однако иногда стоит начать заново, иначе мы рискуем выбросить хорошие деньги вслед за плохими. Это называется "ловушкой невозвратных затрат". Если кратко, она заключается в мнении, что мы уже потратили столько денег на этот проект, что обязаны потратить еще для его реабилитации, дабы извлечь выгоду из уже потраченных, невозвратных затрат на него. Возможно, мы эмоционально привязаны к нашему программному "ребенку"; мы потратили на него столько времени и денег, что не в силах выбросить его и начать заново. Возможно, мы боимся; руководство, скорее всего, не придет в восторг, захоти мы бросить все и снова сделать "то же самое". Мы должны рассматривать такие ситуации с точки зрения бизнеса, а не предаваться эмоциям. + +**9. Опасайся хитроумных приспособлений** + +Машины Руба Голдберга - это сложные машины, выполняющие сравнительно простые задачи, вроде "Автономного платочка". В мире автоматизации создание таких машин - очень веселое дело, и они могут делать крутые штуки вроде увязывания вместе разных инструментов для выполнения тест-задач. Минус в том, что это сложно понимать и поддерживать; надо опасаться создания того, что сложнее поддерживать, нежели выполнять эти задачи вручную. Эта статья расскажет больше об автоматизированных машинах Руба Голдберга; этот пост размышляет о состоянии "автоматизированности". + +**10. Не делай тестовые данные зависимыми от временных данных** + +Скрипт, с которым я столкнулся недавно, в один прекрасный день начал падать. Исследуя вопрос, мы выяснили, что падал он из-за смены месяца с июля на август. Скрипт был написан таким образом, что оракул проверял даты в июле, и в июле все было хорошо - приложение возвращало даты текущего месяца, июля. Когда дата сменилась на август, приложение начало возвращать даты августа, и тест падал. В этом случае надо не жестко кодировать даты июля, а динамически генерировать данные на основании текущего месяца. + +**Как можно и нельзя автоматизировать** + +**Нельзя**: + +* **Автоматизировать все ручные тесты**: ручные тесты прекрасны - они находят проблемы, о которых вы даже не помышляли. Но ручной подход к тестированию не всегда можно напрямую перенести на автоматизированные проверки. Возможно, стоит создать новые сценарии специально для автоматизации. +* **Делать автотесты задачей одного-единственного человека**: когда вы только начинаете, найм консультанта по автоматизации - хорошая мысль, однако убедитесь, что соответствующие знания доступны всем участникам проекта. В один прекрасный день консультант или ключевой исполнитель покинет вас, и разбираться с тест-набором придется всем остальным. +* **Автоматизировать все на свете**: сценарий автоматизируется не просто так - на это есть причины, его автоматизация каким-то образом ценна для проекта. Начните с рутинных задач, которые все равно выполняются ежедневно - и вы сразу увидите первую, мгновенную выгоду от усилий по автоматизации. +* **Автоматизировать, просто чтобы автоматизировать**: подумайте, что вам нужно, и что нужно прямо сейчас. Если вы настроены на 80-100% автоматизацию во всех проектах просто потому, что "это круто и так хочет генеральный директор, или "это хорошо звучит на собраниях совета директоров", то вы попусту тратите время и деньги. +* **Покупать лидирующий по рынку, наилучший инструмент автоматизации**: найдите инструмент, который подходит под ваши задачи, и убедитесь, что он действительно делает то, что обещает. Не поддавайтесь на уговоры продавцов купить дорогостоящую программу, которая очень крута прямо сейчас в этом конкретном проекте или на этой конкретной платформе. И не заставляйте другие проекты использовать инструмент, если он им не нужен. +* **Думать в терминах "прошел" и "упал"**: у вас будут упавшие кейсы. Это не значит, что там есть ошибка. Не воспринимайте упавший тест как сигнал о баге - вам нужно разобраться, ПОЧЕМУ тест упал. Также подумайте, действительно ли категории "прошел/упал" подходят для отчетности об автотестах? Возможно, стоит подумать о другой классификации, которая лучше опишет происходящее? +* **Запускать все подряд каждый божий раз**: подумайте о цели прогона ваших тестов. Если вам не нужно тестировать отдельную область - не делайте этого, тестируйте только ту функциональность, которая в этом нуждается. Прочее тестирование - это лишняя трата времени и сил, которая замусорит ваш отчет ненужными данными. Конечно, некоторые проверки могут гоняться постоянно, но убедитесь в том, что это оправданные меры. +* **Забывать тестировать собственные тесты**: привыкайте к идее тестировать свои тесты. Автоматизированный тест-сценарий не должен выпускаться в мир, пока вы не увидели, как он несколько раз упал. Запускайте тест в обстоятельствах, когда он безусловно упадет, чтобы учесть это, когда он будет выпущен в релиз. +* **Недооценивать усилия по поддержке автоматизированного набора тестов**: автоматизированный тест-сьют - не та штука, которую сделал и забыл, а она бегает себе там. Ваша система постоянно меняется, и тест-набор нужно обновлять и пополнять беспрестанно. Не сваливайте эту ответственность на единственного тех-тестировщика в вашей компании. + +**Нужно**: + +* **Дробить тесты на независимые сценарии**: куда легче определить, где гнездятся проблемы и ошибки, если ваш тест-набор состоит из кратких, конкретных тест-сценариев. Не пытайтесь впихнуть все в один сценарий. Очень, ОЧЕНЬ трудно разобраться, что же пошло не так, если вам надо докопаться до всего на свете, проверяющегося в вашем тесте. Пусть тесты будут краткими и простыми. +* **Сделать автоматизацию задачей всей команды проекта**: почему бы не дать возможность всем, а не только тестировщикам, влиять на набор автотестов? Разработчики, менеджеры проекта, продакт-оунеры - всем им есть что сказать на предмет автоматизированного тестирования, и они могут принести ему пользу. +* **Донести информацию о результатах автоматизированного тестирования до всех - и подумать, кто получает эти результаты**: предоставьте разную информацию разным людям в проекте. Разработчику нужна специфическая информация о прогоне автотестов, и она безразлична менеджеру проекта. Опросите всех заинтересованных лиц, выясните, какая информация им требуется. +* **Начинать с простых вещей и пополнять тест-сьюты по ходу дела**: начните с того, что вам необходимо, и следуйте по воркфлоу проекта. Проекты постоянно меняются - не надо тратить время, силы и деньги на то, что не будет использовано или изменится в последний момент. Создавайте набор тестов по кусочкам, шаг за шагом. +* **Заставить ваш фреймворк работать на износ**: вы приобрели дорогую программу, настроили ее и потратили время на создание и обновление наборов тестов. Пользуйтесь этим! Создайте набор, который может прогоняться часто И при этом ценен для проекта! Набор автотестов, который не запускается - это пустая трата денег. +* **Учитывать проектные и организационные изменения**: найдите программу, которая способна расти вместе с вашими проектами и вашей организацией, и выясните, что вы можете - и не можете - с ней делать. Если она вам не подходит, отбросьте ее. Нет смысла тратить силы и время на неподходящие вам ресурсы. +* **Разгрузить ручных тестировщиков**: думайте о наборе автотестов как о помощи мануальным тестировщикам. Освободите их от нудных повторяющихся задач, пусть они делают то, в чем они звезды - тестируют, а не тупо следуют сценариям. +* **Сделать запуск тестом простым и быстрым**: настройка и старт набора автотестов должна быть простой задачей и давать мгновенную обратную связь. Если ваш тест-набор замедлен или очень сложен, люди просто не будут заморачиваться с запуском. +* **Постоянно обновлять тест-набор**: если меняется ваш код - меняются автотесты, и это ваше золотое правило. Оно верно для ВСЕХ изменений базы кода. Правки багов, внедрение фич - все это ведет к изменениям тест-набора. + +_О паттернах проектирования/архитектуре есть ссылки в доп. материалах ниже. О создании фреймворка в теме про виды и инструменты._ + +Источники: + +* [7 характеристик хороших тестов](https://habr.com/ru/post/599507/) +* [Еще десять заповедей автоматизации](https://software-testing.ru/library/testing/testing-automation/3492-ten-more-commandments-of-automation) +* [Как можно и нельзя автоматизировать](https://software-testing.ru/library/testing/testing-automation/2940-starting-up-test-automation) + +Доп. материал: + +* [Святослав Куликов “Тестирование программного обеспечения. Базовый курс”](https://svyatoslav.biz/software\_testing\_book/) 3.2.2. Особенности тест-кейсов в автоматизации +* [Чистая архитектура в автотестах](https://www.youtube.com/watch?v=ZIg-yFJx2A8) +* [Элементы хорошего автотеста](https://software-testing.ru/library/testing/testing-for-beginners/3714-what-makes-a-good-automated-test) +* [Ловушки автоматизации (и 9 советов, как в них не попасть)](https://testengineer.ru/sovety-avtomatizacii/) +* [7 характеристик хороших тестов](https://habr.com/ru/post/599507/) +* [UI-автотесты: как делать не стоит](https://habr.com/ru/company/badoo/blog/419419/) +* [7 способов повысить эффективность автоматизации тестирования в Agile разработке](https://habr.com/ru/company/otus/blog/520712/) +* [UI-автотесты: как делать не стоит](https://habr.com/ru/company/badoo/blog/419419/) +* [ТОП-5 вопросов начинающего автоматизатора про автотесты](https://habr.com/ru/company/hh/blog/584574/) +* [Top 10 Test Automation Strategies And Best Practices](https://www.softwaretestinghelp.com/automation-testing-tutorial-7/) +* [Пожалуй, лучшая архитектура для UI тестов](https://habr.com/ru/company/protei/blog/523802/) +* [Распространенные паттерны и методологии UI-автоматизации: реальные примеры](https://telegra.ph/Rasprostranennye-patterny-i-metodologii-UI-avtomatizacii-realnye-primery-01-31) +* [SOLID и другие принципы объектно-ориентированного проектирования в контексте автоматизации](https://www.youtube.com/watch?v=xG6NOxiOLhU) +* [ООП, «святая троица» и SOLID: некоторый минимум знаний о них](https://habr.com/ru/post/446816/) +* [Принцип открытости-закрытости](https://habr.com/ru/company/tinkoff/blog/472186/) diff --git a/avtomatizaciya-beta/mutacionnoe-testirovanie-mutation-testing.md b/avtomatizaciya-beta/mutacionnoe-testirovanie-mutation-testing.md new file mode 100644 index 0000000..735af49 --- /dev/null +++ b/avtomatizaciya-beta/mutacionnoe-testirovanie-mutation-testing.md @@ -0,0 +1,50 @@ +# Мутационное тестирование (Mutation testing) + +Юнит тесты помогают нам удостовериться, что код работает так, как мы этого хотим. Одной из метрик тестов является процент покрытия строк кода (Line Code Coverage). Но насколько корректен данный показатель? Имеет ли он практический смысл и можем ли мы ему доверять? Ведь если мы удалим все assert строки из тестов, или просто заменим их на assertSame(1, 1), то по-прежнему будем иметь 100% Code Coverage, при этом тесты ровным счетом не будут тестировать ничего. Насколько вы уверены в своих тестах? Покрывают ли они все ветки выполнения ваших функций? Тестируют ли они вообще хоть что-нибудь? Ответ на этот вопрос даёт мутационное тестирование. + +Мутационное тестирование (MT, Mutation Testing, Mutation Analysis, Program mutation, Error-based testing, Fault-based testing strategy) - это вид тестирования ПО методом белого ящика, основанный на всевозможных изменениях (мутациях) частей исходного кода и проверке реакции на эти изменения набора автоматических юнит тестов. Изменения в мутантной программе сохраняются крайне небольшими, поэтому это не влияет на общее исполнение программы. Если тесты после изменения кода не падают (failed), значит либо этот код недостаточно покрыт тестами, либо написанные тесты бесполезны. Критерий, определяющий эффективность набора автоматических тестов, называется Mutation Score Indicator (MSI). + +Введем некоторые понятия из теории мутационного тестирования: + +Для применения этой технологии у нас, очевидно, должен быть исходный код (source code), некоторый набор тестов (для простоты будем говорить о модульных - unit tests). После этого можно начинать изменять отдельные части исходного кода и смотреть, как реагируют на это тесты. Одно изменение исходного кода будем называть Мутацией (Mutation). Например, изменение бинарного оператора "+" на бинарный "-" является мутацией кода. Результатом мутации является Мутант (Mutant) - то есть это новый мутированный код. Каждая мутация любого оператора в вашем коде (а их сотни) приводит к новому мутанту, для которого должны быть запущены тесты. Кроме изменения "+" на "-", существует множество других мутационных операторов (Mutation Operator, Mutator, faults or mutation rules), каждый из которых имеет свою цель и применение: + +* Мутация значений (Value mutation): изменение значения параметра или константы; +* Мутация операторов (Statement mutation): реализуется путем редактирования, удаления или перестановки оператора; +* Мутация решения (Decision Mutation): изменение логических, арифметических и реляционных операторов. + +В зависимости от результата теста мутанты делятся на: + +* Выжившие мутанты (Survived Mutants): мутанты, которые все еще живы, то есть не обнаруживаются при выполнении теста. Их также называют live mutants; +* Убитые мутанты (Killed Mutants): мутанты, обнаруженные тестами; +* Эквивалентные мутанты (Equivalent Mutants): мутанты, которые изменив части кода не привели к какому-либо фактическому изменению в выводе программы, т.е. они эквивалентны исходному коду; +* Нет покрытия (No coverage): в этом случае мутант выжил, потому что для этого мутанта не проводились тесты. Этот мутант находится в части кода, не затронутой ни одним из ваших тестов. Это означает, что наш тестовый пример не смог его охватить; +* Тайм-аут (Timeout): выполнение тестов с этим активным мутантом привело к тайм-ауту. Например, мутант привел к бесконечному циклу в вашем коде. Не обращайте внимание на этого мутанта. Он считается «обнаруженным». Логика здесь в том, что если этот мутант будет внедрен в ваш код, ваша CI-сборка обнаружит его, потому что тесты никогда не завершатся; +* Ошибка выполнения (Runtime error): выполнение тестов привело к ошибке (а не к провалу теста). Это может произойти, когда средство запуска тестов не работает. Например, когда средство выполнения теста выдает ошибку OutOfMemoryError или для динамических языков, когда мутант привел к неразборчивому коду. Не тратьте слишком много внимания на этого мутанта. Он не отображается в вашей оценке мутации; +* Ошибка компиляции (Compile error): это состояние возникает, когда это компилируемый язык. Мутант привел к ошибке компиляции. Он не отражается в оценке мутации, поэтому вам не нужно уделять слишком много внимания изучению этого мутанта; +* Игнорируется (Ignored): мы можем видеть это состояние, когда пользователь устанавливает конфигурации для его игнорирования. Он будет отображаться в отчетах, но не повлияет на оценку мутации; +* Тривиальные мутанты (Trivial Mutants): фактически ничего не делают. Любой тестовый пример может убить этих мутантов. Если в конце тестирования остались тестовые примеры, значит, это недопустимый мутант (invalid mutant). + +Метрики: + +* Обнаруженные (Detected): это количество мутантов, обнаруженных нашим тестом, то есть убитых мутантов. Detected = Killed mutants +Timeout; +* Необнаруженные (Undetected): это количество мутантов, которые не были обнаружены нашим тестом, то есть выживших мутантов. Undetected = Survived mutants + No Coverage; +* Покрытые (Covered): это количество мутантов покрытых тестами. Covered = Detected mutants + Survived mutants; +* Действительные (Valid): это количество действительных мутантов, не вызвавших ошибки компиляции или рантайма. Valid = Detected mutants + Undetected mutants; +* Недействительные (Invalid): это количество всех недействительных мутантов, т.е. они не могли быть протестированы, так как вызывали ошибку компиляции или выполнения. Invalid = Runtime errors + Compile errors; +* Всего мутантов (Total mutants): содержит всех мутантов. Total = Valid + Invalid + Ignored; +* Оценка мутации на основе покрытого кода (Mutation score based on covered code): оценивает общий процент убитых мутантов на основе покрытия кода. Mutation score based on covered code = Detected / Covered \* 100; +* Неправильный синтаксис (Incorrect syntax): их называют мертворожденными мутантами, это представлено как синтаксическая ошибка. Обычно эти ошибки должен обнаруживать компилятор; +* Оценка мутации (Mutation score): это оценка, основанная на количестве мутантов. В идеале равна 1 (100%). Mutation score = Detected / Valid \* 100 (%). + +Источники: + +* [Мутационное тестирование](https://habr.com/ru/post/334394/) +* [Mutation Testing Guide: What You Should Know](https://www.softwaretestingmaterial.com/mutation-testing/) + +Доп. материал: + +* [Mutation testing](https://medium.com/@gayanper/mutation-testing-e16a5c89876e) +* [Mutation Testing](https://testing.googleblog.com/2021/04/mutation-testing.html) +* [What Is Mutation Testing: Tutorial With Examples](https://www.softwaretestinghelp.com/what-is-mutation-testing/) +* [Мутанты, убийства - это о чем? О тестировании](https://testengineer.ru/mutacionnoe-testirovanie-i-kak-ego-provodit/) +* [Изучаем mutmut - инструмент для мутационного тестирования на Python](https://habr.com/ru/company/vdsina/blog/512630/) diff --git a/avtomatizaciya-beta/obshee.md b/avtomatizaciya-beta/obshee.md new file mode 100644 index 0000000..d567c5f --- /dev/null +++ b/avtomatizaciya-beta/obshee.md @@ -0,0 +1,201 @@ +# Общее + +* _Автоматизация тестирования (test automation): Использование программного обеспечения для осуществления или помощи в проведении определенных тестовых процессов, например, управление тестированием, проектирование тестов, выполнение тестов и проверка результатов. (ISTQB)_ +* _Автоматизация выполнения тестов (test execution automation): Использование программного обеспечения (например, средств захвата/воспроизведения) для контроля выполнения тестов, сравнения полученных результатов с эталонными, установки предусловий тестов и других функций контроля тестирования и организации отчетов. (ISTQB)_ +* _Автоматизированное тестирование (scripted testing): Выполнение тестов, реализуемое при помощи заранее записанной последовательности тестов. (ISTQB)_ +* _Автоматизированное тестовое обеспечение (automated testware): Тестовое обеспечение, используемое в автоматизированном тестировании, например, инструментальные сценарии. (ISTQB)_ +* _Автоматизированный сценарий тестирования (test script): Обычно используется как синоним спецификации процедуры тестирования, как правило, автоматизированной. (ISTQB)_ + +**Автоматизированное тестирование** (automated testing, test automation) - набор техник, подходов и инструментальных средств, позволяющий исключить человека из выполнения некоторых задач в процессе тестирования. + +Многие задачи и действия, описанные в ИСО/МЭК/ИИЭР 29119-2 как процессы Менеджмента Тестирования и Динамического Тестирования, а также многие аспекты методов тестирования, представленные в ИСО/МЭК/ИИЭР 29119-4, могут быть автоматизированы. Автоматизация тестирования требует использования программного обеспечения, обычно называемого инструментами тестирования. + +**Области применения автоматизации**: + +* **Регрессионное тестирование**: необходимость выполнять вручную тесты, количество которых неуклонно растет с каждым билдом, но вся суть которых сводится к проверке того факта, что ранее работавшая функциональность продолжает работать корректно. +* **Инсталляционное тестирование и настройка тестового окружения**: множество часто повторяющихся рутинных операций по проверке работы инсталлятора, размещения файлов в файловой системе, содержимого конфигурационных файлов, реестра и т.д. Подготовка приложения в заданной среде и с заданными настройками для проведения основного тестирования. +* **Конфигурационное тестирование и тестирование совместимости**: выполнение одних и тех же тест-кейсов на большом множестве входных данных, под разными платформами и в разных условиях. Классический пример: есть файл настроек, в нём сто параметров, каждый может принимать сто значений: существует 100 100 вариантов конфигурационного файла - все их нужно проверить. +* **Использование комбинаторных техник тестирования** (в т.ч. доменного тестирования): генерация комбинаций значений и многократное выполнение тест-кейсов с использованием этих сгенерированных комбинаций в качестве входных данных. +* **Модульное тестирование**: проверка корректности работы атомарных участков кода и элементарных взаимодействий таких участков кода - практически невыполнимая для человека задача при условии, что нужно выполнить тысячи таких проверок и нигде не ошибиться. +* **Интеграционное тестирование**: глубокая проверка взаимодействия компонентов в ситуации, когда человеку почти нечего наблюдать, т.к. все представляющие интерес и подвергаемые тестированию процессы проходят на уровнях более глубоких, чем пользовательский интерфейс. +* **Тестирование безопасности**: необходимость проверки прав доступа, паролей по умолчанию, открытых портов, уязвимостей текущих версий ПО и т.д., т.е. быстрое выполнение очень большого количества проверок, в процессе которого нельзя что-то пропустить, забыть или «не так понять». +* **Тестирование производительности**: создание нагрузки с интенсивностью и точностью, недоступной человеку. Сбор с высокой скоростью большого набора параметров работы приложения. Анализ большого объема данных из журналов работы системы автоматизации. +* **Дымовой тест для крупных систем**: выполнение при получении каждого билда большого количества достаточно простых для автоматизации тест-кейсов. +* **Приложения (или их части) без графического интерфейса**: проверка консольных приложений на больших наборах значений параметров командной строки (и их комбинаций). Проверка приложений и их компонентов, вообще не предназначенных для взаимодействия с человеком (веб-сервисы, серверы, библиотеки и т.д.). +* **Длительные, рутинные, утомительные для человека и/или требующие повышенного внимания операции**: проверки, требующие сравнения больших объёмов данных, высокой точности вычислений, обработки большого количества размещенных по всему дереву каталогов файлов, ощутимо большого времени выполнения и т.д. Особенно, когда такие проверки повторяются очень часто. +* **Проверка «внутренней функциональности» веб приложений** (ссылок, доступности страниц и т.д.): автоматизация предельно рутинных действий (например, проверить все 30’000+ ссылок на предмет того, что все они ведут на реально существующие страницы). Автоматизация здесь упрощается в силу стандартности задачи - существует много готовых решений. +* **Стандартная, однотипная для многих проектов функциональность**: даже высокая сложность при первичной автоматизации в таком случае окупится за счёт простоты многократного использования полученных решений в разных проектах. +* **“Технические задачи”**: проверки корректности протоколирования, работы с базами данных, корректности поиска, файловых операций, корректности форматов и содержимого генерируемых документов и т.д. + +**Преимущества автоматизации:** + +* Скорость выполнения тест-кейсов может в разы и на порядки превосходить возможности человека. Если представить, что человеку придётся вручную сверять несколько файлов размером в несколько десятков мегабайт каждый, оценка времени ручного выполнения становится пугающей: месяцы или даже годы. При этом 36 проверок, реализуемых в рамках дымового тестирования командными скриптами, выполняются менее чем за пять секунд и требуют от тестировщика только одного действия - запустить скрипт; +* Отсутствует влияние человеческого фактора в процессе выполнения тест кейсов (усталости, невнимательности и т.д.). Продолжим пример из предыдущего пункта: какова вероятность, что человек ошибется, сравнивая (посимвольно!) даже два обычных текста размером в 100 страниц каждый? А если таких текстов 10? 20? И проверки нужно повторять раз за разом? Можно смело утверждать, что человек ошибется гарантированно. Автоматика не ошибется; +* Средства автоматизации способны выполнить тест-кейсы, в принципе непосильные для человека в силу своей сложности, скорости или иных факторов. И снова наш пример со сравнением больших текстов является актуальным: мы не можем позволить себе потратить годы, раз за разом выполняя крайне сложную рутинную операцию, в которой мы к тому же будем гарантированно допускать ошибки. Другим прекрасным примером непосильных для человека тест-кейсов является исследование производительности, в рамках которого необходимо с высокой скоростью выполнять определённые действия, а также фиксировать значения широкого набора параметров. Сможет ли человек, например, сто раз в секунду измерять и записывать объем оперативной памяти, занимаемой приложением? Нет. Автоматика сможет; +* Средства автоматизации способны собирать, сохранять, анализировать, агрегировать и представлять в удобной для восприятия человеком форме колоссальные объемы данных. В нашем примере с дымовым тестированием «Конвертера файлов» объем данных, полученный в результате тестирования, невелик - его вполне можно обработать вручную. Но если обратиться к реальным проектным ситуациям, журналы работы систем автоматизированного тестирования могут занимать десятки гигабайт по каждой итерации. Логично, что человек не в состоянии вручную проанализировать такие объёмы данных, но правильно настроенная среда автоматизации сделает это сама, предоставив на выход аккуратные отчеты в 2-3 страницы, удобные графики и таблицы, а также возможность погружаться в детали, переходя от агрегированных данных к подробностям, если в этом возникнет необходимость; +* Средства автоматизации способны выполнять низкоуровневые действия с приложением, операционной системой, каналами передачи данных и т.д. В одном из предыдущих пунктов мы упоминали такую задачу, как «сто раз в секунду измерить и записать объем оперативной памяти, занимаемой приложением». Подобная задача сбора информации об используемых приложением ресурсах является классическим примером. Однако средства автоматизации могут не только собирать подобную информацию, но и воздействовать на среду исполнения приложения или само приложение, эмулируя типичные события (например, нехватку оперативной памяти или процессорного времени) и фиксируя реакцию приложения. Даже если у тестировщика будет достаточно квалификации, чтобы самостоятельно выполнить подобные операции, ему всё равно понадобится то или иное инструментальное средство - так почему не решить эту задачу сразу на уровне автоматизации тестирования? + +**Недостатки автоматизации:** + +* Необходимость наличия высококвалифицированного персонала в силу того факта, что автоматизация - это «проект внутри проекта» (со своими требованиями, планами, кодом и т.д.). Даже если забыть на мгновение про «проект внутри проекта», техническая квалификация сотрудников, занимающихся автоматизацией, как правило, должна быть ощутимо выше, чем у их коллег, занимающихся ручным тестированием. +* Разработка и сопровождение как самих автоматизированных тест-кейсов, так и всей необходимой инфраструктуры занимает очень много времени. Ситуация усугубляется тем, что в некоторых случаях (при серьёзных изменениях в проекте или в случае ошибок в стратегии) всю соответствующую работу приходится выполнять заново с нуля: в случае ощутимого изменения требований, смены технологического домена, переработки интерфейсов (как пользовательских, так и программных) многие тест-кейсы становятся безнадежно устаревшими и требуют создания заново. +* Автоматизация требует более тщательного планирования и управления рисками, т.к. в противном случае проекту может быть нанесен серьезный ущерб (см. предыдущий пункт про переделку с нуля всех наработок). +* Коммерческие средства автоматизации стоят ощутимо дорого, а имеющиеся бесплатные аналоги не всегда позволяют эффективно решать поставленные задачи. И здесь мы снова вынуждены вернуться к вопросу ошибок в планировании: если изначально набор технологий и средств автоматизации был выбран неверно, придётся не только переделывать всю работу, но и покупать новые средства автоматизации. +* Средств автоматизации крайне много, что усложняет проблему выбора того или иного средства, затрудняет планирование и определение стратегии тестирования, может повлечь за собой дополнительные временные и финансовые затраты, а также необходимость обучения персонала или найма соответствующих специалистов. + +Исходя из вышеперечисленного, существуют\*\* случаи, в которых автоматизация, скорее всего, приведёт только к ухудшению ситуации\*\*. Вкратце - это все те области, где требуется человеческое мышление, а также некоторый перечень технологических областей: + +* Планирование, разработка тест-кейсов, написание отчетов о дефектах, анализ результатов тестирования и отчётность: компьютер пока не научился думать; +* Функциональность, которую нужно (достаточно) проверить всего несколько раз, тест-кейсы, которые нужно выполнить всего несколько раз (если человек может их выполнить): затраты на автоматизацию не окупятся; +* Низкий уровень абстракции в имеющихся инструментах автоматизации: придётся писать очень много кода, что не только сложно и долго, но и приводит к появлению множества ошибок в самих тест-кейсах. +* Слабые возможности средства автоматизации по протоколированию процесса тестирования и сбору технических данных о приложении и окружении: есть риск получить данные в виде «что-то где-то сломалось», что не помогает в диагностике проблемы. +* Низкая стабильность требований: придётся очень многое переделывать, что в случае автоматизации обходится дороже, чем в случае ручного тестирования. +* Сложные комбинации большого количества технологий: высокая сложность автоматизации, низкая надёжность тест-кейсов, высокая сложность оценки трудозатрат и прогнозирования рисков. +* Проблемы с планированием и ручным тестированием: автоматизация хаоса приводит к появлению автоматизированного хаоса, но при этом ещё и требует трудозатрат. Сначала стоит решить имеющиеся проблемы, а потом включаться в автоматизацию. +* Нехватка времени и угроза срыва сроков: автоматизация не приносит мгновенных результатов. Поначалу она лишь потребляет ресурсы команды (в том числе время). Также есть универсальный афоризм: «лучше руками протестировать хоть что-то, чем автоматизированно протестировать ничего». +* Области тестирования, требующие оценки ситуации человеком (тестирование удобства использования, тестирование доступности и т.д.): в принципе, можно разработать некие алгоритмы, оценивающие ситуацию так, как её мог бы оценить человек. Но на практике живой человек может сделать это быстрее, проще, надёжнее и дешевле. + +Далее копипаста различных вопросов-ответов из цикла статей на хабре. + +**Зачем нужна автоматизация, если наши ручные тестировщики и так справляются?** + +Действительно, прежде чем вводить автоматизацию на проекте, потому что это “стильно, модно, молодежно”, и у всех оно есть, стоит учесть следующие факторы: + +* Как долго будет жить проект, каков его масштаб, насколько сильно и часто он меняется; +* Оценить, насколько трудозатратно будет писать автотесты в каждом конкретном случае. Возможно, что автоматизировать ваш функционал будет гораздо сложнее, дольше и дороже, чем тестировать его руками; +* Также, если на проекте ожидается “выпиливаем всё старое и пишем новое с нуля”, время автотестов еще не пришло. + +Но если ваш проект: + +* стабильно развивается и растет; +* увеличивается количество разработчиков; +* приложение начинает обрастать новым функционалом. + +То прямо пропорционально начнет увеличиваться и время тестирования. Рано или поздно оно дойдет до критического момента, когда регресс будет занимать больше времени, чем велась разработка. Это значит, что пришло время задуматься об автоматизации тестирования. + +Автотесты станут гарантией, что ничего из старого не отвалилось, пока разработчики делали новые крутые штуки. Особенно, если эти новые штуки делались в совершенно других частях кода. Ручные регрессы, в данном случае, это, конечно, хорошо, но тут и человеческий фактор, и замыленный глаз, и непредсказуемость мест, в которых могут всплыть баги.При этом ручное тестирование полностью никуда не уходит, так как новый функционал все еще будет проверяться руками. Нет смысла автоматизировать то, что возможно не взлетит и уже через неделю будет выпилено или отправлено на доработки. + +Но вместо того, чтобы занимать ручного тестировщика написанием тест-кейсов на новый функционал, поддержку документации и постоянными регрессами, можно выделить ему хотя бы один день в неделю на автоматизацию, помочь на старте с настройками инфраструктуры, и уже через несколько месяцев у вас начнут гонять первые автотесты, ваши задачи станут в разы быстрее доходить до релизов а заодно станет больше уверенности в стабильности выпускаемого кода. + +Еще автоматизированный регресс позволяет тестировщикам больше времени уделять полезным задачам, например, исследовательскому тестированию. Кроме того, появится лучшее понимание, как работает приложение под капотом, что точно пригодится даже в ручном тестировании. + +**Можно ли начать писать автотесты за один день?** + +Писать автотесты можно начать прямо в этот самый момент, но лучше с этим не торопиться и подойти к вопросу осмысленно. + +Если на проекте еще не было автоматизации, то нужно обязательно начать с ресерча существующих инструментов, фреймворков, подходов. Почитать о том, с какими проблемами сталкиваются пользователи, и как быстро они решаются. Оценить все плюсы и минусы, выбрать самое подходящее, с чем будет легко и приятно работать. Цена ошибки на старте намного меньше, чем когда вы уже активно автоматизируете и вдруг понимаете, что выбранный вами фреймворк никому не удобен и совершенно вам не подходит. + +Если вы никогда раньше не занимались автотестами, первое время может быть сложно.. Непросто начать писать автотесты сразу, если еще нет никаких примеров и не на что опереться. Благо, сейчас в интернете очень много различных статей с массой хороших примеров кода, которые можно брать, подстраивать под себя и разбираться, как они работают. + +В конце концов, чтобы научиться автоматизировать, надо просто начать автоматизировать. Это действительно работает. + +Идеально, если со стороны разработчиков будут те, кто готов на первых порах вам помогать разбираться в коде, отвечать на все ваши вопросы. В hh именно так и было - первое время, когда мы только начинали писать свои первые автотесты, мы просто заваливали наших ребят всевозможными вопросами. Благодаря им мы и пришли к тому, что имеем сегодня + +Но вполне возможно, что у вашей команды не будет времени помогать вам с автотестами. К сожалению, такое возможно, и не стоит их за это винить. Если вы попали в такую ситуацию, не отчаивайтесь! В интернете очень мощное комьюнити тестировщиков. В том же самом телеграме есть чаты, где 24/7 вам ответят на все вопросы и помогут разобраться. + +**Можно ли заставить разработчиков писать автотесты?** + +В теории, конечно можно. Но скорее всего они будут не сильно этому рады, да и вряд ли кто-то будет рад в принципе. + +Во-первых, это замедлит саму разработку. Вместо того, чтобы писать код, разрабатывать продуктовый функционал, разработчики будут заниматься написанием автотестов. + +Во-вторых, это дорого. + +Ну и в-третьих, у каждого должна быть своя зона ответственности. Разработчики создают функционал, тестировщики - его проверяют. С автотестами все точно так же, как и в обычном тестировании. Вот юнит-тесты - да, зона ответственности разработчиков, но UI - это уже тестировщеское. + +По факту, этот вопрос равен “Зачем нам тестировщики, если можно попросить разработчиков самим проверять то, что они написали?”. + +**Не замедляют ли автотесты разработку?** + +Начнем с того, что в первую очередь автотесты мощно сокращают время на тестирование и регрессы, а значит помогают выпускать фичи в релизы быстрее. + +Но, действительно, иногда они увеличивают время разработки. Например, когда разработчик меняет покрытый автотестами функционал, в связи с чем приходится перед мержем своего кода править падающие автотесты. + +Чтобы это не становилось проблемой, при оценке и декомпозиции задачи нужно закладывать время на возможные фиксы автотестов. В идеале на таких встречах должен присутствовать тестировщик, который сможет сказать, какие автотесты могут быть затронуты новым функционалом. Тогда время задачи будет предсказуемым и не увеличится. + +Но чтобы это нормально работало, нужно, чтобы на проекте была стабильная инфраструктура, и автотесты падали по понятным причинам. Тогда разработчикам не придется тратить свое драгоценное время, чтобы в каждой задаче разбираться, из-за чего именно упал автотест - из-за его кода или из-за проблем на тестовом стенде. + +**Можно ли писать 1 автотест сразу на обе платформы?** + +Конечно, можно. Существуют кроссплатформенные фреймворки, и многие их используют. Но мы сразу выбрали для себя нативные, как более стабильные, надежные и легко поддерживаемые. + +В чем главные проблемы кроссплатформенных фреймворков? + +Это отдельно живущий от вашего приложения код. Если вам понадобится в нем что-то доработать или настроить под себя, то придется идти к другим разработчикам, делать запросы и ждать, пока они сделают и выпустят это на своей стороне, что не всегда удобно и продуктивно. Частые проблемы при выходе новых ОС и баги. Нужно ждать поддержку со стороны разработчиков фреймворка, и это ожидание весьма непредсказуемое. Вы не знаете, когда всё поправят и оптимизируют, и когда оно у вас наконец заработает. То есть вы зависимы от других людей. Возможно, выбранный вами кроссплатформенный фреймворк написан на языке программирования, который не знаком вашим разработчикам. Тогда помощь от них будет получить сложнее, если она вам вдруг понадобится. Также разработчики в этом случае не смогут писать и править автотесты самостоятельно. + +Может показаться, что написать один кроссплатформенный автотест быстрее и проще, чем два нативных. Но на самом деле это не так. + +Во-первых, всё “сэкономленное” время в последствии может уйти на поддержку такого автотеста для двух платформ. Это может стать проблемой из-за обновляемой специфики разных ОС. Кроме того, часто поведение одной и той же фичи или кнопки может различаться для iOS и Android. + +Во-вторых, если при выборе между кроссплатформенным фреймворком и нативными, главным аргументом является “выучить один язык программирования проще, чем два”, не спешите принимать решение. Синтаксис языков Kotlin и Swift очень похожи (по-крайней мере, в вопросах написания автотестов). Написав автотест на одном из языков, вы без труда напишете точно такой же для второй платформы. + +**Когда автотесты начнут приносить больше пользы, чем проблем?** + +Ровно тогда, когда: + +* на вашем проекте будет настроена стабильная инфраструктура, +* автотесты будут встроены в ваш CI/CD, а не запускаться локально у кого-то, когда об их существовании вспомнили, +* автотесты будут падать приемлемое для вас количество раз, то есть не будут флаковать. + +Даже если тестов совсем немного, но они уже гоняются хотя бы перед мержем ветки разработчика, то это уже польза: минус какое-то количество ручных проверок и гарантия того, что ваше приложение как минимум запускается. + +**За сколько месяцев можно прийти к 100% покрытию?** + +Вопрос 100% покрытия - очень скользкий. Не хочется вдаваться в бесполезные споры о том, существует ли оно вообще и нужно ли к нему стремиться. Но поскольку его задают очень часто, давайте разбираться. + +Во-первых, стоит рассматривать покрытие каждой фичи отдельно. + +Во-вторых, глобально ответ на вопрос “на сколько у тебя покрыта эта фича” будет основываться на опыте и знании продукта тестировщика. + +Оценивая покрытие фичи, я рассуждаю следующим образом: + +все позитивные проверки - это 60-70% от всего покрытия, + +далее добавляем негативные проверки (всевозможные прерывания, сворачивания-разворачивания экранов, зероскрины и т.п.) - получаем 90%. + +Оставшиеся 10% - это сложновоспроизводимые сценарии, зависимости от других фичей и т.д., которые покрывать либо вообще не стоит (подумайте, выдержит ли такую нагрузку ваш CI и стоит ли того время на поддержку таких автотестов), либо оставлять это на самую последнюю очередь. Также добавлю, что не все фичи в принципе нужно автоматизировать. Иногда трудозатраты на автоматизацию какой-то невероятно сложной проверки сильно преувеличивают возможность один раз перед релизом быстро проверить ее руками. Чтобы не оставлять вопрос менеджера без ответа - выявляем среди всей функциональности приложения наиболее критичный и в нём смотрим, какое количество позитивных и негативных проверок нам нужно автоматизировать в первую очередь, чтобы быть уверенными, что функционал работает. Далее смотрим какое количество тестировщиков сколько времени готовы уделять автоматизации и считаем, как долго мы будем это автоматизировать. + +**Сколько нужно тестировщиков, чтобы автоматизировать весь проект?** + +Расскажу историю об автоматизации мобильных приложений в hh.ru. + +В разные периоды времени у нас было от 2 до 4 тестировщиков на всё мобильное направление. Примерно за год мы пришли к практически полному покрытию регрессов на обе платформы. И это с учетом того, что мы продолжали тестировать функционал руками и проводить ручные регрессы, а на андроид дважды переезжали на новый фреймворк. В итоге, кстати, мы остановились на Kaspresso, с которым тесты стали сильно стабильнее и проще в написании. Каждый переезд был большим объемным рефакторингом, так как до этого мы уже успели написать какое-то значительное количество автотестов. Но тем не менее, за один год регрессы были автоматизированы. + +Иными словами, любым количеством тестировщиков можно автоматизировать проект, если выделить на это достаточно времени. Но возникает вопрос: как тестировщику успевать и руками тестировать, и автотесты писать? Иногда это действительно сложно. Особенно если идет большой поток нового функционала, который срочно нужно тестировать. Всем хочется успеть в релиз, и задачам ставят больший приоритет. Знакомая ситуация. Что делать? Садимся. Понимаем, что автотесты в недалеком будущем принесут нам максимум пользы и выделяем каждому тестировщику, например, один день в неделю под автоматизацию. Мы такое практикуем, когда у тестировщиков завал с ручным тестированием, и это работает. Для автоматизации можно выбрать день после релиза, когда уже ничего не горит, и тестировщик с чистой совестью может писать автотесты, не отвлекаясь на другие задачи. + +**Как вам живется с автоматизированными регрессами?** + +За два года, что мы живем с автоматизированным регрессом, у нас надежно устаканился недельный релиз-трейн. Релизы регулярно отправляются в прод без проведения ручных регрессов благодаря количеству, качеству и, главное, доверию к автотестам. + +Помимо того, что автотесты запускаются на релизных ветках, весь набор автотестов всегда прогоняется на фиче-ветках разработчиков перед мерджем. В девелоп/мастер не допускается код, который уронил тесты. Благодаря этому мы поддерживаем стабильность девелопа, мы уверены в нем и можем отрезать релизную ветку в любой момент. + +Для тестировщика автоматизированный регресс может означать больше свободного времени для более важных и полезных задач - это, например, написание новых автотестов, увеличение стабильности существующих, развитие своего направления и тому подобные крутые задачи. + +**Много ли времени уходит на поддержку автотестов?** + +Поддержка автотестов встроена в наши процессы разработки. Как это работает - каждую неделю назначается дежурный тестировщик, одной из задач которого является следить за стабильностью тестов. Если тест упал, дежурный должен разобраться в причине падения и назначить ответственного на фикс. Если тест упал из-за собственной нестабильности - задача на тестировщика, если тест нашел баг - на разработчика, код которого повлиял на этот автотест. По опыту, чаще всего это не занимает много времени - один тестировщик тратит несколько часов за неделю. + +Более сложные задачи - развитие, улучшение и оптимизация, фиксы инфраструктуры. Такие задачи идут наравне с разработкой продуктового функционала и имеют соответствующий флоу (проработка, декомпозиция, оценка, разработка и тд). Это случается не слишком часто, в среднем раз в квартал на каждую платформу. Тут важно отметить, что чаще всего это не самые высокоприоритетные задачи, и делаются они, когда у команды появляется на это ресурс. + +Если всё четко настроить, научиться работать с флакующими тестами и по-максимуму их не допускать, то поддержка автотестов занимает мало времени и приносит много пользы. + +**Насколько сложно найти мобильного автоматизатора?** + +Порой сложно найти просто хорошего мобильного тестировщика с релевантным опытом, а с опытом автоматизации в конкретном стеке технологий дела обстоят еще сложнее. + +В мобильные команды hh.ru мы обычно ищем просто крутых ручных тестировщиков, которые хотят развиваться в сторону автоматизации. Во время собеседований базовые знания в программировании, конечно, являются плюсом, но не решающим фактором. Автоматизации мы готовы обучать у себя. А вот что действительно важно - чтобы человек стремился развиваться, умел и хотел обучаться и был проактивным в этих моментах. Конечно, сложно точно определить такое во время собеседований, но и не совсем невозможно. + +Источники: + +* [Святослав Куликов “Тестирование программного обеспечения. Базовый курс”](https://svyatoslav.biz/software\_testing\_book/). Раздел 3: Автоматизация тестирования +* [ТОП-5 вопросов ручных тестировщиков про автоматизацию](https://habr.com/ru/company/hh/blog/575390/) +* [ТОП-5 вопросов менеджера про автоматизацию](https://habr.com/ru/company/hh/blog/577664/) +* [ТОП-5 вопросов технического директора про автоматизацию](https://habr.com/ru/company/hh/blog/582968/) + +Доп. материал: + +* [Введение в автоматизированное тестирование](https://www.youtube.com/watch?v=YLEhKE4vdHw) +* [10 Tips You Should Read Before Automating Your Testing Work](https://www.softwaretestinghelp.com/10-tips-you-should-read-before-automating-your-testing-work/) +* [Manual And Automation Testing Challenges](https://www.softwaretestinghelp.com/manual-and-automation-testing-challenges/) +* [How To Translate Manual Test Cases Into Automation Scripts? - A Step By Step Guide With Example](https://www.softwaretestinghelp.com/how-to-translate-manual-test-cases-into-automation-scripts/) +* [Test Automation - Is It A Specialized Career? Can Normal Testers Do Automation Also?](https://www.softwaretestinghelp.com/test-automation-specialized-career/) diff --git a/avtomatizaciya-beta/parallelnoe-testirovanie-parallel-testing.md b/avtomatizaciya-beta/parallelnoe-testirovanie-parallel-testing.md new file mode 100644 index 0000000..5451932 --- /dev/null +++ b/avtomatizaciya-beta/parallelnoe-testirovanie-parallel-testing.md @@ -0,0 +1,19 @@ +# Параллельное тестирование (Parallel testing) + +Обычно большинство команд тестирования выполняют свои тесты по одному. Этот процесс называется последовательным тестированием или серийным тестированием (sequential testing or serial testing). В процессе последовательного тестирования каждый тестовый пример запускается один за другим и следующий тест не начинается, пока не завершится предыдущий. Последовательный процесс тестирования требует много времени, усилий и ресурсов. Чтобы выпускать качественные продукты в кратчайшие сроки, более эффективным будет параллельное тестирование. + +Параллельное тестирование включает в себя в основном автоматизированное тестирование нескольких версий одного и того же приложения или разных компонентов приложения одновременно и с одинаковыми входными данными, чтобы сократить общее время выполнения теста путем интеграции фреймворка автоматизации с облачными решениями и виртуализацией. + +![https://www.guru99.com/images/4-2016/040516\_0510\_ParallelTes2.png](https://www.guru99.com/images/4-2016/040516\_0510\_ParallelTes2.png) + +Пример: когда какая-либо организация переходит от старой системы к новой, legacy является важной частью. Передача этих данных является сложным процессом. При тестировании программного обеспечения проверка совместимости вновь разработанной системы со старой системой осуществляется посредством «параллельного тестирования». + +Источники: + +* [Parallel Testing Guide: How To Perform Parallel Testing](https://www.softwaretestingmaterial.com/parallel-testing/) +* [What is Parallel Testing? Definition, Approach, Example](https://www.guru99.com/parallel-testing.html) + +Доп. материал: + +* [Parallel testing: get feedback earlier, release faster](https://medium.com/azimolabs/parallel-testing-get-feedback-earlier-release-faster-b66d4dd08930) +* [What Is Parallel Testing And Why Is It Important?](https://www.lambdatest.com/blog/what-is-parallel-testing-and-why-to-adopt-it/) diff --git a/avtomatizaciya-beta/podkozhnyi-test-subcutaneous-test.md b/avtomatizaciya-beta/podkozhnyi-test-subcutaneous-test.md new file mode 100644 index 0000000..3da73c1 --- /dev/null +++ b/avtomatizaciya-beta/podkozhnyi-test-subcutaneous-test.md @@ -0,0 +1,34 @@ +# Подкожный тест (Subcutaneous test) + +Впервые упоминание встречается в 2010 году у Jimmy Bougard в [блоге](https://lostechies.com/jimmybogard/2010/08/25/an-effective-testing-strategy/): ”В то время как модульный тест фокусируется на мелкомасштабном дизайне, подкожный тест не касается дизайна, а вместо этого проверяет основные входы и выходы системы в целом”, затем в докладе Matt Davies and Rob Moore - “[Microtesting - How We Set Fire To The Testing Pyramid While Ensuring Confidence](https://www.youtube.com/watch?v=pls1Vk\_bw\_Y\&ab\_channel=NDCConferences)”, а позже и в презентации Daniel Lafeir and Michael Lawrie. Термин «подкожный» означает автоматизированный тест непосредственно под слоем пользовательского интерфейса. В приложении MVC это будут тесты для всего, что находится непосредственно под контроллером. Для веб-службы все, что находится ниже ендпоинта (endpoint). + +Идея состоит в том, что самый верхний уровень в приложении не выполняет никакой реальной бизнес-логики, а просто соединяет внешние интерфейсы с базовыми службами. Как подчеркивает Martin Fowler[ в своем сообщении о подкожном тестировании](https://martinfowler.com/bliki/SubcutaneousTest.html), такие тесты особенно полезны при попытке выполнить функциональные тесты, когда вы хотите реализовать сквозной сценарий, избегая при этом некоторых трудностей, связанных с тестированием через сам пользовательский интерфейс: + +* UI-тесты медленные. От этого никуда не деться. Их можно запускать параллельно, допиливать напильником и делать чуть-чуть быстрее, но они останутся медленными; +* UI-тесты нестабильные. Отчасти потому, что они медленные. А еще потому, что Web-браузер и интерфейс пользователя не были созданы для того, чтобы ими управлял компьютер (в настоящее время данный тренд меняется, но не факт, что это хорошо); +* UI-тесты - это наиболее сложные тесты в написании и поддержке. Они просто тестируют слишком много. (Это усиливается тем фактом, что, зачастую, люди берут «ручные» тест-кейсы и начинают их автоматизировать как есть, без учета разницы в ручном и автоматическом тестировании); +* Нам говорят, что, якобы, UI-тесты эмулируют реального пользователя. Это не так. Пользователь не будет искать элемент на странице по ID или XPath локатору. Пользователь не заполняет форму со скоростью света, и не «упадет» если какой-то элемент страницы не будет доступен в какую-то конкретную миллисекунду. И даже теперь, когда браузеры разрабатываются с учетом того, что браузером можно программно управлять - это всего-лишь эмуляция, даже если очень хорошая; +* Кто-то скажет, что некоторый функционал просто нельзя протестировать иначе. Я скажу, что если есть функционал, который можно протестировать только UI тестами (за исключением самой UI логики) - это может быть хорошим признаком архитектурных проблем в продукте. + +Таким образом определение можно сформулировать так: “Если модульный тест тестирует наименьший тестируемый компонент кода приложения, то подкожный тест представляет собой единый рабочий процесс (workflow), который можно идентифицировать и протестировать в коде приложения. Подкожное тестирование рассматривает рабочий процесс как тестируемую единицу”. + +Стоит помнить, что это не прямая замена автоматизации тестирования через UI, а просто более целенаправленное тестирование функциональности на нужном уровне приложения. Это позволяет команде создавать более совершенные сквозные тесты с использованием существующего кода, фреймворка и / или библиотек, доступных для внешнего приложения. Основная цель этого вида тестирования - уменьшить нестабильность теста и сосредоточиться на функциональности. Это позволяет группе различать функциональные сбои из-за проблем с кодом и сбои приложений из-за проблем совместимости или проблем с внешними зависимостями. Поскольку подкожные тесты можно запускать с той же тестовой средой, что и модульные тесты, они не имеют доступа к внутреннему коду или вызовам API во время работы. Изоляция этих тестов и использование имитирующих инструментов, которые могут имитировать вызовы API и заглушки для различных взаимодействий служб, могут дать целенаправленную, изолированную оценку функциональности во внешнем стеке. Такое тестирование функциональности позволяет сделать любую автоматизацию через браузер и пользовательский интерфейс более легкими. Это означает, что традиционные тесты пользовательского интерфейса могут быть очень минимальными и проверять только то, что связи работают между уровнями приложения. Вместо использования дорогостоящих тестов графического интерфейса и пользовательского интерфейса для получения информации о функциональности они могут быть поверхностными проверками работоспособности или дымовыми тестами. Избегая использования автоматизации пользовательского интерфейса, утверждающей ожидание чего-то функционально работающего, тесты могут утверждать, правильно ли приложение обменивается данными на своих уровнях интеграции. + +Поскольку при подкожном тестировании используются все компоненты на странице, создание интегрированных тестов, которые тестируют только несколько компонентов, или тестирование одного компонента на уровне модуля может не потребоваться. Модульные тесты могут быть нацелены на более сложную логику, а не пытаться протестировать всю логику вокруг одного компонента, тестирование базовой логики облегчает нагрузку на модульное тестирование. Подкожное тестирование использует ту же структуру тестирования (например, Jest), что и модульные тесты. Это сохраняет функциональные тесты внутренними и ближе к коду, что дает команде больше шансов на более быструю обратную связь и более быструю настройку теста, чем тестовая среда, поддерживаемая отдельно. Это означает, что командам не нужно выполнять дополнительную работу по сопровождению нескольких фреймворков, репозиториев, а иногда и языков для выполнения функционального тестирования пользовательского интерфейса. Теперь, когда подкожное тестирование позволяет проводить функциональное тестирование кода, а не через пользовательский интерфейс, любые тесты пользовательского интерфейса могут быть сокращены до небольшой части того, что было необходимо ранее. UI-тесты можно использовать как дымовые тесты. Таким образом они могут доказать, что приложение и все его уровни находятся в работоспособном состоянии связи. + +Поскольку подкожные тесты ориентированы на поведение высокого уровня (high-level behavior), а не на дизайн, они идеально подходят для стратегий тестирования на основе сценариев (scenario-based testing strategies), таких как BDD или паттерн [Testcase Class per Fixture](http://xunitpatterns.com/Testcase%20Class%20per%20Fixture.html). + +К сожалению, наряду со всеми плюсами subcutaneous подхода мы можем получить и снижение покрытия (coverage), в частности glue code ([Связующий код](https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D1%83%D1%8E%D1%89%D0%B8%D0%B9\_%D0%BA%D0%BE%D0%B4) - программный код, который служит исключительно для «склеивания» разных частей кода, и при этом не реализует сам по себе никакую иную прикладную функцию). Насколько важна\существенна потеря покрытия в данном случае? Зависит от ситуации. Мы потеряли немного glue code, который может быть (а может и не быть) важным (рекомендую в качестве упражнения определить, какой код потерялся). Оправдывает ли данная потеря покрытия введения тяжеловесного тестирования на уровне UI? Это тоже зависит от ситуации. Мы можем, например: + +* Добавить один UI-тест для проверки glue code, или +* Если мы не ожидаем частых изменений glue code - оставить его без автотестов, или +* Если у нас есть какой-то объем «ручного» тестирования - есть отличный шанс, что проблемы с glue code будут замечены тестировщиком, или +* Придумать что-то еще (тот же канареечный релиз, Canary deployment) + +Один из способов избежать потери покрытия - “[Feature Tests Model](https://senpay.github.io/ta/ftm/feature\_tests)” + +Источники: + +* [Introduction To Subcutaneous Testing](https://www.ministryoftesting.com/dojo/lessons/introduction-to-subcutaneous-testing) +* [Пишем автотесты эффективно - Subcutaneous tests](https://habr.com/ru/post/502154/) + [англ. версия](https://alexspush.medium.com/an-alternative-to-ubiquitous-ui-level-checking-subcutaneous-tests-8d29e8883fc2) + [видеоверсия](https://www.youtube.com/watch?v=96fL7pM3gYE\&ab\_channel=iTechArt) +* [Subcutaneous Testing in ASP.NET Core](https://josephwoodward.co.uk/2019/03/subcutaneous-testing-asp-net-core) diff --git a/avtomatizaciya-beta/poleznye-ssylki.md b/avtomatizaciya-beta/poleznye-ssylki.md new file mode 100644 index 0000000..059bdb2 --- /dev/null +++ b/avtomatizaciya-beta/poleznye-ssylki.md @@ -0,0 +1,74 @@ +# Полезные ссылки + +**Telegram** + +* [Подборка сообществ в помощь QA automation инженеру](https://t.me/qa\_automation/72650) +* Большая подборка чатов @[it\_chats](https://t.me/it\_chats) +* [Чат для студентов БЕСПЛАТНОЙ ШКОЛЫ QA automation для всех](https://t.me/qadlyavsex) + [F.A.Q.](https://docs.google.com/spreadsheets/d/1-gvkhk4HcDlstBDewwjH5bXon4rxW3KCDLs6C9bxJg4/edit#gid=0) +* Чат для начинающих автоматизаторов @[aqa\_chatka](https://t.me/aqa\_chatka) + +**Репозитории** + +* [Awesome Selenium](https://github.com/christian-bromann/awesome-selenium#readme) +* [Awesome Appium](https://github.com/SrinivasanTarget/awesome-appium#readme) +* [Awesome Visual Regression Testing](https://github.com/mojoaxel/awesome-regression-testing#readme) +* [Awesome JMeter](https://github.com/aliesbelik/awesome-jmeter#readme) +* [Awesome k6](https://github.com/grafana/awesome-k6#readme) +* [Awesome Playwright](https://github.com/mxschmitt/awesome-playwright#readme) +* [Awesome Gatling](https://github.com/aliesbelik/awesome-gatling#readme) +* [Awesome JMeter](https://github.com/aliesbelik/awesome-jmeter#readme) +* [10 интересных репозиториев на GitHub, полезных любому разработчику](https://habr.com/ru/company/plarium/blog/496472/) + +**Youtube** + +* [Eugene Suleimanov](https://www.youtube.com/c/EugeneSuleimanov/featured) +* [alishev](https://www.youtube.com/c/alishevN) +* [Тестировщик](https://www.youtube.com/c/%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA/featured) +* [Антон Семенченко](https://www.youtube.com/results?search\_query=%D0%90%D0%BD%D1%82%D0%BE%D0%BD+%D0%A1%D0%B5%D0%BC%D0%B5%D0%BD%D1%87%D0%B5%D0%BD%D0%BA%D0%BE) +* [dmdev](https://www.youtube.com/c/dmdev) +* [Лёша Маршал](https://www.youtube.com/channel/UCTVciJQp8eYwKLLQIl-iSJw) +* [SDET- QA Automation Techie](https://www.youtube.com/c/pavanoltraining) +* [Автоматизация CI/CD - Полный Курс на Простом Языке](https://www.youtube.com/watch?v=cyb10iplv7U) +* [Плейлист “Автоматизация с нуля”](https://www.youtube.com/playlist?list=PLWKsep\_LKQYq\_QRa4ROEjLse7jDbiSl-H) +* [Плейлист “Python - Starter](https://www.youtube.com/playlist?list=PLvItDmb0sZw8RfG5odrtstiYkmiPg\_Yo\_)” +* [Плейлист Курс программирования - "Python Essential"](https://www.youtube.com/playlist?list=PLvItDmb0sZw\_MVK2txwtBSHAzaYRrOdiJ) +* [Плейлист “Вебинары Python”](https://www.youtube.com/playlist?list=PLvItDmb0sZw\_x1QivR1pTQ6tAK8Awb57L) +* [Плейлист “Практики и инструменты DevOps”](https://www.youtube.com/playlist?list=PLvItDmb0sZw\_xTNDv8Bb1fsivN\_Z\_4oo9) +* [Годные туториалы на YouTube](https://habr.com/ru/company/edison/blog/434034/) + +**Курсы** + +* [Лекции от Всеволода Брекелова](https://github.com/volekerb/testing-lectures/tree/master/lectures\_v\_2021) +* [Питонтьютор - бесплатный курс по программированию с нуля на Python](http://pythontutor.ru) +* [Программирование на Python](https://stepik.org/course/67/info) +* [Python: основы и применение](https://stepik.org/course/512/info) +* [Автоматизация тестирования с помощью Selenium и Python](https://stepik.org/course/575/info) +* [Бесплатный курс “Введение в программирование”](https://ru.hexlet.io/courses/introduction\_to\_programming) +* [Test Automation University](https://testautomationu.applitools.com) +* [Continuous Integration with Jenkins](https://learn.epam.com/detailsPage?id=62dc3947-e941-4c30-ba32-552eb363978e) +* [Автоматизированное тестирование с нуля / Полный курс за 3 часа / selenium + testng](https://www.youtube.com/watch?v=L2jMIJy0u90) +* [Python за месяц](https://habr.com/ru/company/edison/blog/474212/) +* [Как научиться разработке на Python: новый видеокурс Яндекса](https://habr.com/ru/company/yandex/blog/498856/) +* [Python.org рекомендует: Программирование для НЕпрограммистов](https://habr.com/ru/company/skillfactory/blog/480898/) + +**Сборники материалов по автоматизации** + +* [What Is Automation Testing (Ultimate Guide To Start Test Automation)](https://www.softwaretestinghelp.com/automation-testing-tutorial-1/) + +**Книги** + +* Swaroop Chitlur - A Byte of Python (есть в переводе) +* [Цикл статей с переводом Okken Brian - Python Testing with pytest](https://habr.com/ru/post/448782/) +* [Топ-10 книг для разработчика](https://habr.com/ru/post/504276/) + +**Площадки для тренировки** + +* [Лучшие сайты для практики автоматизации тестирования](https://habr.com/ru/post/549450/) +* [Сайты-песочницы, на которых можно практиковать написание автотестов](https://blog.noveogroup.ru/2020/01/testovye-ploschadki-dlya-trenirovok/) +* [Skillotron QA Auto Tests](https://skillotron.com/qualifications/qa-automation) +* [https://academybugs.com/find-bugs/](https://academybugs.com/find-bugs/) +* [Selenium Certification Training](https://demoqa.com) +* [Codewars](https://www.codewars.com), [HackerRank](https://www.hackerrank.com/dashboard), [Coderbyte](https://coderbyte.com), [CodinGame](https://www.codingame.com/start), [LeetCode](https://leetcode.com), [Topcoder](https://www.topcoder.com/challenges), [Project Euler](https://projecteuler.net), [CodeFights](https://codefights.com) +* [Шесть бесплатных автоматизированных платформ для изучения программирования](https://habr.com/ru/company/hexlet/blog/432802/) +* [Песочница и шпаргалка по изучению Python](https://habr.com/ru/post/421701/) +* [Где порешать реальные задачи для кандидатов в Яндекc: тренировка на Codeforces и разбор](https://habr.com/ru/company/yandex/blog/493966/) diff --git a/avtomatizaciya-beta/processy-i-avtomatizaciya-proekta-s-nulya.md b/avtomatizaciya-beta/processy-i-avtomatizaciya-proekta-s-nulya.md new file mode 100644 index 0000000..4331121 --- /dev/null +++ b/avtomatizaciya-beta/processy-i-avtomatizaciya-proekta-s-nulya.md @@ -0,0 +1,135 @@ +# Процессы и автоматизация проекта с нуля + +Есть множество статей про технологии и те или иные подходы к автоматизации. Но почему-то нет статей про «обратную сторону» автоматизации. Как вообще всё зарождается на проекте? И как это «всё» организовать? Ниже будет рассмотрен пример компании Россельхозбанк. + +**Общая информация по проекту** + +* Большой проект с командами, разрабатывающими общий продукт; +* В командах есть QA Manual (Ручной тестировщик); +* Направления тестирования - Frontend, Backend. + +**Изучаем проект** + +**Понимаем цель разработки продукта и кто потребитель**: ответы на эти вопросы помогают понять, на что делать упор в автоматизации. Например, если работаем с юридическими лицами, то делаем упор на тестирование «исполнения законодательства» и переводы по платежам и тд. Если это физические лица, то на основные выполняемые операции: переводы с карты на карту, оплату услуг и тп. Так же важно, чтобы направление автоматизации «смотрело» в целом на продукт, а не на отдельные в нем команды. + +**Знакомимся с участниками разработки продукта**: в нашем случае нужно быть знакомым со всеми, так как необходимо будет взаимодействовать тем или иным образом. Выделю ключевых людей: + +* Владельцы продуктов (Product Owners), они заказчики автоматизации в команде; +* QA каждой команды. Они - это клиенты инструмента автоматизации, их уровень счастья - это показатель успеха; +* Лидер ручного тестирования. Помогает в организации процесса и во взаимодействии с ручным тестированием; +* Лидер разработки Frontend. Он влияет на стабильность и качество автотестов; +* Специалист по закупке. Решит вопросы выделения техники, в основном с серверным железом. + +**Изучаем каждую команду**: собираем информацию о том, какую часть проекта разрабатывает команда. + +* Разбираемся в направлении - Frontend, Backend или всё сразу; +* Разбираемся с тем, как QA тестируют свою часть продукта; +* Выясняем, на каком уровне QA manual знаком с автоматизацией; +* Находим боли в тестировании и что приоритетно закрыть автоматизацией. + +**Формируем требования к автоматизации и заказываем ресурсы** + +**Что мы собрали?** + +* У нас есть 8 команд; +* Есть 11 QA инженеров; +* Есть направления тестирования Frontend, Backend + будем «ходить» в Базу данных; +* 90% QA manual никогда не занимались автоматизацией. + +**Исходя из данных, формируем требования к автоматизации** + +У нас нет задачи делать какие-то инновационные решения, поэтому придерживаемся классики: + +* В качестве языка программирования выбираем Java - так будет проще найти специалистов; +* Нужно тестировать Frontend. Берем Selenium; +* Нужно тестировать Backend. Взаимодействуем с ним через REST. Берем REST-assured; +* Нужно «ходить» в базу данных. Возьмем стандартные библиотеки из Java; +* Нужно либо обучить QA manual разработке автотестов, либо нанять армию из N автоматизаторов. Мы думаем о расходах проекта на тестирование, поэтому убиваем 2-х зайцев сразу. Берем Cucumber; +* Нам нужна отчетность с красивыми графиками. Берем Allure. + +Получился следующий стек технологий: Java, Selenium, REST-assured, Cucumber. + +**Оцениваем силы автоматизаторов** + +Поскольку их нет, берем 1 автоматизатора на 5 команд (больше 5-и не потянет). + +**Автотесты нужно где-то запускать** + +Что нам понадобится? + +* Машина для Jenkins. 1 штука. Через него реализуем удаленный запуск; +* Машина под Slave Jenkins. Как agent для Jenkins; +* Машина под Selenoid. Для параллельного запуска тестов. + +**Делаем демо нашего инструмента** + +Наше демо будут смотреть все: владельцы продуктов, QA инженеры, разработчики, аналитики и тд. Значит ориентируемся на понимание для всех. + +Берем команду в качестве первой «жертвы» автоматизации. Ребята разрабатывают Frontend. Нам нужна наглядность. + +* Делаем 5-10 автотестов. Записываем на видео; +* Обязательно после прогона показываем Allure. Красивые графики любят все; +* Рисуем «инфраструктуру автотестов». Главное, чтобы было просто и понятно; +* Обозначаем главную цель автоматизации; +* Демонстрируем эффект от автоматизации; +* Делаем сравнительные тесты. Ручное прохождение и автоматизированное; +* Показываем, как создаются сценарии; +* Показываем планы автоматизации (когда появятся тот или иной функционал); +* Показываем, как будет происходить внедрение автоматизации в команды. + +**Подготавливаем UI к автоматизации** + +Для обеспечения надежности, стабильности и качества автотестов, необходимо раскидать якоря на UI. Централизованно через лидера Frontend и дополнительно через владельцев продукта проставляем атрибут для UI-элементов “data-test-id“ или с любым другим названием. Смысл в том, чтобы со стороны UI проставить этот атрибут во всех элементах типа «Таблица, поле для ввода, кнопка» и тд. Если коротко, то на всех элементах, с которыми взаимодействуем, это даст +300% к надежности автотестов. Переезд элемента в другое место или изменение его содержимого никак не повлияют на проверку автотестом. Делаем этот момент обязательным для всех новых фич. + +**Разрабатываем автотесты** + +* Делим команды между автотестерами; +* Разрабатываем каркас проекта для автоматизации. Все по шаблону; +* Подготавливаем набор Cucumber шагов для работы с Frontend, основным направлением в тестировании. Выносим шаги в отдельный проект и делаем из него подключаемый артефакт; +* Настраиваем Selenoid и Jenkins; +* Начинаем подключать команды к автоматизации. При подключении команды все сводится к тому, чтобы создать репозиторий, загрузить каркас, создать Job в Jenkins по шаблону, обучить QA работе с Cucumber, работе с Git и средой разработки; +* После обучения QA manual самостоятельно пишут автотесты. Один раз за спринт автоматизатор приходит в команду и принимает написанные автотесты, делает правки и вливает в основную ветку. На этом этапе ребята качают уровень написания правильных сценариев, а мы получаем качественные проверенные сценарии; +* После встречи со всеми командами у автоматизатора в спринте остается еще 5-6 свободных дней. Это время тратим на разработку Cucumber шагов; +* В конце спринта на продуктовом демо показываем результаты по командам и делаем анонсы новых фич в инструменте. + +**Результаты** + +6 спринтов (60 дней), 8 команд, 2 автотестера и 11 ручных тестировщиков - имеем 50% покрытия регресса проекта автотестами. Это с учетом подключения команд (подключались постепенно) и разработки шагов. + +**Вещи, о которых нужно помнить при разработке с таким подходом** + +**Ручной тестировщик - это клиент**. QA инженер - прямой потребитель инструмента автоматизации. Их уровень комфорта, счастья и количество автотестов - это показатель качества нашей работы. Если один из показателей падает, значит нужно что-то менять. Иначе все посыпется. + +**Ориентация на выгоду для проекта**. Нужно всегда помнить, что содержание разработчиков, тестировщиков, аналитиков и других специалистов стоит денег. В конечном итоге наша цель их сэкономить. Как мы их экономим? + +* Автотестами: находим дефекты запуская их каждый день. +* На каждом этапе тестирования сокращаем время регресса. + +Все это приводит к более быстрому выпуску продукта в промышленную эксплуатацию. + +**Не работает? Меняй!** Не нужно бояться ошибок. Их будет очень много в разработке, в общении с командами, во взаимодействии с QA инженерами, в демо. Главное увидеть, что «что-то» не работает и менять подход до тех пор, пока все не будут в восторге. Всё делаем для людей. Не для себя. + +Источники: + +* [Автоматизация тестирования «с нуля» (нетехническая сторона вопроса)](https://habr.com/ru/company/rshb/blog/591449/) + +Доп. материал: + +* [Гайд внедрения автоматизации тестирования, если ты рядовой QA инженер](https://www.youtube.com/watch?v=LSlF\_0LqYAM) +* [Путь к автоматизации тестирования в SuperJob: инструменты, проблемы и решения](https://habr.com/ru/company/superjob/blog/577042/) +* [Как мы автоматизировали тестирование бэкенда](https://habr.com/ru/company/ru\_mts/blog/578600/) +* [Готовим приложение для автоматизации тестирования](https://habr.com/ru/post/654959/) +* [О чем спрашивать, унаследовав тест-автоматизацию](https://telegra.ph/O-chem-sprashivat-unasledovav-test-avtomatizaciyu-01-11) +* [Андрей Солнцев - Воркшоп: Как начать свой проект автоматизации с нуля. Продолжение (часть 1)](https://www.youtube.com/watch?v=h254Tccxgq4\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=15) +* [Андрей Солнцев - Воркшоп: Как начать свой проект автоматизации с нуля. Продолжение (часть 2)](https://www.youtube.com/watch?v=WETyt87o\_R4\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=16) +* [AQA Checklist \ Score для интеграции Автоматизации тестирования в существующие Agile процессы](https://www.youtube.com/watch?v=Z6svY5iTdac) +* [5 заклинаний для команды автоматизации](https://www.youtube.com/watch?v=kbDOZLcQsBo) +* [Организация мониторинга бизнес-процессов (с нуля до автоматизации)](https://www.youtube.com/watch?v=CdH\_OB\_G5RA) +* [Вместо 100 запусков приложения - один автотест, или как сэкономить QA-инженеру 20 лет жизни](https://habr.com/ru/company/pixonic/blog/503704/) +* [Автоматизация тестирования в микросервисной архитектуре](https://habr.com/ru/company/avito/blog/509280/) +* [Как (авто)тестировать Монстра](https://habr.com/ru/company/rshb/blog/518374/) +* [Как автоматизировать тестирование на проекте, где по 100 релизов в месяц](https://dou.ua/lenta/columns/test-automation-in-parimatch/) +* [Процесс автоматизированного тестирования за 10 шагов](https://habr.com/ru/company/otus/blog/546148/) +* [How Does Test Planning Differ For Manual And Automation Projects?](https://www.softwaretestinghelp.com/automation-test-palnning/) +* [Step By Step Guide To Implement Proof Of Concept (POC) In Automation Testing](https://www.softwaretestinghelp.com/implement-proof-of-concept-poc-in-automation-testing/) +* [How To Perform Automation Testing Of JAVA/J2EE Applications (Part 2)](https://www.softwaretestinghelp.com/automated-testing-of-j2ee-applications-part-2/) diff --git a/avtomatizaciya-beta/raznica-mezhdu-coupling-i-cohesion.md b/avtomatizaciya-beta/raznica-mezhdu-coupling-i-cohesion.md new file mode 100644 index 0000000..43b78bb --- /dev/null +++ b/avtomatizaciya-beta/raznica-mezhdu-coupling-i-cohesion.md @@ -0,0 +1,63 @@ +# Разница между coupling и cohesion + +Это термины из принципов разработки ПО. + +Целью этапа проектирования в жизненном цикле разработки программного обеспечения является создание решения проблемы, указанной в документе SRS (Спецификация требований к программному обеспечению). Результатом этапа проектирования является проектный документ программного обеспечения (SDD). + +По сути, проектирование представляет собой итеративный процесс, состоящий из двух частей. Первая часть - это концептуальный проект, который сообщает заказчику, что будет делать система. Во-вторых, это техническое проектирование, которое позволяет сборщикам систем понять, какое аппаратное и программное обеспечение необходимо для решения проблемы клиента. + +Концептуальный проект системы: + +* Написано простым языком, т.е. понятным для клиента языком. +* Подробное объяснение характеристик системы. +* Описывает функциональность системы. +* Это не зависит от реализации. +* Связан с документом требования. + +Технический проект системы: + +* Аппаратная составляющая и дизайн. +* Функциональность и иерархия программных компонентов. +* Архитектура программного обеспечения +* Сетевая архитектура +* Структура данных и поток данных. +* Компонент ввода/вывода системы. +* Показывает интерфейс. + +Модуляризация: модульность - это процесс разделения программной системы на несколько независимых модулей, где каждый модуль работает независимо. Есть много преимуществ модуляризации в разработке программного обеспечения. Некоторые из них приведены ниже: + +* Легко понять систему. +* Обслуживание системы простое. +* Модуль может использоваться много раз в соответствии с их требованиями. Нет необходимости писать это снова и снова. + +Связь (Coupling): Связь является мерой степени взаимозависимости между модулями. Хорошее программное обеспечение будет иметь низкую связность. + +Типы связности: + +* Связность данных (**Data Coupling**): если зависимость между модулями основана на том факте, что они обмениваются данными, передавая только данные, то говорят, что модули связаны данными. При соединении данных компоненты независимы друг от друга и взаимодействуют через данные. Коммуникации модулей не содержат бродячих данных (?tramp data). Пример - система расчетов с клиентами; +* Связность штампов (**Stamp Coupling**): При соединении штампов полная структура данных передается от одного модуля к другому. Следовательно, он включает в себя tramp data. Это может быть необходимо из соображений эффективности - этот выбор сделал проницательный дизайнер, а не ленивый программист; +* Связность управления (**Control Coupling**): если модули взаимодействуют, передавая управляющую информацию, то говорят, что они связаны управлением. Может быть плохо, если параметры указывают совершенно другое поведение, и хорошо, если параметры позволяют факторизовать и повторно использовать функциональность. Пример - функция сортировки, которая принимает функцию сравнения в качестве аргумента; +* Внешняя связность (**External Coupling**): при внешней связности модули зависят от других модулей, внешних по отношению к разрабатываемому программному обеспечению или аппаратному обеспечению определенного типа. Ex - протокол, внешний файл, формат устройства и т. д. +* Общая связность (**Common Coupling**): модули имеют общие данные, такие как глобальные структуры данных. Изменения в глобальных данных означают отслеживание всех модулей, которые обращаются к этим данным, для оценки эффекта изменения. Таким образом, у него есть недостатки, такие как сложность повторного использования модулей, ограниченная способность контролировать доступ к данным и меньшая ремонтопригодность. +* Связность содержимого (**Content Coupling**): при связности содержимого один модуль может изменять данные другого модуля, или поток управления передается от одного модуля к другому модулю. Это наихудшая форма связности, и ее следует избегать. + +Сцепление/единство/сплоченность (Cohesion): это мера степени, в которой элементы модуля функционально связаны. Это степень, в которой все элементы, направленные на выполнение одной задачи, содержатся в компоненте. По сути, сцепление - это внутренний клей, который удерживает модуль вместе. Хороший дизайн программного обеспечения будет иметь высокое сцепление. + +Types of Cohesion: + +* **Functional Cohesion**: в компоненте содержится каждый важный элемент для отдельного вычисления. Функциональная сплоченность выполняет задачу и функции. Это идеальная ситуация. +* **Sequential Cohesion**: элемент выводит некоторые данные, которые становятся входными данными для другого элемента, т. е. поток данных между частями. Это происходит естественным образом в функциональных языках программирования. +* **Communicational Cohesion**: два элемента работают с одними и теми же входными данными или вносят свой вклад в одни и те же выходные данные. Пример - обновить запись в базе данных и отправить ее на принтер. +* **Procedural Cohesion**: Элементы процедурного единства обеспечивают порядок исполнения. Действия по-прежнему слабо связаны и маловероятно, что их можно будет использовать повторно. Вычислить средний балл студента, распечатать студенческий отчет, рассчитать совокупный средний балл, распечатать совокупный средний балл. +* **Temporal Cohesion**: элементы связаны по своему времени. В модуле, связанном с временной связностью, все задачи должны выполняться в один и тот же промежуток времени. Эта связность содержит код для инициализации всех частей системы. Происходит множество различных действий, и все они происходят в единицу времени. +* **Logical Cohesion**: элементы связаны логически, а не функционально. Компонент Ex-A считывает входные данные с ленты, диска и сети. Весь код этих функций находится в одном компоненте. Операции родственные, но функции существенно различаются. +* **Coincidental Cohesion**: элементы не связаны (несвязаны). Элементы не имеют никакой концептуальной связи, кроме местоположения в исходном коде. Это случайность и худшая форма сплоченности. Вывести следующую строку и поменять местами символы строки в одном компоненте. + +Источники: + +* [Coupling and Cohesion](https://www.geeksforgeeks.org/software-engineering-coupling-and-cohesion/?ref=lbp) + +Доп. материал: + +* [Low Coupling и High Cohesion](https://medium.com/german-gorelkin/low-coupling-high-cohesion-d36369fb1be9) +* [ООП для ООП: GRASP](https://habr.com/ru/post/38323/) diff --git a/avtomatizaciya-beta/vidy-i-instrumenty-avtomatizacii.md b/avtomatizaciya-beta/vidy-i-instrumenty-avtomatizacii.md new file mode 100644 index 0000000..a256c14 --- /dev/null +++ b/avtomatizaciya-beta/vidy-i-instrumenty-avtomatizacii.md @@ -0,0 +1,430 @@ +# Виды и инструменты автоматизации + +Одним из самых частых вопросов новичков в автоматизации является вопросы о том, какой язык программирования выбрать для изучения, а также какой инструмент лучше. Эти вопросы на самом деле стоит рассматривать в другой плоскости, а язык программирования является следствием, а не причиной (а где-то и вообще не нужен). + +При всем многообразии того, что можно считать автоматизацией, можно попытаться выделить категории: + +* Функциональное или нефункциональное тестирование; +* Уровни: unit, integration, UI/E2E; +* Метод: white box, black box; +* Уровень в сетевой модели: frontend, backend, database; +* Платформы: desktop, mobile, web, cross platform; +* ОС: windows, macos, linux, cross platform; +* Масштабируемость: однопоточные, многопоточные; +* Программа, скрипт, фреймворк или библиотека; +* Работа непосредственно с тестами, как вспомогательное средство (генераторы данных), инфраструктура (CI/CD, раннеры, отчетность); +* Если это создание тестов, то каким образом: нативный язык программирования, универсальный ЯП, тестовая модель и ключевые слова, рекордеры (Capture & Playback); +* и т.д. и т.п. до бесконечности. + +Каждый инструмент создан и подходит для определенных задач и сочетает в себе несколько таких критериев. Именно поэтому нет лучшего инструмента и единственно правильного языка программирования для старта. + +**Технологии автоматизации тестирования** + +Начнём с краткого обзора эволюции высокоуровневых технологий, при этом подчеркнув, что «старые» решения по-прежнему используются (или как компоненты «новых», или самостоятельно в отдельных случаях). + +| | **Подход** | **Суть** | **Преимущества** | **Недостатки** | +| ----- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **1** | Частные решения |
Для решения каждой
отдельной задачи
пишется отдельная
программа
| Быстро, просто |Нет системности,
много времени уходит на поддержку.
Почти невозможно
повторное использование
| +| **2** |Тестирование под
управлением данными (DDT)
|Из тест-кейса вовне
выносятся входные
данные и ожидаемые результаты.
|Один и тот же тест кейс можно повторять многократно с
разными данными
|Логика тест-кейса по прежнему строго
определяется
внутри, а потому для
ее изменения тест кейс надо переписывать
| +| **3** |Тестирование под
управлением ключевыми словами (KDT)
|Из тест-кейса вовне
выносится описание
его поведения
|Концентрация на высокоуровневых действиях. Данные и
особенности поведения хранятся вовне и
могут быть изменены
без изменения кода
тест-кейса
|Сложность выполнения низкоуровневых
операций
| +| **4** |Использование
фреймворков
| Конструктор, позволяющий использовать остальные подходы | Мощность и гибкость |Относительная
сложность (особенно
- в создании
фреймворка)
| +| **5** | Запись и воспроизведение (Record & Playback) |Средство автоматизации записывает
действия тестировщика и может воспроизвести их,
управляя тестируемым приложением
|Простота, высокая
скорость создания
тест-кейсов.
|Крайне низкое качество, линейность, неподдерживаемость
тест-кейсов. Требуется серьёзная доработка полученного
кода
| +| **6** |Тестирование под
управлением поведением (BDT)
|Развитие идей тестирования под управлением данными и
ключевыми словами.
Отличие - в концентрации на бизнес сценариях без выполнения мелких
проверок
|Высокое удобство
проверки высокоуровневых пользовательских сценариев
|Такие тест-кейсы
пропускают большое
количество функциональных и нефункциональных дефектов,
а потому должны
быть дополнены
классическими более низкоуровневыми тест-кейсами
| + +На текущем этапе развития тестирования представленные в таблице технологии иерархически можно изобразить следующей схемой: + +![](https://lh5.googleusercontent.com/sMNnYDEvBcYKLARtI\_r2vG0V-ttWXMKQantn7BamWIkFDgQsWfYvh0uKYftAP3198E2-6FvRBguxEhxDrwLxfkiwrcJKFhN9G2fwxr1-kCKmF6dM3n9mdXP3YRyEkjxjqCQTnN5B) + +**Технологии: Частные решения** + +Иногда перед тестировщиком возникает уникальная (в том плане, что такой больше не будет) задача, для решения которой нет необходимости использовать мощные инструментальные средства, а достаточно написать небольшую программу на любом из высокоуровневых языков программирования (Java, C#, PHP и т.д.) или даже воспользоваться возможностями командных файлов операционной системы или подобными тривиальными решениями. Также сюда можно отнести задачи вида: + +* Подготовить базу данных, наполнив её тестовыми данными (например, добавить в систему миллион пользователей со случайными именами). +* Подготовить файловую систему (например, создать структуру каталогов и набор файлов для выполнения тест-кейсов). +* Перезапустить набор серверов и/или привести их в требуемое состояние. + +Удобство частных решений состоит в том, что их можно реализовать быстро, просто, «вот прямо сейчас». Но у них есть и огромный недостаток - это «кустарные решения», которыми может воспользоваться всего пара человек. И при появлении новой задачи, даже очень похожей на ранее решенную, скорее всего, придётся всё автоматизировать заново. + +Преимущества: + +* Быстрота и простота реализации; +* Возможность использования любых доступных инструментов, которыми тестировщик умеет пользоваться; +* Эффект от использования наступает незамедлительно; +* Возможность нахождения очень эффективных решений в случае, когда основные инструменты, используемые на проекте для автоматизации тестирования, оказываются малопригодными для выполнения данной отдельной задачи; +* Возможность быстрого создания и оценки прототипов перед применением более тяжеловесных решений + +Недостатки: + +* Отсутствие универсальности и, как следствие, невозможность или крайняя сложность повторного использования (адаптации для решения других задач). +* Разрозненность и несогласованность решений между собой (разные подходы, технологии, инструменты, принципы решения). +* Крайне высокая сложность развития, поддержки и сопровождения таких решений (чаще всего, кроме самого автора никто вообще не понимает, что и зачем было сделано, и как оно работает). +* Является признаком «кустарного производства», не приветствуется в промышленной разработке программ. + +**Технологии:Тестирование под управлением данными (DDT)** + +Обратите внимание, как много раз в командных файлах повторяются строки, выполняющие одно и то же действие над набором файлов (и нам ещё повезло, что файлов немного). Ведь куда логичнее было бы каким-то образом подготовить список файлов и просто передать его на обработку. Это и будет тестированием под управлением данными. Теперь нам достаточно подготовить CSV-файл с любым количеством имён сравниваемых файлов, а код тест-кейса не увеличится. + +К другим типичным примерам использования тестирования под управлением данными относится: + +* Проверка авторизации и прав доступа на большом наборе имен пользователей и паролей; +* Многократное заполнение полей форм разными данными и проверка реакции приложения; +* Выполнение тест-кейса на основе данных, полученных с помощью комбинаторных техник. + +Данные для рассматриваемого подхода к организации тест-кейсов могут поступать из файлов, баз данных и иных внешних источников или даже генерироваться в процессе выполнения тест-кейса (см. описание источников данных для автоматизированного тестирования). + +Преимущества: + +* Устранение избыточности кода тест-кейсов; +* Удобное хранение и понятный человеку формат данных; +* Возможность поручения генерации данных сотруднику, не имеющему навыков программирования; +* Возможность использования одного и того же набора данных для выполнения разных тест-кейсов; +* Возможность повторного использования набора данных для решения новых задач; +* Возможность использования одного и того же набора данных в одном и том же тест кейсе, но реализованном под разными платформами. + +Недостатки: + +* При изменении логики поведения тест-кейса его код всё равно придётся переписывать; +* При неудачно выбранном формате представления данных резко снижается их понятность для неподготовленного специалиста; +* Необходимость использования технологий генерации данных; +* Высокая сложность кода тест-кейса в случае сложных неоднородных данных; +* Риск неверной работы тест-кейсов в случае, когда несколько тест-кейсов работают с одним и тем же набором данных, и он был изменён таким образом, на который не были рассчитаны некоторые тест-кейсы; +* Слабые возможности по сбору данных в случае обнаружения дефектов; +* Качество тест-кейса зависит от профессионализма сотрудника, реализующего код тест кейса. + +**Технологии: Тестирование под управлением ключевыми словами** + +Логическим развитием идеи о вынесении вовне тест-кейса данных является вынесение вовне тест-кейса команд (описания действий). Идею можно развить, добавив в CSV-файл ключевые слова, являющиеся описанием выполняемой проверки. Ярчайшим примером инструментального средства автоматизации тестирования, идеально следующего идеологии тестирования под управлением ключевыми словами, является Selenium IDE, в котором каждая операция тест-кейса описывается в виде: Действие (ключевое слово) - Необязательный параметр 1 - Необязательный параметр 2. + +Тестирование под управлением ключевыми словами стало тем переломным моментом, начиная с которого стало возможным привлечение к автоматизации тестирования нетехнических специалистов. Согласитесь, что нет необходимости в знаниях программирования и тому подобных технологий, чтобы наполнять подобные только что показанному CSV-файлы или (что очень часто практикуется) XLSX файлы. + +Вторым естественным преимуществом тестирования под управлением ключевыми словами (хотя она вполне характерна и для тестирования под управлением данными) стала возможность использования различных инструментов одними и теми же наборами команд и данных. Так, например, ничто не мешает нам взять показанные CSV-файлы и написать новую логику их обработки не на PHP, а на C#, Java, Python или даже с использованием специализированных средств автоматизации тестирования. + +Преимущества: + +* Максимальное устранение избыточности кода тест-кейсов; +* Возможность построения мини-фреймворков, решающих широкий спектр задач; +* Повышение уровня абстракции тест-кейсов и возможность их адаптации для работы с разными техническими решениями; +* Удобное хранение и понятный человеку формат данных и команд тест-кейса; +* Возможность поручения описания логики тест-кейса сотруднику, не имеющему навыков программирования; +* Возможность повторного использования для решения новых задач; +* Расширяемость (возможность добавления нового поведения тест-кейса на основе уже реализованного поведения) + +Недостатки: + +* Высокая сложность (и, возможно, длительность) разработки; +* Высокая вероятность наличия ошибок в коде тест-кейса; +* Высокая сложность (или невозможность) выполнения низкоуровневых операций, если фреймворк не поддерживает соответствующие команды; +* Эффект от использования данного подхода наступает далеко не сразу (сначала идет длительный период разработки и отладки самих тест-кейсов и вспомогательной функциональности); +* Для реализации данного подхода требуется наличие высококвалифицированного персонала; +* Необходимо обучить персонал языку ключевых слов, используемых в тест-кейсах + +**Технологии: Фреймворки** + +Фреймворк автоматизации тестирования - это интегрированная система, которая устанавливает правила автоматизации конкретного продукта. Эта система объединяет библиотеки функций, источники тестовых данных, сведения об объектах и различные повторно используемые модули. Эти компоненты действуют как небольшие строительные блоки, которые необходимо собрать для представления бизнес-процесса. Платформа обеспечивает основу для автоматизации тестирования и упрощает процесс автоматизации. + +Фреймворки автоматизации тестирования представляют собой не что иное, как успешно развившиеся и ставшие популярными решения, объединяющие в себе лучшие стороны тестирования под управлением данными, ключевыми словами и возможности реализации частных решений на высоком уровне абстракции. + +Фреймворков автоматизации тестирования очень много, они очень разные, но их объединяет несколько общих черт: + +* высокая абстракция кода (нет необходимости описывать каждое элементарное действие) с сохранением возможности выполнения низкоуровневых действий; +* универсальность и переносимость используемых подходов; +* достаточно высокое качество реализации (для популярных фреймворков). + +Как правило, каждый фреймворк специализируется на своём виде тестирования, уровне тестирования, наборе технологий. Существуют фреймворки для модульного тестирования (например, семейство xUnit), тестирования веб-приложений (например, семейство Selenium), тестирования мобильных приложений, тестирования производительности и т.д. + +Существуют бесплатные и платные фреймворки, оформленные в виде библиотек на некотором языке программирования или в виде привычных приложений с графическим интерфейсом, узко- и широко специализированные и т.д. + +Преимущества: + +* Широкое распространение; +* Универсальность в рамках своего набора технологий; +* Хорошая документация и большое сообщество специалистов, с которыми можно проконсультироваться; +* Высокий уровень абстракции; +* Наличие большого набора готовых решений и описаний соответствующих лучших практик применения того или иного фреймворка для решения тех или иных задач. + +Недостатки: + +* Требуется время на изучение фреймворка; +* В случае написания собственного фреймворка де-факто получается новый проект по разработке ПО; +* Высокая сложность перехода на другой фреймворк; +* В случае прекращения поддержки фреймворка тест-кейсы рано или поздно придётся переписывать с использованием нового фреймворка; +* Высокий риск выбора неподходящего фреймворка. + +**Технологии: Запись и воспроизведение (Record & Playback)** + +Технология записи и воспроизведения (Record & Playback) стала актуальной с появлением достаточно сложных средств автоматизации, обеспечивающих глубокое взаимодействие с тестируемым приложением и операционной системой. Использование этой технологии, как правило, сводится к следующим основным шагам: + +* Тестировщик вручную выполняет тест-кейс, а средство автоматизации записывает все его действия; +* Результаты записи представляются в виде кода на высокоуровневом языке программирования (в некоторых средствах - специально разработанном); +* Тестировщик редактирует полученный код; +* Готовый код автоматизированного тест-кейса выполняется для проведения тестирования в автоматизированном режиме. + +Сама технология при достаточно высокой сложности внутренней реализации очень проста в использовании и по самой своей сути, потому часто применяется для обучения начинающих специалистов по автоматизации тестирования. + +Преимущества: + +* Предельная простота освоения (достаточно буквально нескольких минут, чтобы начать +* использовать данную технологию); +* Быстрое создание «скелета тест-кейса» за счет записи ключевых действий с тестируемым приложением; +* Автоматический сбор технических данных о тестируемом приложении (идентификаторов и локаторов элементов, надписей, имен и т.д.); +* Автоматизация рутинных действий (заполнения полей, нажатий на ссылки, кнопки и т.д.); +* В отдельных случаях допускает использование тестировщиками без навыков программирования. + +Недостатки: + +* Линейность тест-кейсов: в записи не будет циклов, условий, вызовов функций и прочих характерных для программирования и автоматизации явлений; +* Запись лишних действий (как просто ошибочных случайных действий тестировщика с тестируемым приложением, так и (во многих случаях) переключений на другие приложения и работы с ними); +* Так называемый «хардкодинг», т.е. запись внутрь кода тест-кейса конкретных значений, что потребует ручной доработки для перевода тест-кейса на технологию тестирования под управлением данными; +* Неудобные имена переменных, неудобное оформление кода тест-кейса, отсутствие комментариев и прочие недостатки, усложняющие поддержку и сопровождение тест кейса в будущем; +* Низкая надёжность самих тест-кейсов в силу отсутствия обработки исключений, проверки условий и т.д + +**Технологии: Тестирование под управлением поведением** + +Рассмотренные выше технологии автоматизации максимально сфокусированы на технических аспектах поведения приложения и обладают общим недостатком: с их помощью сложно проверять высокоуровневые пользовательские сценарии (а именно в них и заинтересованы заказчики и конечные пользователи). Этот недостаток призвано исправить тестирование под управлением поведением, в котором акцент делается не на отдельных технических деталях, а на общей работоспособности приложения при решении типичных пользовательских задач. + +Такой подход не только упрощает выполнение целого класса проверок, но и облегчает взаимодействие между разработчиками, тестировщиками, бизнес-аналитиками и заказчиком, т.к. в основе подхода лежит очень простая формула «given-when-then»: + +* Given («имея, предполагая, при условии») описывает начальную ситуацию, в которой находится пользователь в контексте работы с приложением; +* When («когда») описывает набор действий пользователя в данной ситуации; +* Then («тогда») описывает ожидаемое поведение приложения. + +Такой принцип описания проверок позволяет даже участникам проекта, не имеющим глубокой технической подготовки, принимать участие в разработке и анализе тест-кейсов, а для специалистов по автоматизации упрощается создание кода автоматизированных тест-кейсов, т.к. такая форма является стандартной, единой и при этом предоставляет достаточно информации для написания высокоуровневых тест-кейсов. Существуют специальные технические решения (например, Behat, JBehave, NBehave, Cucumber), упрощающие реализацию тестирования под управлением поведением. + +Преимущества: + +* Фокусировка на потребностях конечных пользователей; +* Упрощение сотрудничества между различными специалистами; +* Простота и скорость создания и анализа тест-кейсов (что, в свою очередь, повышает полезный эффект автоматизации и снижает накладные расходы). + +Недостатки: + +* Высокоуровневые поведенческие тест-кейсы пропускают много деталей, а потому могут не обнаружить часть проблем в приложении или не предоставить необходимой для понимания обнаруженной проблемы информации; +* В некоторых случаях информации, предоставленной в поведенческом тест-кейсе, недостаточно для его непосредственной автоматизации + +_К классическим технологиям автоматизации тестирования также можно отнести разработку под управлением тестированием (Test-driven Development, TDD) с её принципом «красный, зелёный, улучшенный» (Red-Green-Refactor), разработку под управлением поведением (Behavior-driven Development), модульное тестирование (Unit Testing) и т.д. Но эти технологии уже находятся на границе тестирования и разработки приложений, потому выходят за рамки данной темы._ + +**Автоматизация вне прямых задач тестирования** + +На протяжении данного раздела мы рассматривали, как автоматизация может помочь в создании и выполнении тест-кейсов. Но все те же принципы можно перенести и на остальную работу тестировщика, в которой также бывают длительные и утомительные задачи, рутинные задачи или задачи, требующие предельного внимания, но не связанные с интеллектуальной работой. Всё перечисленное также можно автоматизировать. Да, это требует технических знаний и первоначальных затрат сил и времени на реализацию, но в перспективе такой подход может экономить до нескольких часов в день. К самым типичным решениям из данной области можно отнести: + +* Использование командных файлов для выполнения последовательностей операций - от копирования нескольких файлов из разных каталогов до развертывания тестового окружения. Даже в рамках многократно рассмотренных примеров по тестированию «Конвертера файлов» запуск приложения через командный файл, в котором указаны все необходимые параметры, избавляет от необходимости вводить их каждый раз вручную; +* Генерация и оформление данных с использованием возможностей офисных приложений, баз данных, небольших программ на высокоуровневых языках программирования. Нет картины печальнее, чем тестировщик, руками нумерующий три сотни строк в таблице; +* Подготовка и оформление технических разделов для отчётов. Можно тратить часы на скрупулезное вычитывание журналов работы некоего средства автоматизации, а можно один раз написать скрипт, который будет за мгновение готовить документ с аккуратными таблицами и графиками, и останется только запускать этот скрипт и прикреплять результаты его работы к отчёту; +* Управление своим рабочим местом: создание и проверка резервных копий, установка обновлений, очистка дисков от устаревших данных и т.д. и т.п. Компьютер всё это может (и должен!) делать сам, без участия человека; +* Сортировка и обработка почты. Даже раскладывание входящей корреспонденции по подпапкам гарантированно занимает у вас несколько минут в день. Если предположить, что настройка специальных правил в вашем почтовом клиенте сэкономит вам полчаса в неделю, за год экономия составит примерно сутки; +* Виртуализация как способ избавления от необходимости каждый раз устанавливать и настраивать необходимый набор программ. Если у вас есть несколько заранее подготовленных виртуальных машин, их запуск займёт секунды. А в случае необходимости устранения сбоев разворачивание виртуальной машины из резервной копии заменяет весь процесс установки и настройки с нуля операционной системы и всего необходимого программного обеспечения + +[**Классификация инструментов**](https://habr.com/ru/company/badoo/blog/347986/#:\~:text=%D0%A0%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D0%BC%20%D0%B8%D1%85%20%D0%BF%D0%BE%D0%B4%D1%80%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5.-,%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2,-%D0%94%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80) **автотестирования мобильных приложений** + +**Драйвер**. Утилиты автотестирования, как и другие программы, могут взаимодействовать с приложением только через программный интерфейс - по-другому они не умеют. Для работы через другие интерфейсы существуют специальные программы - драйверы. Драйвер - программа, которая предоставляет API для одного из интерфейсов приложения. Для каждого интерфейса, кроме, собственно, API, необходим свой драйвер. Например, когда вы даёте драйверу для GUI команду “Нажать на кнопку Menu”, он воспринимает её через API и отсылает в тестируемое приложение, где эта команда превращается в клик по графической кнопке Menu. Для взаимодействия с API приложения драйверы не нужны или почти не нужны - взаимодействие программное. А вот при работе с остальными интерфейсами без них не обойтись. Наиболее сложными обычно являются драйверы для GUI, так как этот интерфейс сильно отличается от обычного для программы общения кодом. При этом в автоматизированном тестировании мобильных приложений GUI наиболее актуален, так как в интеграционном тестировании использовать чаще всего приходится именно его. Наиболее популярные драйвера для GUI в мобильном тестировании - UIAutomator и Espresso для Android, XCUITest - для iOS. + +**Надстройка**. Когда функционала драйвера не хватает или он неудобен и сложен, над ним появляется еще один уровень, который я буду называть надстройкой.Надстройка - программа, которая взаимодействует с приложением через один или несколько драйверов, повышая удобство их использования или расширяя их возможности. + +У надстройки могут быть следующие функции: + +* Модификация поведения (без изменения API). Например: + * дополнительное протоколирование, + * валидация данных, + * ожидание выполнения действия в течение определенного времени. +* Повышение удобства и/ или уровня абстракции API через: + * использование синтаксического сахара - удобных названий функций, более коротких обращений к ним, унифицированного стиля написания тестов; + * неявное управление драйвером, когда, например, он инициализируется автоматически, без необходимости прописывать каждое такое действие вручную; + * упрощение сложных команд вроде выбора события из календаря или работы с прокручивающимися списками; + * реализацию альтернативных стилей программирования, таких как процедурный стиль или fluent. +* Унификация API драйверов. Здесь надстройка предоставляет единый интерфейс для работы сразу с несколькими драйверами. Это позволяет, например, использовать один и тот же код для тестов на iOS и Android, как в популярной надстройке Appium. + +**Фреймворк**. С другой стороны тестов находится фреймворк запуска. В рамках данной статьи я буду коротко называть его “фреймворк”. Фреймворк - это программа для формирования, запуска и сбора результатов запуска набора тестов. + +В задачи фреймворка входят: + +* формирование, группировка и упорядочение набора тестов, +* распараллеливание набора (опционально), +* создание фикстур, +* запуск тестов, +* сбор результатов их выполнения, +* формирование отчётов о выполнении (опционально). + +Можно заметить, что эти функции не связаны с тестированием только мобильных приложений - их можно успешно применять и в тестировании десктоп- и веб-приложений. Дело в том, что фреймворк не должен обеспечивать взаимодействие тестов и приложения - он работает только с тестами, и тип приложения не имеет значения. Если драйверы и надстройки находятся между тестами и приложением, то фреймворк находится над тестами, организуя их запуск. Поэтому важно не путать понятия “драйвер” и “фреймворк”. Конечно, в некоторых фреймворках есть собственные драйверы для работы с приложениями, но это вовсе не обязательное условие. Самые заметные фреймворки в мобильном тестировании - xUnit и Cucumber. + +**Комбайны**. Наконец, еще одна группа утилит, использующихся для автоматизации тестирования мобильных приложений, - это комбайны, объединяющие в себе и фреймворки, и драйверы (причём не только мобильные), и даже возможности разработки. Xamarin.UITest, Squish, Ranorex - все они поддерживают автоматизацию тестирования iOS-, Android-, веб-приложений, а два последних - ещё и десктоп-приложений. + +**Android: Инструменты для автоматизации тестирования** + +Тесты под андроид бывают локальные и инструментальные: + +* Instrumented tests выполняются на устройстве Android, физическом или эмулированном. Тест собирается в APK и устанавливается вместе с тестовым приложением. Instrumented tests обычно представляют собой тесты пользовательского интерфейса, запуск приложения и последующее взаимодействие с ним; +* Local tests выполняются на вашей машине разработки или сервере, поэтому их также называют тестами на стороне хоста (host-side tests). Для запуска тестов используется виртуальная машина Java (JVM). Обычно они маленькие и быстрые, изолируя тестируемый объект от остальной части приложения. + +Не все модульные тесты являются локальными, и не все Е2Е тесты выполняются на устройстве. Например: + +* Большой локальный тест: вы можете использовать симулятор Android, который работает локально, например Robolectric; +* Небольшой инструментальный тест: вы можете убедиться, что ваш код хорошо работает с функцией платформы, такой как база данных SQLite. Вы можете запустить этот тест на нескольких устройствах, чтобы проверить интеграцию с несколькими версиями SQLite. + +UI тесты обращаются к GUI-драйверам. GUI-драйверы являются наиболее сложным компонентом всего стека тестирования. Они решают базовые, низкоуровневые задачи. Когда вы даете GUI-драйверу ([Espresso](https://github.com/android/android-test/tree/master/espresso), [UiAutomator](https://developer.android.com/training/testing/other-components/ui-automator), [Robotium](https://github.com/RobotiumTech/robotium), [Selendroid](https://github.com/selendroid/selendroid)) команду «кликнуть на кнопку», он обрабатывает ее, взаимодействует с приложением, и эта команда превращается в клик по элементу. + +Все драйверы работают на Android Instrumentation Framework - базовом API Android для взаимодействия с системой. Самые популярные - Espresso и UiAutomator. Они оба разрабатываются и поддерживаются компанией Google. Их без труда можно использовать одновременно в пределах одного теста. + +**UiAutomator** поставляется вместе с Android SDK начиная с 16 версии API. Как GUI-драйвер он служит для поиска элементов интерфейса на экране девайса и эмуляции различных действий: кликов, тачей, свайпов, ввода текста, проверок на видимость. Рекордер для записи тестов он не предоставляет, зато предоставляет утилиту для просмотра древовидной структуры экрана - Ui Automator Viewer. + +UiAutomator позволяет писать тесты по модели черного ящика (black-box). Он живет в собственном процессе и работает без доступа к исходному коду приложения. Значит, тест с его использованием может взаимодействовать практически с любыми приложениями, в том числе системными. Это открывает доступ к множеству функций, например, становятся возможны: + +* набор номера и совершение звонка; +* отправка и чтение смс; +* взаимодействие с нотификациями; +* управление настройками сети, геолокации; +* снятие скриншотов. + +Наиболее подходящим сценарием для использования UiAutomator является не работа с тестируемым продуктовым приложением, а взаимодействие со сторонними или системными приложениями. Более подходящим инструментом для работы с продуктовым приложением является **Espresso**. + +Это также официальный фреймворк для UI-тестирования от Google, но тесты с его использованием работают уже по модели белого ящика (white-box). Espresso поддерживает Android API с 10 версии, хотя появился значительно позже. Предоставляет рекордер для записи тестов. Фактически Espresso является лидером и даже стандартом в индустрии. Такой успех может быть связан с тем, что он обеспечивает повышенную скорость и стабильность тестов в сравнении с конкурентами. Espresso решает низкоуровневую задачу - найти необходимый элемент на экране по заданным параметрам (ViewMatcher), произвести с ним действия (ViewAction) или выполнить проверки (ViewAssertion). Синтаксис Espresso реализован на основе фреймворка Hamcrest. Он построен на использовании иерархий вложенных матчеров - сущностей, описывающих требования к объекту, в случае Espresso - к элементам интерфейса. Они используются при задании параметров поиска элемента на экране, а также в проверках как описание свойств, которыми элемент должен обладать. Вложенность матчеров часто приводит к тому, что код тестов становится трудно читать и поддерживать. Стабильность и скорость тестов на Espresso обусловлены его внутренним устройством - все команды Espresso выполняются в том же процессе, в котором работает само тестируемое приложение. Действия и проверки преобразовываются и кладутся в очередь сообщений главного потока приложения. Выполняются они только когда приложение готово к этому, то есть его главный поток находится в состоянии ожидания пользовательского ввода (idle). + +Итак, с драйверами и устройством наиболее популярных из них мы разобрались. Мы поняли, что все они решают низкоуровневые задачи: поиск элемента на экране и выполнение с ним какого-либо действия. Из-за этого они предоставляют невыразительный API, которым неудобно пользоваться для решения более высокоуровневых проблем. Например, ни один из них не предоставляет собственный механизм для реализации повторов неудачных действий или логирования. Более того, часто существует необходимость работать в тестах сразу с несколькими драйверами, например, с Espresso и UiAutomator. + +На помощь приходят **обертки** (надстройки). Именно к API оберток мы будем обращаться в наших тестах, и именно обертки предоставляют конечный арсенал приемов для наших тестов. + +* ****[**Kakao**](https://github.com/agoda-com/Kakao) **** - простой и удобный Kotlin DSL для Espresso. Он позволяет упростить код тестов на Espresso и повысить его читаемость; +* [**Barista**](https://github.com/AdevintaSpain/Barista) **** - это объемная библиотека, содержащая большое количество полезных решений и приемов при работе с Espresso; +* ****[**Kaspresso**](https://github.com/KasperskyLab/Kaspresso) **** - это фреймворк-обертка для UI-тестирования, который претендует на то, чтобы избавить мир от зла и стать практически единственной зависимостью в вашем проекте для работы с тестами. Kaspresso расширяет лаконичный Kakao DSL - он предоставляет собственный Kotlin DSL для описания тестовых секций и шагов, внутри которых продолжает жить Kakao. + +_Подробнее в источнике по первой ссылке далее._ + +* [На чем писать Android UI-тесты](https://habr.com/ru/company/avito/blog/516650/) +* [Автотесты на Android. Картина целиком](https://habr.com/ru/company/kaspersky/blog/510230/) +* [An open-source documentation about Android UI testing](https://github.com/android-ui-testing/Cookbook/) +* [Android Developers - Test apps on Android](https://developer.android.com/training/testing) +* [Kaspresso: фреймворк для автотестирования, который вы ждали](https://habr.com/ru/company/kaspersky/blog/467617/) +* [Kaspresso tutorials. Часть 1. Запуск первого теста](https://habr.com/ru/company/kaspersky/blog/570658/) +* [Adb-server в Kaspresso](https://habr.com/ru/post/594017/) +* [Светлана Смельчакова - UI Automator deep diving](https://www.youtube.com/watch?v=bqNguUHK3SM) +* [Selendroid Tutorial: Android Mobile Test Automation Framework (Part 1)](https://www.softwaretestinghelp.com/selendroid-tutorial-1/) + +**iOS: Инструменты для автоматизации тестирования** + +Под iOS существуют следующие инструменты: + +* [TestProject](https://testproject.io) - фреймворк для iOS тестирования на базе Appium и Selenium. Подходит для тестирования веба, Android-приложений и API. При этом не обязательно использовать XCode; +* [EarlGrey](https://github.com/google/EarlGrey) - open-source инструмент, разработанный компанией Google для тестирования своих собственных iOS-приложений, таких как YouTube, Google Calendar и т.д.; +* [XCTest](https://developer.apple.com/documentation/xctest) - инструмент, созданный Apple для iOS тестирования. Он полностью совместим с XCode. XCTest универсален - c помощью него можно проводить как unit-тесты, так и тестировать производительность и пользовательский интерфейс; +* [Detox](https://github.com/wix/Detox) - это инструмент end-to-end тестирования, который используется для тестирования методом серого ящика; +* [OCMock](https://ocmock.org) - проект с открытым исходным кодом, который упрощает iOS-тестирование с помощью mock-объектов. OCMock расшифровывается как Objective-C Mock. С его помощью тестировщик может создавать mock-объекты, используя язык Objective-C; +* [KIF](https://github.com/kif-framework/KIF) - это фреймворк для интеграционного тестирования iOS-приложений. KIF расшифровывается как “keep it functional” и используется для тестирования пользовательского интерфейса, как и XCTest. + +_Подробнее в источнике по первой ссылке далее._ + +* [Обзор фреймворков для iOS тестирования](https://testengineer.ru/obzor-frejmvorkov-dlya-ios-testirovaniya/) +* [Погружение в автотестирование на iOS. Часть 1. Как работать с accessibilityidentifier объектов](https://habr.com/ru/company/vivid\_money/blog/533180/) +* [Погружение в автотестирование на iOS. Часть 2. Как взаимодействовать с ui-элементами iOS приложения в тестах](https://habr.com/ru/company/vivid\_money/blog/538708/) + +**Кроссплатформенные обертки** + +* [Appium](https://appium.io) - это довольно популярный кросс-платформенный open source инструмент для автоматизации тестирования десктоп и мобильных приложений под Android и iOS. Архитектура Appium схожа с Selenium WebDriver, широко распространенным и ставшим стандартом в web-тестировании. Кроссплатформенность достигается за счет использования разных драйверов для разных платформ. Именно драйверы транслируют клиентский Appium-код в команды, непосредственно исполняемые на устройствах. Для написания тестов Appium предоставляет клиентские библиотеки с фиксированным API; +* [Calabash](https://www.guru99.com/calabash-android-ios-testing.html) пользуется большой популярностью среди разработчиков благодаря стабильности и подходу к построению тестов. Calabash использует Cucumber, благодаря чему его могут использовать даже люди, незнакомые с программированием. Поддерживает много языков программирования, может работать как с iOS, так и с Android приложениями. + +Доп. материал: + +* [Appium Studio Tutorial For Mobile Automation (15+ Hands-On Tutorials)](https://www.softwaretestinghelp.com/appium-studio-tutorial/) +* [Appium Tutorial For Testing Android And IOS Mobile Apps](https://www.softwaretestinghelp.com/appium-tutorial-for-beginners/) +* [Автоматизация мобильных приложений на базе Appium](https://habr.com/ru/company/dataart/blog/308180/) + +WEB: Инструменты для автоматизации тестирования + +* [Selenium](https://www.selenium.dev): Старейший фреймворк, все еще самый популярный. Поддерживает Java, Python, C#, Ruby, JavaScript. Эмулирует почти все возможные действия пользователя; +* [Cucumber](https://cucumber.io): Фреймворк ориентирован на behavior-driven development (BDD) - “разработка через поведение”; удобный как для разработчиков, так и QA. Главное преимущество: простота; +* [Cypress](https://www.cypress.io): И наконец Cypress, делающий жизнь тестировщиков проще. В нем нет некоторых проблем, существующих в Selenium, потому что он имеет другую архитектуру - построен на основе JS-фреймворка Mocha. Преимущества: простота и удобство асинхронных тестов. Применяется BDD/TDD-библиотека (TDD = test-driven development); +* [Playwright](https://playwright.dev) enables reliable end-to-end testing for modern web apps; +* [Puppeteer](https://pptr.dev) is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol + +_Подробнее в источнике по первой ссылке далее._ + +* [E2E-тестирование и Cypress](https://testengineer.ru/e2e-testirovanie-i-cypress/) +* [Александр Самойлов, Сергей Львов - Визуальные проверки в End-to-End-тестах](https://www.youtube.com/watch?v=RSNZ2312XJI\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=22) +* [QA Wolf handles your end-to-end testing](https://www.qawolf.com) +* [Selenium vs Puppeteer vs Cypress vs Playwright](https://habr.com/ru/post/566348/) +* [30+ Best Selenium Tutorials: Learn Selenium With Real Examples](https://www.softwaretestinghelp.com/selenium-tutorial-1/) +* [Что такое Cypress: Введение и архитектура](https://testengineer.ru/chto-takoe-cypress-vvedenie-i-arhitektura/) + +**API: Инструменты для автоматизации тестирования** + +По постману и соап есть множество ссылок в инструментах для мануальщика. + +* [Что такое REST Assured? - REST Assured API Testing - 18+](https://www.youtube.com/watch?v=8nAgzJea1L8) +* [Тестирование API с помощью REST Assured (Java)](https://medium.com/@svetlana.podv/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-api-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-rest-assured-2654f9b1faab) +* [Cucumber и Spock для автоматизации API-тестов. В чем польза этих фреймворков](https://dou.ua/forums/topic/35288/) +* [Cypress API](https://www.youtube.com/watch?v=QarebAg0zNM) + +**Unit** + +* [List of unit testing frameworks](https://en.wikipedia.org/wiki/List\_of\_unit\_testing\_frameworks) +* [Перевод книги Python Testing with pytest](https://habr.com/ru/post/426699/) + +_**Инструменты по performance/security и всему не вошедшему смотри в разделе полезных ссылок по мануальному тестированию.**_ + +_**Инструменты, касающиеся инфраструктуры CI/CD вынесены в следующую тему.**_ + +Доп. материал: + +* [Автоматизация UI-тестирования в приложении Недвижимости на Android. Доклад Яндекса](https://habr.com/ru/company/yandex/blog/568800/) +* [Как мы автоматизировали тестирование бэкенда](https://habr.com/ru/company/ru\_mts/blog/578600/) +* [Browser Automation Testing For Start-Ups And Small-Sized Teams](https://www.softwaretestinghelp.com/browser-automation-testing/) +* [Доказательная разработка или как data-driven подход добавил смысла работе](https://habr.com/ru/company/funcorp/blog/548576/) +* [Why Do We Need Framework For Test Automation?](https://www.softwaretestinghelp.com/why-do-we-need-test-automation-framework/) + +По инструментам: + +* [Путеводитель по инструментам автотестирования мобильных приложений](https://habr.com/ru/company/badoo/blog/347986/) +* [Top 20 Best Automation Testing Tools In 2022 (Comprehensive List)](https://www.softwaretestinghelp.com/top-20-automation-testing-tools/) +* [100+ лучших инструментов для тестирования программного обеспечения](https://blog.themarfa.name/100-luchshikh-instrumientov-dlia-tiestirovaniia-proghrammnogho-obiespiechieniia/) +* [How To Choose The Best Automation Testing Tool (A Complete Guide)](https://www.softwaretestinghelp.com/automation-testing-tutorial-4/) +* [How To Develop Test Scripts Using Top 5 Most Popular Test Automation Frameworks (Examples)](https://www.softwaretestinghelp.com/automation-testing-tutorial-5/) +* [Record-and-Replay тестирование - сочетание достоинств юнит и интеграционных тестов](https://habr.com/ru/post/573948/) +* [LEADERSHIP IN TEST: TEST EXECUTION TOOLS](https://theqalead.com/topics/test-execution-tools/) +* [Фреймворки для тестирования: личный опыт и новые методы](https://habr.com/ru/post/579032/) +* [10 LATEST SOFTWARE TESTING TOOLS QAS ARE USING IN 2022](https://theqalead.com/tools/software-testing-tools/) +* [Применение автотестов в ежедневных релизах](https://habr.com/ru/company/utkonos/blog/591539/) +* [Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария](https://infostart.ru/1c/articles/969637/) +* [THE 10 BEST QA AUTOMATION TOOLS FOR SOFTWARE TESTING IN 2022](https://theqalead.com/tools/qa-automation-tools/) +* [Выбираем правильные инструменты автоматизации (с таблицей)](https://testengineer.ru/vybiraem-pravilnye-instrumenty-avtomatizacii/) +* [Борьба с задержкой тестов в Selenium: пример из практики](https://testengineer.ru/borba-s-zaderzhkoj-testov-v-selenium/) +* [Все про Mobile QA Automation - Appium, XCUITest, Espresso](https://www.youtube.com/watch?v=Yn0tlt1n5Nw) +* [Дмитрий Буздин - Как построить свой фреймворк для автотестов?](https://www.youtube.com/watch?v=vrjN8VTeuOk) +* [Одновременное использование нескольких тест-фреймворков](https://telegra.ph/Odnovremennoe-ispolzovanie-neskolkih-test-frejmvorkov-04-23) +* [Почему я больше не использую Cucumber при автоматизации тестирования](https://telegra.ph/Pochemu-ya-bolshe-ne-ispolzuyu-Cucumber-pri-avtomatizacii-e2e-testirovaniya-04-22) +* [Selenoid UI](http://aerokube.com/selenoid-ui/latest/) +* [50 приложений для эффективной организации удалённой работы](https://habr.com/ru/company/vdsina/blog/494762/) +* [Selenium, Selenoid, Selenide, Selendroid… Что все это значит?](https://habr.com/ru/post/463525/) +* [6 антипаттернов для UI тестирования на JavaScript, которых следует избегать](https://telegra.ph/6-antipatternov-dlya-UI-testirovaniya-na-JavaScript-kotoryh-sleduet-izbegat-03-06) +* [Эмуляторы и симуляторы vs реальные устройства для автоматизации тестирования](https://habr.com/ru/company/otus/blog/596371/) +* [FlaNium: как сделать тестирование Desktop-приложений под Windows проще](https://habr.com/ru/company/lanit/blog/553588/) +* [Black box API testing with server logs](https://glebbahmutov.com/blog/api-testing-with-sever-logs/) +* [Veslo - расширение Retrofit для тестирования (Java)](https://habr.com/ru/post/647499/) +* [The Essential Guide to Automated Visual Regression Testing](https://hackernoon.com/the-essential-guide-to-automated-visual-regression-testing-2l2k3467) +* [QTP Tutorials - 25+ Micro Focus Quick Test Professional (QTP) Training Tutorials](https://www.softwaretestinghelp.com/qtp-quicktest-professional-tutorial-1/) +* [15+ SoapUI Tutorials: The Best Web Services API Testing Tool](https://www.softwaretestinghelp.com/web-services-api-testing-tool-soapui-tutorial-1/) +* [LoadRunner Tutorial For Beginners (Free 8-Day In-Depth Course)](https://www.softwaretestinghelp.com/hp-loadrunner-load-testing-tool-training-tutorials/) +* [Most Popular Test Automation Frameworks With Pros And Cons Of Each - Selenium Tutorial #20](https://www.softwaretestinghelp.com/test-automation-frameworks-selenium-tutorial-20/) +* [Introduction To Sikuli GUI Automation Tool (Automate Anything You See On Screen) - Sikuli Tutorial #1](https://www.softwaretestinghelp.com/sikuli-tutorial-part-1/) +* [PowerShell UIAutomation Tutorial: UI Automation Of Desktop Applications](https://www.softwaretestinghelp.com/desktop-application-ui-automation-with-powershell/) +* [Katalon Automation Recorder (Selenium IDE Alternative): Hands-On Review Tutorial](https://www.softwaretestinghelp.com/katalon-automation-recorder-review-tutorial/) +* [Geb Tutorial - Browser Automation Testing Using Geb Tool](https://www.softwaretestinghelp.com/geb-tutorial-browser-automation-testing-using-geb-tool/) +* [AutoIt Tutorial - AutoIt Download, Install & Basic AutoIt Script](https://www.softwaretestinghelp.com/autoit-tutorial-to-download-write-autoit-script/) +* [Automation Testing Using Cucumber Tool And Selenium - Selenium Tutorial #30](https://www.softwaretestinghelp.com/cucumber-bdd-tool-selenium-tutorial-30/) +* [Protractor Testing Tool For End-To-End Testing Of AngularJS Applications](https://www.softwaretestinghelp.com/protractor-testing-tutorial/) +* [Ranorex Tutorial: A Powerful Desktop, Web, And Mobile Automation Testing Tool](https://www.softwaretestinghelp.com/ranorex-tutorial-1/) +* [Осваиваем Data-driven Testing в Selenium](https://testengineer.ru/osvaivaem-data-driven-testing-v-selenium/) +* [Борьба с задержкой тестов в Selenium: пример из практики](https://testengineer.ru/borba-s-zaderzhkoj-testov-v-selenium/) +* [Доклад: Как достичь Pixel Perfect с Jetpack Compose и Figma / Владимир Иванов (Tinkoff)](https://www.youtube.com/watch?v=GaY3IbgW9V0) +* [Ускоряем свои тесты с помощью сypress-grep](https://testengineer.ru/uskoryaem-svoi-testy-s-pomoshchyu-cypress-grep/) +* [QAGuild#53: Тестирование api на python и schemathesis](https://www.youtube.com/watch?v=y5zSVa9GlY0) +* [Selenide vs Selenium - подробное сравнение](https://habr.com/ru/company/otus/blog/651967/) +* [Grafana и автотесты: учимся измерять работу тестов](https://habr.com/ru/company/ozontech/blog/657933/) +* [Playwright: веб-тестирование без драмы](https://habr.com/ru/company/jugru/blog/652919/) +* Рецепты применения техник тест-дизайна с помощью многофункц-ного Citrus Testing Framework часть [1](https://www.youtube.com/watch?v=ACyMqJpS3IQ), [2](https://www.youtube.com/watch?v=pvhON3pL4o8) +* [Создание фреймворка для автоматических тестов: пошаговая инструкция](https://www.youtube.com/watch?v=42iLidKlC4I) +* [Как в Яндексе используют PyTest и другие фреймворки для функционального тестирования](https://habr.com/ru/company/yandex/blog/242795/) +* [Единственно верный способ загружать и скачивать файлы в Selenium тестах](https://habr.com/ru/post/497922/) +* [Пишем автотест с использованием Selenium Webdriver, Java 8 и паттерна Page Object](https://habr.com/ru/post/502292/) +* [Простой и удобный шаблон тестового фреймворка на selenide для UI автотестов](https://habr.com/ru/post/504408/) +* [Тесты в Python: все основные подходы, плюсы и минусы. Доклад Яндекса](https://habr.com/ru/company/yandex/blog/517266/) +* [Home видео для Selenium aka WebDriver. Или чем записать экран, если у вас есть java, поломанные тесты и немного времени](https://habr.com/ru/post/517446/) +* [Эффективное тестирование верстки](https://habr.com/ru/company/oleg-bunin/blog/499638/) +* [Автоматизация тестирования мобильных приложений. Часть 2: предусловия, верификация элементов и независимость шагов](https://habr.com/ru/company/badoo/blog/547196/) diff --git a/faq-dlya-novichkov/README.md b/faq-dlya-novichkov/README.md new file mode 100644 index 0000000..d0f04d9 --- /dev/null +++ b/faq-dlya-novichkov/README.md @@ -0,0 +1,2 @@ +# FAQ для новичков + diff --git a/faq-dlya-novichkov/chto-dolzhen-znat-i-umet-junior-chto-sprosyat-na-sobesedovanii.md b/faq-dlya-novichkov/chto-dolzhen-znat-i-umet-junior-chto-sprosyat-na-sobesedovanii.md new file mode 100644 index 0000000..9b02392 --- /dev/null +++ b/faq-dlya-novichkov/chto-dolzhen-znat-i-umet-junior-chto-sprosyat-na-sobesedovanii.md @@ -0,0 +1,151 @@ +# Что должен знать и уметь Junior? Что спросят на собеседовании? + +Конкретного ответа на этот вопрос нет, всё зависит от компании и вакансии. Ожидания в двух разных компаниях и даже проектах могут не пересекаться совершенно никак. Мидл+ из одной компании может оказаться джуном- в другой.\ +Если всё же пытаться вывести среднее, то вот пара ссылок на карты знаний для тестировщиков: + +* [QA RoadMap 2021](https://disk.yandex.ru/i/x\_hOsnoxVMoB-A) +* [Большая дорожная карта развития тестировщика](https://testengineer.ru/razvitie-testirovshchika/) +* [Awesome Quality Assurance Roadmap](https://github.com/fityanos/awesome-quality-assurance-roadmap) +* [https://www.mindmeister.com/ru/1324282825/junior-qa?fullscreen=1](https://www.mindmeister.com/ru/1324282825/junior-qa?fullscreen=1) +* [https://www.mindmeister.com/ru/1558647509?t=973hdS2AKb](https://www.mindmeister.com/ru/1558647509?t=973hdS2AKb) +* [https://miro.com/app/board/o9J\_lXUgVuQ=/](https://miro.com/app/board/o9J\_lXUgVuQ=/) +* [Quality Engineer Learning Roadmap](https://medium.com/slalom-build/quality-engineer-learning-roadmap-fddfcb77409e) +* [Пост “что нужно знать junior QA engineer”](https://t.me/shooandendlessagony/2) +* [Святослав Куликов “Тестирование программного обеспечения. Базовый курс”](https://svyatoslav.biz/software\_testing\_book/). 4.1. Карьера тестировщика + +Некоторые компании подробно расписывают на своих порталах ожидания от каждой стадии развития сотрудника, по этой же теме много видео на Youtube ([раз](https://www.youtube.com/watch?v=l9ezImoh5ac\&feature=emb\_logo\&ab\_channel=LearnQA%3A%D0%9E%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2), [два](https://www.youtube.com/watch?v=wDHZsoZIxcY\&ab\_channel=LearnQA%3A%D0%9E%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2), [три](https://www.youtube.com/watch?v=tzOhRHVX6ko\&ab\_channel=QAQC), [четыре](https://www.youtube.com/watch?v=5DGuDT98EC0\&ab\_channel=AzatZakuanov), …). Более практичный ориентир - просто открыть и почитать интересующие вакансии, выписывая повторяющиеся пункты. + +Дальнейшие пункты являются усредненными. + +**Джун должен уметь**: + +* Ориентироваться, как протестировать что-то структурированно и в правильном порядке (приоритезация); +* Составлять тест-кейсы по ТЗ/юзер стори; +* Оформлять баг-репорты; +* Пользоваться базовыми инструментами: Chrome DevTools, Postman, Charles/Fiddler, GIT; +* Для мобильщиков: посмотреть логи через ADB консоль или в IDE, собрать приложение. + +**HR-вопросы на собеседовании** + +Часть из них зададут в любом случае. Список, разумеется, не полный: + +* Расскажи о себе (все что хочешь, что нам нужно знать о тебе) +* Есть ли релевантный опыт? +* Какие курсы проходил и вообще, что изучал? +* Что не устраивало на прошлом месте работы (если было), особенно если решил сменить сферу? +* Почему выбрал именно тестирование? +* Чем заинтересовала именно наша компания? +* Как часто бываешь на собеседованиях? +* Уровень английского? (вопрос могут задать на английском, многие теряются в этот момент) +* (Если требуется и уровень хороший) расскажите на английском: как доехали до собеседования/о себе (только не как в обществе анонимных алкоголиков) /почему считаешь, что можешь стать тестировщиком/ как прошел вчерашний день/о своих хобби/ и т.п. +* Как в целом смотришь на мир, как решаешь возникающие проблемы? +* 3 твоих сильных и 3 слабых стороны? +* Как отдыхаешь? Как проводишь свободное время? +* Какие хобби? +* Что последнее прочитал техническое? Не техническое? +* Если бы мог вернуться в начало осознанной жизни, выбрал бы иной карьерный путь? +* 3 примера, что тебе положительного дал предыдущий опыт работы (если есть) +* 3 плюса и 3 минуса в сфере тестирования лично для тебя +* Как видишь развитие в этой сфере, кем видишь себя через год, три? +* Какая-то одна вещь или ситуация, которой ты гордишься +* Твой самый большой факап +* Представим, что остальных кандидатов много и они опытнее (обычно так и есть), может у тебя есть какие-то преимущества перед ними? Почему ты думаешь, что лучше других кандидатов? +* Зарплатные ожидания сейчас, после испытательного срока, через год? +* Есть ли какие-то факторы, с которыми ты согласишься на меньшие деньги? +* С чем точно не готов мириться в отношении компании или руководителя? +* Ожидания от работы? +* Отношение к переработкам? +* Парням: наличие военного билета, девушкам: планы на ближайшие годы по поводу декрета +* Представь, что ты работаешь уже полгода. Опиши свой рабочий день. +* Что если при выполнении задачи понимаешь, что не укладываешься в сроки? +* Что делать, если нет времени на регрессионное тестирование? +* Что делать, если разработчик утверждает, что найденный дефект таковым не является? +* Пришел баг из продакшена, что делаем? +* Какое самое важное влияние оказывает тестировщик на команду разработки? (не продукт!) +* Чем ты как начинающий тестировщик можешь быть полезен нашей компании? +* Кто виноват в багах, найденных в процессе регресса? +* Как решать конфликты в удаленной команде? +* Как понять, что тестировщик хорошо сделал свою работу? + +**Теория на собеседовании** + +* Что такое тестирование и зачем оно нужно; +* Разница QA/QC/Тестирование; +* Качество ПО; +* Принципы тестирования; +* Верификация и валидация; +* Виды, типы, уровни тестирования; +* Тестовые артефакты; +* Баг и его жизненный цикл; +* Severity/priority; +* Техники тест-дизайна; +* SDLC, STLC; Методологии разработки ПО; +* API; +* Базовое знание сетей: Клиент-серверная архитектура, HTTP(s), его методы, коды ответов, TCP/IP, REST/SOAP, JSON/XML; +* Базы данных: основы БД, что такое SQL, СУБД, основные команды (селекты, джойны); +* Специфика конкретного домена/направления/платформы (опционально): если ожидается работа с мобильными, то будут спрашивать и по этой теме. Темы см. в разделе “Мобильное тестирование”. В случае gamedev могут спросить жанровые предпочтения, про последнее, во что играл, что понравилось/не понравилось и т.п. + +**Практика на собеседовании** + +* Тестирование некого продукта. В качестве тестового задания это обычно подразумевает нахождение багов и оформление баг-репортов или написание кейсов, тест-плана. На собеседовании это открытый вопрос и оцениваются рассуждения кандидата и часто умение пользоваться техниками тест-дизайна; +* Тестирование поля или формы; +* Определение серьезности и приоритета какого-либо бага; +* Придумать хороший summary для репорта; +* Задачки по SQL. + +Для геймдева могут быть вопросы, относящиеся к определенной игре: как бы тестировал карту, персонажа, игровую механику и т.п. Больше [тут](https://www.softwaretestingmaterial.com/game-testing-interview-questions/). + +**Разница для Junior/Middle/Senior** + +Просто для цельной картины, если говорить про уровень middle, то работодателей теория уже не так интересует, если только это не крупная галера с высоким конкурсом (вопросы в таком случае будут +- те же, что и для junior, просто копнут глубже). Мидл - самостоятельная в решении рядовых задач боевая единица. Такой специалист уже имеет опыт в задачах, инструментах, видел какие-то процессы и уже примерно может давать оценку времени на выполнение задач. Соответственно и спрашивать будут больше по таким кейсам и по предыдущему опыту работы. Senior это уже про серьезный опыт, а также: организация работы, [менторинг](https://software-testing.ru/library/around-testing/management/3656-mentoring-software-testers), автоматизация, CI/CD и место автоматизации в нём, менеджмент процессов и их построение, планирование, метрики, ROI, знание стандартов, опыт в тест планах и стратегиях, декомпозиция и распределение задач, оценка времени и т.п. [Тут](https://www.youtube.com/watch?v=KlE3BOltGdw) можно узнать больше. [Тут](https://telegra.ph/Sobesedovanie-s-QA-250-voprosov-dlya-Junior-Middle-Senior-01-12) вопросы разделены по грейдам. + +**Английский** + +Помимо вышеперечисленного нужно помнить об английском языке. Он нужен для чтения документации и актуальных статей, просмотра вебинаров, поиска ответов на вопросы, т.к. в русскоязычном сегменте информации в разы меньше и пока ее переведут она уже устаревает. В РБ и Украине гораздо чаще чем в РФ язык нужен для ведения проектной документации и общения с иностранными коллегами (не надейтесь особо на переводчики и авто субтитры, всё это еще далеко от совершенства). Конечно, компании работающие на внутренние рынки могут не требовать знание языка, но тут, опять же, остается открытым вопрос личного развития. Если же в вакансии указан необходимый уровень владения языком, то будьте готовы к тому, что как минимум попросят ответить на какой-нибудь простенький житейский или HR-вопрос на английском. В отдельных случаях, где явно указана необходимость разговорного уровня, все собеседование вполне может пройти на английском. + +Доп. материал: + +* [Собеседование QA - Старт карьеры тестировщика в 2022 году](https://www.youtube.com/watch?v=kYgmffIHb0w) +* [Знания и навыки, необходимые для работы в тестировании в 2022 году](https://habr.com/ru/post/656027/) +* [Собеседование тестировщика на Западе: список вопросов](https://testengineer.ru/sobesedovanie-na-testirovshchika-v-zapadnyh-stranah/) +* [Обзор вакансий для тестировщиков (QA)](https://www.youtube.com/watch?v=ePtN5vlNAlE) +* [Образ современного тестировщика. Что нужно знать и уметь](https://habr.com/ru/company/funcorp/blog/426759/) +* [Святослав Куликов про QA, Курсы тестировщиков / Как развиваться тестировщику](https://www.youtube.com/watch?v=aIb8BPzVWG4\&t=53s) +* [Что должен знать тестировщик бэкенда](https://habr.com/ru/company/funcorp/blog/491188/) +* [Тестировщик ПО / что делает QA Engineer / интервью с Artsiom Rusau QA](https://www.youtube.com/watch?v=Yd0Z-35GbK4\&feature=youtu.be\&ab\_channel=%D0%9B%D1%91%D1%88%D0%B0%D0%9C%D0%B0%D1%80%D1%88%D0%B0%D0%BB) +* [Чек-лист подготовки к собеседованию на позицию ручного web-тестировщика](https://habr.com/ru/company/renins/blog/564522/) +* [Исследование рынка труда в QA](http://mymonday.by/qa-market-research-august-2019) +* [Гид по профессии тестировщик: чем занимается специалист в сфере QA, сколько зарабатывает, что надо знать и где учиться](https://ru.hexlet.io/blog/posts/gid-po-professii-testirovschik-chem-zanimaetsya-skolko-zarabatyvaet-chto-nado-znat-i-gde-uchitsya) +* [Качественное тестирование ПО](https://habr.com/ru/company/otus/blog/530290/) +* [Пути развития тестировщика. Карьера QA Engineer](https://www.youtube.com/watch?v=m7tQyFGU4Ls) +* [Challenge accepted: карьера тестировщика](https://habr.com/ru/article/561354/) +* Грейды на примере разработки: [раз](https://vas3k.ru/inside/39/levels/), [два](https://maximgorbatyuk.gitbook.io/knowledge-base/management/2019-09-08-developer-skill-matrix) +* [Как стать QA-лидом - теория и практические советы](https://testengineer.ru/kak-stat-qa-lidom/) +* [Что должен знать тестировщик без опыта](https://www.youtube.com/watch?v=96f8fqqumhE) +* [Leadership in test: managing your career](https://theqalead.com/topics/managing-your-testing-career/) +* [Какая разница между Junior, Middle и Senior тестировщиками](https://www.youtube.com/watch?v=9uPCf0-e48I) +* [11 признаков Senior QA, к которым я пришёл за годы работы в тестировании](https://habr.com/ru/company/funcorp/blog/593231/) +* [Junior QA - Middle QA - Senior QA](https://www.youtube.com/watch?v=oRszp5QflTk) +* [Собеседование тестировщика на Западе: список вопросов](https://testengineer.ru/sobesedovanie-na-testirovshchika-v-zapadnyh-stranah/) +* [Круглый стол "Джуниоры в QA: плюсы и минусы для компании”](https://www.youtube.com/watch?v=iNu5f-SyiNA) +* [Модель обучения «70:20:10»](https://telegra.ph/Kak-dostich-maksimalnyh-rezultatov-v-svoyom-razvitii-02-17) +* [Пентестер: суть профессии, востребованность, зарплата и другие нюансы](https://habr.com/ru/post/651167/) +* [Устану ли я играть, нужно ли уметь кодить и чем вообще занимаются QA в геймдеве](https://habr.com/ru/company/lightmap/blog/650245/) +* [Реестр профессиональных стандартов - Специалист по тестированию в области информационных технологий](https://profstandart.rosmintrud.ru/obshchiy-informatsionnyy-blok/natsionalnyy-reestr-professionalnykh-standartov/reestr-professionalnykh-standartov/index.php?ELEMENT\_ID=57024) + +Английский: + +* [Как тестировщику учить английский язык](https://software-testing.ru/library/around-testing/job/3591-english-for-qa-engineers) +* [Таблица уровней английского языка](https://englex.ru/english-levels-table/) +* Марафон “Как IT-специалисту заговорить по-английски за 6 недель”: [часть 1](https://dt9xom8irs6kr.cloudfront.net/u256113/456701-5237085293807285895.mp4) + [часть 2](https://dt9xom8irs6kr.cloudfront.net/u256113/463400-3382237430755091928.mp4) + [часть 3](https://dt9xom8irs6kr.cloudfront.net/u256113/491184-811669784489900464.mp4) +* [EngVid.com](https://www.engvid.com) +* [Плейлист “Essential English Grammar или Красный Мёрфи (уровень elementary A1-A2) - лучшая английская грамматика для начинающих”](https://www.youtube.com/playlist?list=PLYB0SmefqEsniU1UbGzrfhNCV3noALHj7) +* [QA English Basics - тренинг по английскому языку](https://www.youtube.com/watch?v=YCXw-MB5OBY\&t=469s) +* [Английский для тестировщика (QA Engineer) / Мой топ English ресурсов](https://www.youtube.com/watch?v=vMudS9qnyyc) +* [English with Lucy](https://www.youtube.com/c/EnglishwithLucy/playlists) +* [Большая подборка](https://vk.com/topic-127171939\_34549533#:\~:text=%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%20\(%D0%B0%D0%BC%D0%B5%D1%80%D0%B8%D0%BA%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9\)%20%2B%20%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8) +* [Как я осилил английский](https://habr.com/ru/post/413633/) +* [Учим английский дешево и эффективно](https://habr.com/ru/post/369695/) +* [Очень много YouTube-каналов для прокачки английского языка для программистов](https://habr.com/ru/post/465731/) +* [9 четких инструментов для изучения и прокачки английской лексики](https://habr.com/ru/company/englishdom/blog/490736/) +* [Экзамены TOEFL/IELTS как ориентир для развития. Фундаментальные апгрейды языка и их польза для разработчика](https://habr.com/ru/post/512346/) diff --git a/faq-dlya-novichkov/gde-iskat-rabotu.md b/faq-dlya-novichkov/gde-iskat-rabotu.md new file mode 100644 index 0000000..eca2cef --- /dev/null +++ b/faq-dlya-novichkov/gde-iskat-rabotu.md @@ -0,0 +1,22 @@ +# Где искать работу? + +Подробнее см. в источнике. + +* [https://www.linkedin.com/](https://www.linkedin.com) ([добавляйтесь в друзья](https://www.linkedin.com/in/vladislaveremeev/) :) +* [https://hh.ru/](https://hh.ru) +* [https://career.habr.com/](https://career.habr.com) +* Группы Facebook +* Telegram-каналы +* Группы Вконтакте +* Чаты специалистов или профессиональных мероприятий +* Офлайн конференции/кэмпы/мастер-классы +* Сайты или группы от крупных компаний +* Зарубежные площадки для поиска работы + +Источники: + +* [Где искать работу в IT?](https://habr.com/ru/post/655577/) + +Доп. материал: + +* [Сайти для пошуку роботи в Україні, в тому числі віддалено](https://dou.ua/forums/topic/37190/) diff --git a/faq-dlya-novichkov/kachestva-i-navyki-kotorymi-nuzhno-obladat-testirovshiku.md b/faq-dlya-novichkov/kachestva-i-navyki-kotorymi-nuzhno-obladat-testirovshiku.md new file mode 100644 index 0000000..fb8e640 --- /dev/null +++ b/faq-dlya-novichkov/kachestva-i-navyki-kotorymi-nuzhno-obladat-testirovshiku.md @@ -0,0 +1,31 @@ +# Качества и навыки, которыми нужно обладать тестировщику? + +* Самые главные: + * Развитые софт-скиллы; + * Самостоятельность; + * Прокачанное умение гуглить. +* Второстепенные, но всё еще важные: + * Пытливый ум и желание докопаться до первопричины проблемы; + * Крайне полезно иметь склонность к развитию T-shaped skills (когда специалист углубляется в свою профессиональную область, но также развивается поверхностно в смежных областях); + * QA Engineer это всё же engineer, желательно иметь склонности к [problem solving](https://www.youtube.com/watch?v=1hKRsKKwtVU); + * Общая грамотность; + * Устойчивость к рутине; + * Умение воспринимать текстовую информацию. Ютуб - это хорошо, но большинство доки пишется текстом. + +Доп. материал: + +* [Миф об образе мышления в тестировании](https://telegra.ph/Mif-ob-obraze-myshleniya-v-testirovanii-02-10) +* [Важные навыки тестировщика](https://software-testing.ru/library/testing/general-testing/3599-bloggers-club-essential-skills-for) +* [How to Think Like a Tester](https://medium.com/@blakenorrish/how-to-think-like-a-tester-7a174ff6aeaf) + +Про soft-skills: + +* [Podlodka Soft Skills Crew - Интервью "Как я научился софт-скиллам и захватил мир"](https://www.youtube.com/watch?v=YbiHrgDx8j0) +* [3 Tips To Improve Your Verbal Communication Skills](https://betterprogramming.pub/3-tips-to-improve-your-verbal-communication-skills-d461ff36688a) +* [Как разговаривать с му\*аками (краткое содержание) - Марк Гоулстон](https://www.youtube.com/watch?v=3HeB9-FfClA) +* [Конспект по книге Марка Гаулстона “Я слышу вас насквозь”](https://habr.com/ru/post/468291/) +* [Патрик Ленсиони - Пять пороков команды (краткое содержание)](https://briefly.ru/lensioni/piat\_porokov\_komandy/) +* [Моя роль в конфликте. Елена Татти. COMAQA Piter 2017](https://www.youtube.com/watch?v=AyzlgEIQ70M) +* [Checklist молодого QA менеджера глазами тестировщика. Антон Семенченко](https://www.youtube.com/watch?v=HBVLuxDlow4) +* [Soft-skills успешного тестировщика](https://habr.com/ru/post/434794/) +* [Как ИТ-специалисту развить навыки коммуникации. 20+ полезных материалов](https://habr.com/ru/company/ncloudtech/blog/653243/) diff --git a/faq-dlya-novichkov/kak-proiskhodit-process-naima.md b/faq-dlya-novichkov/kak-proiskhodit-process-naima.md new file mode 100644 index 0000000..90a039d --- /dev/null +++ b/faq-dlya-novichkov/kak-proiskhodit-process-naima.md @@ -0,0 +1,16 @@ +# Как происходит процесс найма? + +Все зависит от компании и в меньшей степени от уровня позиции. В среднем это выглядит так: + +1. Отклик на вакансию; +2. \*Опционально: выполнение [тестового задания](https://www.youtube.com/watch?v=LAh7CAqzJec), п.2 и п.3 могут меняться местами; +3. Скрининг по телефону (небольшая беседа с HR); +4. Полноценное собеседование с HR; +5. Техническое собеседование, п.4 и п.5 иногда делают за раз; +6. \*Опционально: знакомство с боссом/лидом/командой); + +В очень больших компаниях с потоковым наймом бывает и по 6-7 этапов интервью, в мелких местных же всё может обойтись одной встречей с беседой за кофе. + +Доп. материал: + +* [Тестирование тестировщиков](https://habr.com/ru/company/hh/blog/571364/) diff --git a/faq-dlya-novichkov/kak-prokhodit-sobesedovanie.md b/faq-dlya-novichkov/kak-prokhodit-sobesedovanie.md new file mode 100644 index 0000000..220c0cc --- /dev/null +++ b/faq-dlya-novichkov/kak-prokhodit-sobesedovanie.md @@ -0,0 +1,116 @@ +# Как проходить собеседование? + +Прежде всего, конечно, на него не нужно опаздывать. В случае оффлайна стоит прийти немного заранее, оглядеться, привыкнуть к атмосфере и настроиться на нужный лад. Требований по дресс-коду обычно нет, стоит просто быть опрятным и ориентироваться на “среднюю температуру по больнице” (району), т.е. не идти в Москва-сити в пляжных шортах и сланцах, так же как и не идти в офис на берегу моря в костюме-тройке, всё остальное приемлемо. + +В случае онлайна так же необходимо быть на связи уже за 5-10 минут до назначенного времени, поздороваться в чате и сообщить что вы онлайн, устройства должны быть заряжены, интернет стабилен, микрофон и звук настроены и проверены. Приятное впечатление оставят хороший свет и отсутствие постороннего шума. Внешний вид особого значения не имеет, но сидеть с голым торсом и хлебать борщ не стоит (помните про опрятность и здравый смысл). На фон за вами большинству всё равно, хотя сейчас почти везде можно включить размытие. + +Главное, что нужно сказать о собеседованиях - их нужно проходить. Регулярно. Это отдельный навык, который утрачивается если не практиковать. Не стоит бояться и относиться к ним как к экзамену, вы и сами это поймете на практике. В знаниях это скорее это как калибровка, нахождение ориентира где вы сейчас находитесь и в какую сторону корректировать курс. Прошли, проанализировали, подкачались - повторяете, пока не будет достигнут приемлемый результат. Некоторые советуют и после устройства на работу периодически ходить на собеседования, чтобы держать этот навык в тонусе и ориентироваться в своей ценности на рынке. + +К слову, сейчас можно предварительно потренироваться и на мок-интервью. Основная их цель даже не проверить знания, а помочь преодолеть страх первого собеседования. Посмотреть примеры и узнать как попасть можно в доп. материалах. + +Если вы ищете первую работу, начать ходить на собеседования нужно как можно раньше еще и потому, что никто не задумывается, как долго в реальности может занять процесс поиска работы. Самый сложный поиск работы - именно поиск первого опыта. Сначала нужно будет выбить себе возможность пройти интервью. Цифры примерно такие: 10 откликов на подходящие вакансии или 100 рассылкой = 1 собес. 10 не заваленных собесов = 1 оффер. Принятие решения компанией может занимать пару недель. В некоторых компаниях этапов может быть штук 7. Средне-оптимистичный сценарий предполагает от 2-3 месяцев с нуля до начала работы, но это в случае наличия вокруг выбора и хорошей подготовки у кандидата (а на этот счет тоже многие заблуждаются). В не идеальном случае процесс займет от полугода (и даже год не редкость). + +Основное, что хочется сказать про само собеседование: + +* Узнай всё что можешь о компании, в которую идешь проходить собеседование. +* Не переживай и не накручивай себя. Волнение - стандартная реакция и опытный рекрутер сначала поговорит за жизнь и презентует компанию пока кандидат приходит в себя. +* Не скромничай и не занижай свои навыки. Ты, возможно, 50-й кандидат на этой неделе и еще 100 будет после тебя. Если будешь мяться - про тебя забудут, как только ты закроешь за собой дверь. Здоровая гипербола и немного красок еще никому не мешали. Но никогда не переходи в ложь. + +Потренируйтесь в самопрезентации, записывая себя на видео и пересматривая. Обычно первое, что вас спросят - «расскажите о себе». Основная задача HR - проверить адекватность кандидата, в некоторых случаях еще соответствие определенному заказу из целевой команды (от взглядов до хобби, все что угодно). Помните, что собеседуют в компанию в первую очередь человека (soft skills), а уже потом специалиста (hard skills). Кто-то сравнивает собеседование со свиданием, где за час вы должны понять, подходите ли вы друг другу. Вопросы на этом этапе в основном стандартные, ответы на них лучше расписать заранее, но не заучивать. Заученный ответ обычно выглядит нелепо, а вот сформулировать свои мысли заранее и понять себя бывает полезно. + +Хороший базовый рассказ о себе определит дальнейший ход собеседования, HR будет копать вглубь от заинтересовавших фактов. Кстати, не на все вопросы вы будете знать ответ и это нормально. Одна из задач рекрутера проверить, как вы себя ведете и как отвечаете, когда не знаете ответ или если вопрос максимально глупый. Или вас попробуют заставить сомневаться в заведомо правильном ответе (в этот момент вы вспомните передачу “кто хочет стать миллионером”). Умение адекватно и грамотно отвечать на вопросы и отстаивать свою точку зрения очень важно для тестировщика. + +Еще хороший совет - всё, что вы скажете, может и будет использовано против вас. В том смысле, что не говорите лишнего или того, в чем плаваете, иначе очень быстро закопаетесь в новых вопросах. + +**Вопросы работодателю** + +В конце (хотя бывает и в начале) спрашивает собеседуемый! Помните, что это обоюдный процесс? Они выбирают себе кандидата, но и вы выбираете себе компанию. Немного информации для борьбы со стеснением: для компании найм сотрудника очень затратная затея. В крупных компаниях даже есть бонусы сотрудникам за удачную рекомендацию знакомого в размере тысяч 100 и это в контексте затрат на обычный процесс найма просто копейки. Обе стороны заинтересованы закрыть торги прямо здесь и сейчас, так что не бойтесь задавать вопросы и будьте полноценной второй стороной в этих переговорах. Естественно, что задавать нужно полезные и интересующие вопросы, а не устраивать допрос для галочки. + +**Общие вопросы:** + +* Новая ли это вакансия? Какая проблема решается наймом нового сотрудника? Если не новая, почему ушел предыдущий сотрудник с этого места? +* Схема карьерного роста, матрица компетенций, период и порядок пересмотра з.п., премии? +* Что входит в социальный пакет и когда он предоставляется? +* Условия по испытательному сроку (оплата, возможность сокращения срока, критерии сокращения, задачи); +* Если работа удаленная или частично удаленная - какая техника предоставляется? +* Если офис, то как организовано рабочее место, что в него входит? Опенспейс или кабинет? Кресло/стол, софт/железо, наличие работающей вентиляции, нормальное освещение, кухня со всем необходимым, места для отдыха (груши/диваны) и т.п. +* Как происходит онбординг, прикрепляется ли ментор, с чем к нему можно обращаться? +* Есть ли KPI, что в них входит? +* Как часто бывают переработки и оплачиваются ли они? +* Фиксированы ли начало и окончание рабочего дня? Перерывы, обед? +* Как осуществляется контроль за сотрудниками: есть ли тайм-трекеры, камеры и т. д.? +* Практикуется ли компенсация обучения, заинтересован ли работодатель в сертификации, участии сотрудника в митапах, конференциях и т.п.? +* Наличие корпоративного спортзала? +* Наличие библиотеки с актуальной литературой? + +**Технические моменты:** + +* Методология разработки; +* Для agile периодичность спринтов, размер команды, распределение обязанностей, какие мероприятия проводятся; +* Стек технологий; +* В каком виде сейчас тестирование на проекте, пишут ли разработчики юниты и интеграцию, есть ли какая-то документация (на каком языке), процессы, известные проблемы в процессах, как проходит регрессия; +* Есть ли автоматизация, в каком виде, какие планы в этом направлении; + +**Собеседование в иностранные компании** + +Процесс найма в иностранные компании комплекснее и сложнее, обычно состоит из нескольких собеседований. Возможные трудности: + +* Формальности: соответствие диплома, перевод документов, наличие релевантного опыта и т.п.; +* Языковой барьер. Вашему собеседнику может быть так же трудно, как и вам; +* Разница в теории. При подготовке не следует использовать русскоязычные материалы, разница в некоторых моментах довольно существенна; +* Софт скилы. Уделяется большое внимание взаимодействию с коллегами; +* Культурные особенности. Некоторые ценности и взгляды могут совершенно не очевидным образом быть разными и при этом иметь решающее значение. Здесь нужно целенаправленно читать статьи о найме или релокации в интересующую страну, там упоминаются эти нюансы и особенности. + +Доп. материал: + +* [Общие вопросы рекрутеру](https://docs.google.com/document/d/13iAoqjuMf\_OjSsLnPa7Z7YYuu9z1HRzcyzmZ42HcsAY/edit) +* [Ошибки Junior QA на собеседовании](https://medium.com/@viktoria\_qa/%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-junior-qa-%D0%BD%D0%B0-%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-24fbc7081123) +* [Вопросы для собеседования - от кандидата к работодателю](https://habr.com/ru/post/477354/) +* [Использование метода STAR для успешного прохождения собеседований](https://testengineer.ru/ispolzovanie-metoda-star-dlya-uspeshnogo-prohozhdeniya-sleduyushchego-sobesedovaniya/) +* [Как собеседовать работодателя?](https://habr.com/ru/post/470227/) +* [Level up 2021: как собрать лучшие офферы в ИТ](https://www.youtube.com/watch?v=nCHJ0itnNvU) +* [О чем поговорить на собеседовании с выпускником онлайн-курсов по тестированию](https://habr.com/ru/post/513524/) +* [Как QA найти «ту самую» компанию и стать тимлидом](https://habr.com/ru/company/headzio/blog/529384/) +* [Собеседование для QA: резюме, вопросы на интервью, переговоры о зарплате + полезные ссылки](https://habr.com/ru/company/gms/blog/527916/) +* [Сценарий идеального технического собеседования](https://habr.com/ru/company/mailru/blog/522326/) +* [Собеседование для собеседующих](https://habr.com/ru/post/431514/) +* [Обратное собеседование](https://github.com/kix/reverse-interview/blob/master/README.md) +* [Чек-лист для подготовки к собеседованию на английском](https://www.linkedin.com/pulse/%D1%87%D0%B5%D0%BA-%D0%BB%D0%B8%D1%81%D1%82-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B8-%D0%BA-%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BD%D0%B0-%D0%B0%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%BC-mashtalyar/) +* [Круглый стол «Все грани собеседования»](https://www.youtube.com/watch?v=sx1EluXTUxE) +* [Идеальное собеседование на позицию QA-инженера: как провести / как пройти](https://mymonday.by/karpovich-qaasp-2019) +* [Лайфхаки: как получить больше обратной связи после собеседования](https://habr.com/ru/post/546596/) +* [Оцениваем работодателя на собеседовании. Как понять, что за компания перед тобой?](https://habr.com/ru/company/maxilect/blog/546338/) +* [25 актуальных вопросов работодателю + комментарии разработчика](https://habr.com/ru/company/gms/blog/548016/) +* [Почему вам не дают подробный фидбэк после собеседования](https://habr.com/ru/post/547868/) +* [Страх перед собеседованием: как перестать бояться и начать ходить на интервью](https://javarush.ru/groups/posts/2991-strakh-pered-sobesedovaniem-kak-perestatjh-bojatjhsja-i-nachatjh-khoditjh-na-intervjhju) +* [50 вопросов потенциальному IT-работодателю](https://klever.blog/50-voprosov-potencialnomu-it-rabotodatelyu/) +* [Собеседование QA: лайфхаки и скрипты успеха](https://www.youtube.com/watch?v=vmOK5r4bjRU) +* [Как оценить процессы в компании + комментарии разработчика](https://habr.com/ru/company/gms/blog/555484/) +* [Вы не просите дать вам работу, вы продаете услугу](https://habr.com/ru/company/vdsina/blog/557606/) +* [Как новичку в ИТ-сфере показать HR свои лучшие стороны (поиск работы в ИТ)](https://www.youtube.com/watch?v=gt4u7B2ceLI) +* [Типичные ошибки начинающего QA на собеседовании](https://dou.ua/forums/topic/33943/) +* [Как найти удаленную работу в зарубежной компании. 10 шагов](https://habr.com/ru/company/gms/blog/553290/) +* [Плейлист по подготовке к собеседованиям](https://www.youtube.com/playlist?list=PLvItDmb0sZw9FWMw5YGxq\_j0VurFLy8\_Y) +* [QA-интервью: как решить любую задачу](https://testengineer.ru/qa-sobesedovanie-sovety/) +* [Как легко пройти собеседование. Тактика подготовки и лайфхаки](https://dou.ua/forums/topic/34957/) +* [Как должно проходить собеседование на тестировщика и программиста](https://www.youtube.com/watch?v=epLTrUODLCs) +* [Собеседование QA: вопросы и тестовые задания начинающему тестировщику](https://www.youtube.com/watch?v=vmOK5r4bjRU) +* [Что можно и чего нельзя делать на собеседовании по тестированию](https://testengineer.ru/chto-mozhno-i-chego-nelzya-delat-na-sobesedovanii-po-testirovaniyu/) +* [Говорите о том, что важно для вас](https://t.me/shooandendlessagony/88) +* [Какие вопросы задать работодателю на собеседовании?](https://habr.com/ru/post/655631/) +* [Антисобеседования](https://habr.com/ru/post/417431/) +* [Вольный опус про найм, собеседования и трэш на рынке IT-кадров](https://habr.com/ru/post/414243/) + +Мок-интервью: + +* [Тренировочное собеседование на позицию младшего тестировщика](https://www.youtube.com/watch?v=fLJ1x16MHIc) +* [Мок собеседование на позицию junior тестировщика](https://www.youtube.com/watch?v=oSAIm6frBJA) +* [QAGuild: Мок интервью на позицию Senior QA Automation](https://www.youtube.com/watch?v=KqslEN0tiMM) +* [Тренировочное собеседование junior тестировщика](https://www.youtube.com/watch?v=KZgVzjpHC9I) +* [Podlodka QA Crew - Публичное собеседование QA лида. Алексей Петров, Ольга Артемьева](https://www.youtube.com/watch?v=PBjYqFNfLhw) +* [Плейлист “Собеседования в Andersen”](https://www.youtube.com/playlist?list=PLxGuQSFUcmKGVtwIdJoP51vqGuuPwVkeP) +* [Mock QA Interview for IT Companies with QA Managers](https://www.youtube.com/watch?v=L\_2jiucxOK4) +* [QUALITY ASSURANCE Interview Questions And Answers! (QA Interview Questions)](https://www.youtube.com/watch?v=V3-hVT1oBB8) +* [QAGuild: Мок интервью на позицию Middle QA](https://www.youtube.com/watch?v=893iOnzQXMs) +* [Успешное мок интервью на Senior QA](https://www.youtube.com/watch?v=x\_ztPZc4LEU) +* [Вадим Ксендзов](https://www.youtube.com/channel/UC6hNNlCXv1ZgdGpziNf83RA) diff --git a/faq-dlya-novichkov/kak-sostavit-rezyume.md b/faq-dlya-novichkov/kak-sostavit-rezyume.md new file mode 100644 index 0000000..d9f2acd --- /dev/null +++ b/faq-dlya-novichkov/kak-sostavit-rezyume.md @@ -0,0 +1,47 @@ +# Как составить резюме? + +Кратко о базовых рекомендациях. + +**В каком виде**: + +* Вариант минимум: PDF + расшаренная копия на google-диске. Оформить покрасивее можно [тут](https://www.canva.com/ru\_ru/), [тут](https://novoresume.com/resume-templates) или еще где-то; +* Вариант получше: резюме в LinkedIn (мастхэв!) + в веб-версии на github-pages + PDF. + +**Размер** резюме стажера или джуниора - ровно 1 страница (имеется в виду вариант в файле, а не на площадках). + +**Язык** резюме - русский, если нацелены на компании из РФ с клиентами из РФ (или рекрутерами без знания английского :). В остальных случаях - английский. + +**Шапку** можно оформить без наворотов: Нейтральное фото, по которому вас можно узнать (в т.ч. если распечатать в ч/б), ФИО, на какую позицию претендуете, актуальные контакты, опционально локация. + +**Опыт работы** (любые практические навыки) идет сразу после шапки. Это самая важная часть резюме. Без лишней воды кратко и емко описывается чем конкретно вы занимались. Общее правило - использовать глаголы совершенного вида (сделал то, там-то; а делал, участвовал - ничего о вас не говорит), а еще лучше в формате «зона ответственности + достижения». Если занимались учебными проектами или самодеятельностью, то обязательно нужна ссылка на github с артефактами. Написать можно всё что угодно, а вот пруфы прикладывают немногие. + +**Навыки и технологии**. С чем работали, что умеете. Никогда не используйте банальные ключевые навыки «ответственный, целеустремленный, …». Только конкретика. Помните, что HR часто ищут по ключевым словам, а вы не должны раздувать ваше резюме всяким мусором. Технологии, инструменты - хороший выбор. Но будьте готовы, что вас по ним детально будут спрашивать в первую очередь. Не забудьте упомянуть знание иностранных языков. Сориентироваться поможет: [раз](https://www.cambridgeenglish.org/test-your-english/), [два](https://play.google.com/store/apps/details?id=com.englishscore), [три](https://www.efset.org/ru/ef-set-50/), [четыре](https://training.by/#!/Training/3101?lang=ru). Владение технологиями также нужно доказать артефактами в гитхабе (коллекции из постмана, экспорт из TMS/BTS, код и т.п.). + +**Образование и самообразование**. Университет, курсы, книги и т.п. Кратко и по существу. От свежего к старому. + +**Раздел «О себе»** можно включить, если есть что важного и интересного написать, опять же, коротко и если есть чем выделиться. + +При отклике на вакансию встает вопрос о сопроводительном письме. Чаще всего их всё-таки читают, но не надо их писать просто для галочки, это сразу бросается в глаза и идет в минус. Тут лучше поступать аналогично с разделом “О себе” - пишите только если это действительно нужно, т.е. вы ознакомились с информацией о компании, вам есть чем выделиться среди других кандидатов и вы точно можете описать какие ваши навыки и как пригодятся бизнесу нанимателя. Для компании найм джуна это очень дорого и хорошо если кандидат начнет окупаться после полугода в штате, поэтому разговор с работодателем на понятном ему языке доход/расход может вас выделить из серой массы. + +Вообще на тему составления резюме в IT есть миллион статей ([пример](https://hurma.work/rf/blog/idealnoe-rezyume-kandidata-mif-ili-realnost-2/)) и видео на youtube, да и не стоит исключать фактор личных пристрастий нанимателя, так что следует просто следовать базовым рекомендациям и периодически корректировать в зависимости от результатов, а если всё плохо, то можно скинуть итоговый вариант на оценку в коммьюнити. + +Насчет самих откликов, тут на мой взгляд уместна аналогия с холодными звонками, т.е. не нужно на начальном этапе выбирать место работы так, будто у вас лишь один шанс и вы собираетесь в ней состариться. Вообще слать резюме стоит не только откликаясь на вакансии. Есть мнение, что когда компания выкинула вакансию на работные сайты, это уже тупик (т.к. не нашли кандидата по своим каналам). Шлите на почты IT-компаний, HR-ов, расширяйте сеть контактов в linkedin и т.п.. Слышал, что активные джуны рассылали по несколько сотен писем в неделю. Стоит ли говорить, что они быстро нашли свою первую работу? + +Дополнительно я бы посоветовал ознакомиться с разными типами компаний. Работа в инхаус и аутсорс заметно отличается и помимо просто понимания, куда бы вам больше хотелось, преимуществом будет знать, как подогнать резюме и отклик под конкретный тип. + +Доп. материал: + +* [Идеальное резюме кандидата: миф или реальность](https://hurma.work/rf/blog/idealnoe-rezyume-kandidata-mif-ili-realnost-2/) +* [Что писать в резюме, если нет опыта работы](https://habr.com/ru/post/470684/) +* [Инхаус, фриланс, аутсорс компания: куда приземлиться тестировщику, чтобы не разлюбить профессию и расти как на дрожжах](https://habr.com/ru/post/542952/) +* [Аутсорсинг или продуктовая компания для тестировщика (QA)](https://www.youtube.com/watch?v=UPEytnAiqtk) +* [Как составить резюме на английском для иностранной компании](https://habr.com/ru/company/yandex\_praktikum/blog/545418/) +* [Резюме для тестировщика. Структура, оформление, рекомендации](https://www.youtube.com/watch?v=tOUFyzeslvE) +* [Разбор резюме тестировщика (QA) / Ответы на вопросы](https://www.youtube.com/watch?v=xrLydVVkNDE) +* [Как написать классное резюме и получить работу в тестировании? (обработанная версия)](https://www.youtube.com/watch?v=OCupdpk4nf8) +* [Как составить резюме тестировщика ? Обзор, примеры, советы](https://www.youtube.com/watch?v=9zVK776K7MQ) +* [Топ-5 ошибок в резюме junior тестировщика. Как улучшить свое резюме](https://www.youtube.com/watch?v=PznWqzCGmtY) +* [Советы по составлению резюме для новичка](https://testengineer.ru/sovety-po-sostavleniyu-rezyume-dlya-novichka-v-it/) +* [Разбор резюме тестировщика (QA) 2022](https://www.youtube.com/watch?v=Rw7stX87RHw) +* [Как составить резюме тестировщику](https://medium.com/@a\_tumanenko/%D0%BA%D0%B0%D0%BA-%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D1%83-c47b3b571d00) +* [10 глупых вопросов рекрутеру](https://telegra.ph/10-glupyh-voprosov-rekruteru-03-21) diff --git a/faq-dlya-novichkov/kak-vzaimodeistvovat-s-kollegami.md b/faq-dlya-novichkov/kak-vzaimodeistvovat-s-kollegami.md new file mode 100644 index 0000000..c3e453c --- /dev/null +++ b/faq-dlya-novichkov/kak-vzaimodeistvovat-s-kollegami.md @@ -0,0 +1,71 @@ +# Как взаимодействовать с коллегами? + +**Как правильно задавать вопросы?** + +В чатах, коллегам, на форумах, где угодно: + +* в случае общественных чатов убедитесь, что ответа нет в описании канала или в закрепленном сообщении, а также что ваш вопрос уже не задавали раньше (99% задавали). Проверьте поиском по истории сообщений; +* прочитайте внимательно [https://nometa.xyz/](https://nometa.xyz); +* убедитесь, что вы потратили уже достаточно времени в гугле и у вас ничего не вышло; +* сформулируйте вопрос со всем контекстом, чтобы любой человек мог не напрягаясь его понять; +* опишите все ваши действия и результаты, в т.ч. не увенчавшиеся успехом; +* сформулируйте предельно ясно и четко с чем вы просите помочь; + +**Как общаться с разработчиками?** + +Нельзя: + +* Не отвлекайте программиста по мелочам. Сначала задайте свой вопрос в мессенджере, либо договоритесь о встрече, если уж очень жаждете личного общения. Я понял это, как только начал программировать сам. Когда вы творите, и кто-то отвлекает вас, требуется много времени и сил, чтобы снова погрузиться в состояние сосредоточения. Такие перерывы нарушают продуктивность. +* Не бойтесь просить о помощи. Вы не можете знать все. Спрашивать - это нормально! Просто убедитесь, что вы поняли ответ, - не задавайте один и тот же вопрос дважды. Главный принцип командной работы при реализации проекта “Мы в одной лодке и всем будет хорошо, если у каждого будет весло.”. Он позволяет двигаться дальше в одном направлении. +* Главное правило QA - никогда не верить словам разработчиков! «Все должно быть хорошо!» или «Я изменил одну строку в коде, это ничего не сломает» - фразы, после которых стоит насторожиться и перепроверить проект. +* Не вините разработчика в ошибке. Не зацикливайтесь на негативе, попытайтесь решить проблему. Позже всей командой обсудим, как избежать того или иного случая в будущем. Никто не идеален. Ошибки неизбежны. Основная цель - иметь возможность быстро отреагировать на проблему и качественно выполнить свою работу. +* Не назначайте конкретного разработчика на дефект. В этом есть аналогия с тем как разработчик закрывает тикет без одобрения QA. Подобное поведение может разозлить +* Не занимайтесь микро менеджментом над разработчиком. «Ты посмотрел багу?», «Как насчет сейчас?», «Когда ты исправишь багу?». Это раздражает, не уменьшая сроки решения проблемы. Поставьте себя на место работника, выполняющего задачи в строгой последовательности. Подобные “пинки” нецелесообразны. +* Не принимайте все близко к сердцу, с “толстой кожей” живется проще. Чрезмерная эмоциональность (негативная) - кратчайший путь к выгоранию. Не позволяйте своим чувствам преобладать над здравым смыслом. В любой момент времени на вашем пути могут попасться высокомерные люди, которых придется терпеть, выполняя при этом поставленные цели и задачи. Правило применимо относительно любого специалиста. “Толстая кожа” столь же необходима, как и тактичность. + +Правильно: + +* Обмен знаниями с разработчиками. Сообщите им о своих подходах к тестированию, найдите «access\_key» для каждого разработчика, с которым вам приходится работать. Расскажите о том, как вы собираетесь тестировать продукт. Это поможет избежать некоторых ошибок в коде. Однако такое взаимодействие не всегда возможно по нескольким причинам: + * нехватка времени; + * организация процессов внутри компании, не позволяющая этого сделать; + * банальное нежелание разработчика сотрудничать с тестером. +* Если вы все же сможете найти тот самый «access\_key», который упоминался мною выше, - будет гораздо легче поддерживать здоровые отношения и хорошее качество продукта в долгосрочной перспективе. +* Будьте честны. В противном случае это разрушит вашу репутацию. +* Будьте готовы защищать дефекты, о которых сообщаете. Иногда приходится отстаивать критичность дефектов, которые необходимо исправить. Со временем это становится проще, когда вы способны озвучить четкую аргументацию с обоснованием того, почему дефект должен быть исправлен. Корректное формирование фактов и умение видеть на несколько шагов вперед помогает сэкономить деньги компании. +* Сохраняйте хладнокровие под давлением. Я знаю, это тяжело. Когда все торопят тебя или твою команду сложно противостоять авторитетам. Однако говорить «нет» - часть нашей работы, даже если это устраивает далеко не всех. +* Обсудите тестовые кейсы с разработчиком. По моему опыту, это очень сложно сделать. Данный процесс требует много времени и силы воли. Со своей стороны QA в таких “переговорах” должен быть харизматичен и крайне убедителен. Я занимался подобным некоторое время, но так и не смог научиться правильно внедрять данный подход в собственную работу. Однако от таких переговоров с разработчиком есть очевидная польза. Они расширяют спектр мнений и позволяют учитывать кейсы, которые изначально даже не рассматривались, как потенциально перспективные. +* Описывайте дефекты понятно. Говорите на языке разработчика, если можете. В ином случае, старайтесь писать как можно проще. Хорошо описанный баг со всей его информативностью и полнотой погружения в проблему со стороны разработчика будет максимально быстро исправлен. Соответственно, команда QA оперативно приступит к повторному тестированию проблемного участка. +* Поощряйте заинтересованность членов команды в глубоком изучении продукта. Максимальная осведомленность специалиста позволяет минимизировать число глупых дефектов. По моему опыту, такие несущественные ошибки забирают у команды слишком много времени и сил. Лучше предугадать возможные нецелесообразные действия и сосредоточиться на более важных вещах, чем тратить время на описание несущественных дефектов, которых, возможно, вовсе и нет. +* Терпение, только терпение. Научитесь справляться с трудными и самовлюбленными людьми. Это общее правило, применимое к любой сфере, как и в случае с хладнокровием. + +**Как решать конфликты?** + +По действию на функционирование команды, конфликты делятся на деструктивные и конструктивные. Конструктивные (функциональные) конфликты - это продуманные дискуссии, которые возникают из-за того, что члены команды имеют разные точки зрения. Конструктивные конфликты начинаются с открытого общения и ведут к дальнейшей коммуникации и соглашению. Деструктивные (дисфункциональные) конфликты препятствуют эффективному взаимодействию и принятию решений (конкурентные отношения, чувство обиды, плохое настроение и т.д). + +Отличие конфликта в удаленной команде в инструментах. Инструменты в удаленной работе отличаются от тех, которые мы используем обычно в офисе. У нас только удаленные средства связи. Личное и непосредственное взаимодействие сильно ограничено или полностью исключено. Тактика избегания конфликтов, в условиях удаленной работы, весьма соблазнительна. В офисе, когда неприятные разговоры касаются работы, мы можем использовать массу средств для смягчения остроты разговора: например, сходить вместе пообедать, попить кофе. + +Что может спровоцировать конфликт? Средства удаленной связи могут спровоцировать конфликт. А именно потеря невербальных сигналов. Например, одно и то же сообщение может иметь множество интерпретаций. При удаленной коммуникации у нас гораздо меньше возможностей для понимания смысла сказанного. + +Как разрешить конфликтную ситуацию и провести важную беседу? + +* Для начала запланируйте встречу с коллегой на определенное время. +* Во время разговора сформулируйте свою позицию в такой последовательности: + * Озвучьте свое наблюдение: что коллега сделал, что вам не понравилось. + * Выразите словами свои чувства и свою реакцию. + * Выразите словами значимую для вас потребность, которая была проигнорирована. + * Предложите решение или сформулируйте ясный запрос. +* После разговора следует зафиксировать ваши договоренности. + +Источники: + +* [Набор правил для общения между разработчиком и QA инженером](https://habr.com/ru/post/648601/) +* [Как решать конфликты в удаленной команде](https://t.me/qa\_chillout/100) + +Доп. материал: + +* [Коллеги: и не друг, и не враг, а как?](https://habr.com/ru/company/regionsoft/blog/497396/) +* [И жили они долго и счастливо: как QA выстроить плодотворное взаимодействие с dev](https://habr.com/ru/company/ispring/blog/645229/) +* [О конфликтах QA vs Dev, QA vs Product: почему так получается и что с этим делать](https://habr.com/ru/company/skyeng/blog/577010/) +* [Почему разработчики иногда отказываются исправлять баги](https://dou.ua/forums/topic/35024/) +* [Управление конфликтами](https://t.me/general\_it\_talks/204) +* [Как "продать" баг разработчику](https://www.youtube.com/watch?v=wGyAW3l\_SxA) diff --git a/faq-dlya-novichkov/nachalo-raboty-junior-testirovshika.md b/faq-dlya-novichkov/nachalo-raboty-junior-testirovshika.md new file mode 100644 index 0000000..0b86b25 --- /dev/null +++ b/faq-dlya-novichkov/nachalo-raboty-junior-testirovshika.md @@ -0,0 +1,37 @@ +# Начало работы Junior-тестировщика + +Тут снова всё индивидуально и зависит от компании и даже проекта, в частности от типа компании (инхаус, аутсорс, аутстаф), размера штата, процессов и текущих задач. + +**Онбординг** + +* **Один тестировщик**: если вас угораздило быть на первой работе единственным тестировщиком, то скорее всего вас познакомят с коллегами, кофемашиной и расскажут о продукте (а вы уже сами должны знать о нем всё что возможно узнать заранее), после чего сходу бросят на амбразуру искать баги, писать кейсы и попутно будут отвечать на вопросы; +* **Отдел тестирования**: в крупных компаниях обычно есть налаженный процесс онбординга, который начинается с выдачи прав доступа, настройки рабочих учеток и рабочей станции, знакомства с внутренней структурой проекта и компании, ознакомления со стеком технологий и инструментами. К вам прикрепляют ментора и рассказывают к кому и с какими вопросами можно обращаться. + +В любом случае каких-то значимых результатов от новичков первое время никто ждать не будет, обычно есть минимум один “золотой” месяц, когда сотрудника сюсюкают как младенчика на второстепенных задачах, пока тот не вольется в работу, так что не накручивайте себя заранее. + +**Первые задачи** + +* **Один тестировщик**: В нормальной ситуации вы проведете исследовательское тестирование, составите несколько наборов кейсов или чеклистов, задокументируете все текущие баги и в дальнейшем будете заниматься тестированием новых сборок, проверкой исправления найденных дефектов и проведением регрессии; +* **Отдел тестирования**: Вам назначат посильные, но, вероятно, рутинные задачи, вроде регрессии, актуализации артефактов и т.п. + +**Советы единственному джуну тестировщику** + +Вообще создавать отдел тестирования нанимают QA Lead, а если вы джун без опыта работы, то либо работодатель не понимает что делает, либо у него есть вполне конкретная “боль”, которую он с помощью тестировщика хочет решить, в таком случае проводить целое расследование не придется - наверняка все объяснят еще на собеседовании. + +Начинать знакомство с проектом лучше с интервью. Станьте журналистом. Что из себя представляет структура организации, а именно кто над кем стоит и кто за что отвечает? Где больше всего багов, каким видят тестирование сейчас и какие ожидания в будущем? Оцените зрелость процессов по CMM и TMM, зрелость проекта (новый/старый-зрелый/старые-зрелые где будут глобальные изменения) и команды, определите методологию разработки. Соберите метрики, подбейте статистику, подумайте как на эту статистику можно повлиять. Проведите вводную лекцию команде: что такое QA, как оно может помочь, с какими проблемами обращаться и зачем всё это надо. + +Далее в зависимости от всего этого выбирайте в разделе процессов или на просторах интернета вебинар/статью о процессах (можно поинтересоваться опытом коллег в коммьюнити или поискать по истории) и сверяясь с целями компании аккуратно приступайте к внедрению оных. Нужно будет их обдумать и внедрить хотя бы на ключевые моменты: этап составления требований, этап проверки нового функционала перед вливанием в основной, этап регрессии, этап предоставления отчетности. + +Доп. материал: + +* [Welcome on board или по ту сторону оффера](https://habr.com/ru/post/550864/) +* [Введение тестировщика в проект и процесс тестирования](https://www.youtube.com/watch?v=DyeDxg6Olh8) +* [Как выжить на новой работе или онбординг снизу](https://red-foks.medium.com/%D0%BA%D0%B0%D0%BA-%D0%B2%D1%8B%D0%B6%D0%B8%D1%82%D1%8C-%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5-%D0%B8%D0%BB%D0%B8-%D0%BE%D0%BD%D0%B1%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B3-%D1%81%D0%BD%D0%B8%D0%B7%D1%83-8e95c7c4ac0c) +* [Один день из жизни тестировщика (QA Engineer)](https://www.youtube.com/watch?v=KIrbcOdNDZI) +* [Как вырастить джунов - советы бывалых из 2ГИС](https://habr.com/ru/company/2gis/blog/649175/) +* [Как я попала в большую корпорацию: ожидания и реальность](https://habr.com/ru/company/dell\_technologies/blog/583064/) +* [Один тестировщик на проекте - Советы по организации работы](https://www.youtube.com/watch?v=yL5TNJsgjkM\&feature=youtu.be) +* [Один тестировщик на проекте - Личный опыт](https://www.youtube.com/watch?v=KkgDW2kRDNo) +* [Тестирование с нуля, или Один в поле - тестировщик](https://habr.com/ru/company/citymobil/blog/589729/) +* [Технический онбординг: тяжело в учении - легко в бою!](https://www.youtube.com/watch?v=tGu5IVlCL8o) +* [11 кругов ада для тех, кому не хватает опыта на новой работе](https://habr.com/ru/post/414471/) diff --git a/faq-dlya-novichkov/oshibki-v-rabote-u-nachinayushikh-testirovshikov.md b/faq-dlya-novichkov/oshibki-v-rabote-u-nachinayushikh-testirovshikov.md new file mode 100644 index 0000000..4054870 --- /dev/null +++ b/faq-dlya-novichkov/oshibki-v-rabote-u-nachinayushikh-testirovshikov.md @@ -0,0 +1,32 @@ +# Ошибки в работе у начинающих тестировщиков + +* Во всем видят дефекты. Как избежать: + * Внимательно анализировать требования + * Владеть информацией о том, как должен работать продукт + * Если сомневаешься, что это дефект - спроси БА или ответственного + * Несколько раз перепроверь прежде чем регистрировать дефект +* Пытаются сразу все сломать. Как избежать: + * Начинать тестирование только с положительных тестов + * Акцентировать внимание на том, что в приоритете для заказчика + * Не проверять редкие сценарии в первую очередь +* Боятся задавать вопросы. Как избежать: + * Начать понимать, что коммуникация это важная и неотъемлемая часть работы +* Не интересуются, кто и за что отвечает, как устроены процессы. Как избежать: + * Узнать у ПМ об областях ответственности каждого члена команды + * Узнать у ПМ о всех процессах на проекте +* Паникуют при малейшей трудности. Как избежать: + * Без паники, п. 3 и 4 помогут разобраться +* Пытаются применить сразу все, что изучили. Как избежать: + * Помнить, что у каждого вида тестирования своя цель + * Бюджет всегда ограничен, расставлять приоритеты +* Задают один и тот же вопрос несколько раз. + +Доп. материал: + +* [Шесть тест-персон, с которыми не стоит иметь дела](https://telegra.ph/SHest-test-person-s-kotorymi-ne-stoit-imet-dela-01-02) +* [Лучше не знать и спросить, чем притворяться, что знаешь, или Шесть подсказок новичку в тестировании](https://ru.hexlet.io/blog/posts/shest-podskazok-novichku-v-testirovanii) +* [Мои 3 ошибки, которые я совершала как junior QA engineer](https://abilmazhinova.medium.com/%D0%BC%D0%BE%D0%B8-3-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D1%8F-%D1%81%D0%BE%D0%B2%D0%B5%D1%80%D1%88%D0%B0%D0%BB%D0%B0-%D0%BA%D0%B0%D0%BA-junior-qa-engineer-10290234e949) +* [7 QA-шных грехов, которые помогут или помешают тестировщику (стать тем, кем ты хочешь)](https://habr.com/ru/company/skyeng/blog/558656/) +* [Сегодня - трейни, а завтра - сеньор. Что может быть не так с самооценкой у новичков](https://habr.com/ru/company/nix/blog/557238/) +* [ТОП-10 ошибок тестировщиков, что приводят к блокерам](https://zen.yandex.ru/media/id/5e5822dfab3f5c1a51912a0f/top10-oshibok-testirovscikov-chto-privodiat-k-blokeram-611e8b4a271b2c7f7793431d) +* [Как решать сложные (технические) проблемы?](https://habr.com/ru/company/itelma/blog/554746/) diff --git a/faq-dlya-novichkov/otvety-na-samye-populyarnye-voprosy-novichkov-v-chatakh.md b/faq-dlya-novichkov/otvety-na-samye-populyarnye-voprosy-novichkov-v-chatakh.md new file mode 100644 index 0000000..69e12e3 --- /dev/null +++ b/faq-dlya-novichkov/otvety-na-samye-populyarnye-voprosy-novichkov-v-chatakh.md @@ -0,0 +1,118 @@ +# Ответы на самые популярные вопросы новичков в чатах + +**Хочу войти в айти (в разработку) через тестирование, хороший план?** + +Это работало несколько лет назад, потому что тогда к новичкам-тестировщикам могло вообще не быть никаких требований кроме здравомыслия, но общий технический уровень в индустрии сильно вырос, а после эпидемии и агрессивной рекламы работы в IT со стороны “обучающих” компаний появились тысячи выпускников курсов по тестированию, так что этого “легкого пути вкатиться в айтишечку” уже нет и не будет и не нужно вестись на рекламу этих инфоцыган. Конкурс на одно место на удаленку может доходить до нескольких сотен человек. Конечно, в разработке тоже конкуренции поприбавилось, но если вы нацелены стать программистом, то никакие вхождения через другие специальности не имеют ни малейшего смысла - тестирование и разработка - разные профессии и опыт работы джуниор тестировщиком вам практически ничем не пригодится, вы лишь потратите время на подготовку к собеседованиям (а требования теперь весьма высокие), а потом еще на переобучение непосредственно той специальности, куда хотели изначально, т.к. опыт по сути не релевантен и спрашивать будут с нуля. Кейс перехода из тестирования в разработку (впрочем как и наоборот) встречается только у опытных специалистов и по совсем другим причинам. + +Если же говорить просто о желании работать где-нибудь, лишь бы в сфере информационных технологий, то тяп-ляп быстренько прочитать пару книжек и сразу устроиться чтобы получать много денег тут не прокатит. Стоит изучить огромный перечень специальностей и понять для себя, что из этого ближе и развиваться сразу в нужном направлении, как бы невозможно это ни казалось. + +Доп. материал: + +* [Как войти в айти через тестирование](https://youtu.be/Cc2biin9304?t=11497) +* [Мифы о тестировании #2 / О чем не говорят на курсах по тестированию / Правда о работе в IT](https://www.youtube.com/watch?v=qiCjqqtWP7I\&t=31s) +* [Мифы и легенды о тестировании](https://habr.com/ru/post/647701/) +* [Почему профессия QA сложная и интересная, а не только простой «вход в IT»](https://dou.ua/forums/topic/33947/) +* [Why I Love Software Testing](https://jarbon.medium.com/why-i-love-software-testing-ec23d5037dab) +* [Программирование - это сложно](https://habr.com/ru/company/vdsina/blog/551302/) +* [Распространенные поисковые запросы, часть 6: "Легко ли тестировать?"](https://software-testing.ru/library/testing/general-testing/3636-6-is-software-testing-easy) +* [10 причин почему тестировщики увольняются](https://www.youtube.com/watch?v=jgqKLw8YAd4) +* [На пути в IT: легко ли стать тестировщиком?](https://habr.com/ru/company/e-legion/blog/574856/) +* [4 страха, мешающие стать тестировщиком в международной компании](https://habr.com/ru/company/dell\_technologies/blog/599523/) +* [Бесплатный курс профориентации в IT](https://practicum.yandex.ru/career-advisor/) +* [Каково быть тестировщиком: 4 истории о боли и радости](https://habr.com/ru/company/skypro/blog/649349/) +* [Как зарабатывать миллион в IT если ты раздолбай без образования. Фил Ранжин - Как мы попали в IT](https://www.youtube.com/watch?v=N-IFG8gD7Gg) + +**Хочу зарабатывать много денег, мне сюда?** + +Первые зарплаты будут небольшими (особенно учитывая конкурс на места), а подняться выше по карьерной лестнице без искреннего интереса не получится, тестирование - слишком обширная область знаний. Без внутренней мотивации к ежедневному самообучению не получится зарабатывать больше чем в любой другой профессии на старте. Так что сферу деятельности стоит менять только если вы всю жизнь чувствовали, что занимаетесь не тем, а тут ёкнуло и хочется взахлеб осваивать именно тестирование. Но даже в этих случаях нужно понимать, что тестирование - не рекордсмен по зарплатам. Далеко не всем компаниям требуются эксперты тестировщики, как это может быть в случае с разработчиками. Именно по этой причине существует отток уже проработавших какое-то время в тестировании специалистов, в другие направления: менеджмент, чистая автоматизация, разработка. Фактически они просто не смогли найти дальнейшие пути развития своих навыков или спрос на свои навыки в текущем рынке при желаемых условиях. Соответственно и зарплаты здесь в среднем ниже, чем на многих специальностях в IT. + +Доп. материал: + +* Статистика зарплат: [Россия](https://career.habr.com/salaries), [Украина](https://jobs.dou.ua/salaries/), [Беларусь](https://salaries.dev.by) +* [Сколько зарабатывают тестировщики в Европе?](https://www.youtube.com/watch?v=Cbhp1rDRLE0) +* [Зарплати українських тестувальників - зима 2022](https://dou.ua/lenta/articles/salary-report-qa-winter-2022/) +* [Зарплаты айтишников во втором полугодии 2021 (РФ)](https://habr.com/ru/article/649423/) +* [glassdoor](https://www.glassdoor.com/Salaries/index.htm) +* [djinni](https://djinni.co/salaries/) +* [levels.fyi](https://www.levels.fyi) +* [Зарплаты тестировщиков](https://www.youtube.com/watch?v=qk44Mr8Qg\_Y) +* [Начальная зарплата QA в США. Работа в Америке. Как стать тестировщиком?](https://www.youtube.com/watch?v=nA0k9QlC5RA) +* [Тред про зарплаты в айти и их формирование](https://twitter.com/annmuor/status/1446846723591217155?s=) +* [Почему все «прутся» в IT](https://habr.com/ru/company/headzio/blog/593987/) +* [Why Experience Is More Important Than Money Early in Your Career](https://betterprogramming.pub/why-experience-is-more-important-than-money-early-in-your-career-6527219f3915) +* [Сколько стоят тестировщики и от чего зависят их зарплаты? Строим портрет успешного QA-специалиста](https://habr.com/ru/post/446650/) +* [Детальный разбор структуры зарплат IT-специалистов в Кремниевой Долине](https://habr.com/ru/post/512598/) + +**Мне 30/40/50, кому-то нужен такой старик в команде?** + +Хорошая новость в том, что на возраст в IT чаще не смотрят. Безусловно, есть и молодые команды, куда возрастной коллега не впишется. Но в это же время существуют множество других команд, где возраст нового коллеги не имеет значения. Другой вопрос в том, можете ли вы: + +* поспеть в обучении за вчерашними студентами; +* подчиняться 25-летнему руководителю; +* понять, что работодателю не нужен “дед”, который будет учить его и команду жизни. + +Можно поискать по истории сообщений в QA-сообществах телеграма, там этот вопрос неоднократно поднимался и там же есть истории смены сферы деятельности и успешного трудоустройства и в 40+ и в 50+. + +Доп. материал: + +* [Беда “войти в айти” или курсы тестировщика отзывы: Сэм Канер о входящих после 40 и не только](https://habr.com/ru/post/647611/) +* [Джуном? в 40 лет? Ещё и на удаленку? Да ну, не выдумывайте…](https://habr.com/ru/post/548606/) +* [Как стать ТЕСТИРОВЩИКОМ в 45 лет ? Плюсы и Минусы работы в QA](https://www.youtube.com/watch?v=vvGn0BDBpyc) +* [В тестировщики после 40 лет - плюсы в смене профессии, обучении. Мотивация.](https://www.youtube.com/watch?v=jP9IQX-iKbo) + +**Хочу работать удаленно джуном, это возможно?** + +Плохая новость в том, что шансы устроиться на удаленку специалисту без опыта сами по себе довольно низкие - высокая конкуренция, к тому же компании охотнее берут начинающих в офис (так эффективнее обучать). Поэтому попробовать, конечно, стоит, но рассчитывать на это особо не нужно. Да и начинающему действительно продуктивнее находиться в офисе вместе со всей командой, в гуще событий. + +Если говорить о работе на иностранные компании, то тут без вариантов. По законодательству обычно нанять могут только серьезных специалистов. + +**Обязательно ли прохождение курсов для дальнейшего трудоустройства?** + +Совершенно нет. Безусловно, у _хороших_ курсов есть преимущества: + +* Педагогический дизайн, последовательность и структурированность; +* Личный опыт преподавателей и примеры из практики; +* Свой тестовый проект для практики, дающий похожий опыт с реальным (или хотя бы просто задания, которые проверяет опытный наставник); +* Сообщество одногруппников; +* Выход из зоны комфорта: вы участник процесса, вы потратили кучу денег на курс; +* Меньше time-to-market. + +Однако, вся теория есть в свободном доступе в десятках различных вариантов изложения и форматах, а за громкими рекламными лозунгами курсов может стоять записанная на видео посредственная информация и обучение без участия опытных наставников. Даже некоторым джунам порой поступают предложения подрабатывать преподавателями в популярных инфоцыганских “школах”. + +Работодателя сертификат таких курсов может наоборот отпугнуть. Сертификат хороших курсов сам по себе вам также не сильно поможет, т.к. спрашивать на собеседовании всех будут одинаково. И уж тем более ни один курс вам не гарантирует автоматическое трудоустройство, даже если это якобы прописано в договоре. Также стоит понимать, что далеко не все в итоге заканчивают курс, судя по тому, что видел лично я, это лишь около 20% участников. + +Весомая часть людей в профессии - самоучки. Если уверены в своей способности самостоятельно обучаться и на это есть время, то дерзайте. + +Доп. материал: + +* Беда “войти в айти” или курсы тестировщика отзывы [часть 0](https://habr.com/ru/post/588360/), [1](https://habr.com/ru/post/588376/), [2](https://habr.com/ru/post/589973/), [3](https://habr.com/ru/post/590249/) +* [Об онлайн-образовании](https://t.me/yetanotherqa/117) + +**У меня нет высшего образования или я гуманитарий, всё пропало?** + +Зависит от требований нанимателя, но в большинстве случаев само наличие диплома никому не интересно, т.к. это ещё ни о чем не говорит (разве что есть какие-то достижения за время учёбы). Обычно такое требование можно увидеть только в вакансиях крупных компаний, да и то на деле оно чаще оказывается не обязательным. Не-техническая же специализация может оказаться вполне полезной, потому как бухгалтеров-экономистов охотно возьмут тестировать финтех, медиков соответственно медицинское ПО и т.д., а диплом переводчика вообще открывает некоторые двери автоматически. + +Доп. материал: + +* [Чтоб стать тестером и программистом нужен диплом?](https://www.youtube.com/watch?v=fqE2vvezQxI) + +**Я всю жизнь работал %название должности%, это может как-то пригодиться в тестировании?** + +По аналогии со сказанным выше, потенциально почти любой опыт можно как-то использовать в тестировании. Если говорить о максимально близкой работе, с которой чаще всего и растут сюда, то это техническая поддержка, реже эникеи и начинающие “сисадмины”. + +Доп. материал: + +* [Как я перешла в тестирование](https://habr.com/ru/company/maxilect/blog/562160/) +* [From Support to QA: A Journey in Testing](https://www.softwaretestingnews.co.uk/from-support-to-qa-a-journey-in-testing/) +* [Из РЖД в тестирование QA с нуля. Как войти в айти? Реальная история Стаса](https://www.youtube.com/watch?v=qBX7My4LGZU) + +**У меня старый компьютер, придется купить макбук про для работы?** + +В офисе или на удаленке в приличной компании вас всем обеспечит работодатель. Если же вы сами по себе или просто хотите узнать приемлемую конфигурацию, то для мануального тестировщика ресурсы рабочей машины и операционная система глобального значения не имеют, для комфортной работы ориентируйтесь на последнюю версию ОС, CPU 4 ядра/4 потока с поддержкой виртуализации + SSD + 8Gb RAM - этого хватит для любых задач. Если смотреть на перспективу, то для контейнеров, эмуляторов и всего такого потребуется больше потоков и от 16Gb оперативки. При использовании эмулятора вам пригодится поддержка аппаратного ускорения видео у APU или дискретной видеокарты. + +Доп. материал: + +* Больше ответов на вопросы новичков можно найти, например, [тут](https://www.instagram.com/rusau.qalife/) +* [Плейлист “Карьера в IT”](https://www.youtube.com/playlist?list=PLvItDmb0sZw\_uOoxIR5EIaOkYksdAq7ks) +* [Из грузчика в QA без регистрации и смс](https://habr.com/ru/company/petrovich/blog/582824/) +* [Приключения филологической девы в IT и советы начинающим тестировщикам](https://habr.com/ru/company/quadcode/blog/592615/) diff --git a/faq-dlya-novichkov/perspektivy-professii.md b/faq-dlya-novichkov/perspektivy-professii.md new file mode 100644 index 0000000..1abe6a7 --- /dev/null +++ b/faq-dlya-novichkov/perspektivy-professii.md @@ -0,0 +1,88 @@ +# Перспективы профессии + +Сколько лет еще продержится ручное тестирование? Заменит ли автоматизация мануальщиков? + +**Почему современная разработка нуждается в manual-тестировщиках**: + +1. Существует огромный массив специфических тестов, которые должны быть ручными + +То, что у нас принято называть “пользовательским опытом” (user experience, UI) - самая первая и главная причина, почему в 2021 году необходимо ручное тестирование, и почему оно будет необходимо всегда. Мы все бываем критичны к чужой работе, и разработчики критикуют тестировщиков, и зачастую по делу! Но когда дело касается не функциональности, а впечатлений человека, клиента, то нет и не будет замены человеческому глазу, его внимательности, его склонности замечать приятное. Хотя простые smoke-тесты можно автоматизировать, намного лучше они получаются у людей. Намного быстрее тестировщик прокликает приложение и увидит, готово ли оно к тщательному тестированию, чем это сделают скрипты, добавляя лишний этап. Использовать автотесты здесь не лучшая идея. Потом, только человек способен хорошо проверить, например, нюансы локализации в продукте нацеленном на международный рынок. + +2\. Автоматизированное тестирование - лишь дополнение к ручному + +Автоматизация это помощник человеку, когда он устал или уже не способен сосредоточиться. Автоматизированное тестирование экономит время на рутинные стандартные задачи, а ручное тестирование сосредотачивается на креативных нюансах. Самая правильная автоматизация - это не пытаться копировать поведение стандартного пользователя, а стараться улучшить покрытие продукта тестированием, при помощи автотестов. + +3\. Баги там, где их не ждешь + +Даже когда тестируешь по специальным, продуманным use cases, только люди-тестировщики могут найти баги в неожиданных местах. И это одно из главных преимуществ ручного тестирования. В некоторых проектах большинство багов обнаруживаются исключительно ручными тестировщиками, которые искали “вообще другое”. Автоматизированное тестирование не способно обнаружить ошибки, на которые оно изначально не нацеливалось. + +4\. Люди по умолчанию нацелены на креативность и анализ + +Хотя мы все любим пожаловаться на человеческие ограничения, у нас всегда есть человеческие качества: склонность к анализу и креативу. Скиллы и опыт, которыми обладают тестировщики, помогают им видеть ситуацию в общем. Не бывает замены для человеческой скорости мышления и наших мощнейших аналитических способностей. + +5\. В Agile тестовые скрипты надо постоянно переписывать + +Работа по agile-методологии ведет к постоянным изменениям в интерфейсе и функциональности продукта. И каждый раз нужно переписывать автоматизированные скрипты. Изменения затрагивают также скрипты регрессионного тестирования, так что даже и этот классический пример автоматизации требует обновлений, если это правильный эджайл. Эта трудоемкий процесс требует много времени. + +6\. Автоматизация небольших проектов обходится слишком дорого + +Надо платить за качественный софт для автоматизированного тестирования, а также растут затраты на обслуживание и менеджмент, на написание и переписывание скриптов. Когда это большой продукт и длительный проект, то высокие затраты окупаются. В случае маленьких проектов это огромная трата времени и денег. Когда пытаешься понять потенциальный ROI (возврат вложенных денег) на покупку софта для автоматизации, то необходимо не забывать учитывать и дополнительные “человеко-часы”, связанные с интеграцией софта в проект. + +7\. Автоматизация может “отставать от разработки” + +Существует разница между нашими надеждами, которые мы возлагаем на автоматизацию, и тем, что она реально может дать. С постоянным обновлением скриптов в Agile, очень тяжело удерживать автоматизированное тестирование в одном темпе с разработкой. Нет нужды в автоматическом тестировании багов, которые уже устарели. Хорошая автоматизация начинается сразу, и никогда не “отстает” больше, чем на один спринт. Если у команды нет лишнего ресурса на то чтобы держать автоматизацию в одном темпе с разработкой, то, может быть, лучше и не автоматизировать (если это не большой крупный проект, в котором есть шансы наладить процесс). + +8\. Ручные тестировщики смотрят на продукт как “клиенты” + +Человек учится все время, и делает это - все еще - намного быстрее, чем искусственный интеллект, при всей скорости ИИ в обработке данных. Поскольку люди-тестировщики ведут себя как пользователи, они способны помочь не только с проверкой продукта. Иногда тестировщики могут выступать в роли BA и направлять развитие продукта, исходя из своего опыта его тестирования. Автоматическое тестирование сосредоточено на систематизации сегодняшних знаний, а ручное, исследовательское тестирование определяет вещи, которые будут актуальны завтра. + +9\. Автоматизация не поможет найти ошибки, о которых не знали + +Как уже говорилось в третьем пункте, баги часто находят там, где это не ожидали. Бывают крайне специфические пользовательские сценарии, и бывают вещи, которые может увидеть и устранить только человек. Автоматизированное тестирование никогда не станет альтернативой исследовательского тестирования, которое проводит человек. Ошибки в неожиданных местах могут быть найдены только человеком. + +10\. Правильное тестирование должно быть изменяемым + +Успешное тестирование должно содержать в себе две вещи: повторение и изменение. Автоматизированное тестирование хорошо в процессе постоянного контроля качества, но его недостаточно. Нужно изменять тесты, включать в них кейсы с “рандомными” вещами. Сочетанием “повторения хорошего” и “вариации неизвестного”, обеспечивается полное покрытие продукта. + +11\. Мобильные девайсы: сложные use cases + +Мобильные девайсы, с их огромным парком, с проблемами в совместимости и взаимодействии, очень редко могут быть покрыты автоматизированными скриптами. Например, события выхода из Wi-Fi -покрытия и возвращения туда, одновременный запуск 5-10 приложений, комбинация установленных разрешений на девайсе, получение звонка и SMS - это “непредсказуемо, а значит не-автоматизируемо”. Или например изменение настроек свайпа, или количества одновременных касаний, также может повлиять на мобильные приложения. Понятно, что если нужно качественное мобильное приложение, то без manual-тестировщика не обойдешься. + +12\. Ручное тестирование это больше, чем список pass/fail в стандартном отчете + +Тестирование по списку pass/fail полезная вещь, в компаниях в большей части так тестируют сетевые функции. Но в некоторых сложных проектах не обойтись без более тщательного тестирования. Особенно веб-формы: автоматический скрипт без проблем заполнит форму на странице, но не сможет надежно проверить, сохранятся ли данные, если пользователь ушел со страницы и вернулся. То же и со скоростью передачи: человек явно заметит проблемы со скоростью загрузки или сохранения данных в какой-то части приложения. Скорость это не то, что можно хорошо протестировать автотестами. + +13\. Только ручные тестировщики быстро воспроизведут ошибку, замеченную клиентом + +Рассчитываешь выловить все баги до деплоя? Так никогда не бывает - пользователи будут сообщать о найденных багах. Только manual-тестировщик быстро примет информацию об ошибке, обработает, воспроизведет и сделает баг-репорт для разработчика. Когда тестирование ручное, то время от принятия бага от пользователя до его исправления - самое короткое. + +**Тренды тестирования и перспективные области**: + +* Big Data Testing; +* Internet of Things; +* Artificial Intelligence (AI) and Machine Learning (ML); +* Blockchain Testing; +* QAOps; +* Quality engineering (QE); +* Codeless Automated Testing. + +Источники: + +* [Автоматизированное тестирование НИКОГДА не заменит ручное: вот почему](https://testengineer.ru/ruchnoe-testirovanie-budet-zhit/) + +Доп. материал: + +* [Тестирование в эпоху ИИ](https://habr.com/ru/company/jugru/blog/541334/) +* [Software Testing Trends to Watch 2021](https://hackernoon.com/software-testing-trends-to-watch-2021-733y33ue) +* [Тренды тестирования 2020-2021: правда и мифы](https://habr.com/ru/post/562842/) +* [6 Popular Software Testing Trends Everyone Should Follow](https://hackernoon.com/6-popular-software-testing-trends-everyone-should-follow) +* [Three Steps to the Future](https://www.ben-evans.com/presentations) +* [Code to the Future](https://hackernoon.com/code-to-the-future) +* [Будущее ручного тестирование и главные тренды области: интервью с Артёмом Ерошенко](https://habr.com/ru/company/dins/blog/591317/) +* [Умрет ли тестирование к 2030 году](https://www.youtube.com/watch?v=tZpoGVPkYiE) +* [What the future holds: 5 core QA trends to rule 2022](https://hackernoon.com/what-the-future-holds-5-core-qa-trends-to-rule-2022) +* [QAOps - What is it? Process, Implementation & Benefits](https://www.softwaretestingmaterial.com/qaops/) +* [Top 19 Software Testing Conferences In 2022 (The Best QA Events)](https://www.softwaretestinghelp.com/software-testing-conferences/) +* [AI/ML в автоматизации тестирования программного обеспечения](https://habr.com/ru/post/648621/) +* [QA-тренды в 2022 году](https://telegra.ph/QA-trendy-v-2022-godu-02-03-2) +* [Профессия тестировщик. Востребованность и актуальность](https://www.youtube.com/watch?v=d1t6VzZ6xqM) diff --git a/faq-dlya-novichkov/s-chego-nachat-obuchenie-i-kuda-razvivatsya.md b/faq-dlya-novichkov/s-chego-nachat-obuchenie-i-kuda-razvivatsya.md new file mode 100644 index 0000000..6f32ae8 --- /dev/null +++ b/faq-dlya-novichkov/s-chego-nachat-obuchenie-i-kuda-razvivatsya.md @@ -0,0 +1,46 @@ +# С чего начать обучение и куда развиваться? + +_Уровень 0: базовый курс по Computer Science._ + +Начать нужно с простого ознакомления с тестированием и самый частый совет для этого - книга Романа Савина “Тестирование дот ком”. Воспринимайте ее просто как худ. лит. на 1-2 вечера, т.к. местами она спорная и устаревшая, но простыми словами даст хоть какое-то представление о тестировании. После ознакомления я бы посоветовал выбрать по отзывам в коммьюнити хороший базовый онлайн-курс и пройти его, либо по возможности пойти на офлайн-курсы местной компании с возможностью последующего трудоустройства - это вообще лучший вариант. Если нет возможности, то хорошим выбором будет бесплатная [книга Святослава Куликова “Тестирование программного обеспечения. Базовый курс”](https://svyatoslav.biz/software\_testing\_book\_download/) + бесплатный [курс в дополнение к ней](https://svyatoslav.biz/urls/stc\_online/) и далее уже имея общее представление и понимая азы равномерно восполнять пробелы, подготавливаясь к собеседованиям по требованиям в вакансиях. + +Тестирование - очень широкая область и, хотя базовая теория и не сильно сложная, ее довольно много. В отрыве от практике она плохо усваивается и быстро забывается, вы начинаете путаться. Нужно пытаться как можно быстрее найти применение своим навыкам. Начать стоит с тестирования приложений и сайтов, которыми нравится пользоваться или любых других, а также классики типа тестирования форм, тренировочных сайтов с дефектами специально для тестировщиков и т.п. Отдельно советую действительно вдумываться во все практические примеры до полного понимания и способности решать аналогичные кейсы самостоятельно, просто за факт прочтения деньги платить не будут. Не стоит забывать и о софт скилах (учитесь адекватно общаться с людьми в профильных чатах) и базовой грамотности (смолоду тренируйтесь в составлении тестовых артефактов). + +По мере роста компетенций как можно раньше стоит начать проходить собеседования и пытаться устроиться на любую стажировку, вообще любой вариант, где вы сможете применять знания и указать этот опыт в резюме, т.к. без опыта сейчас найти работу очень трудно. Если нет никаких оффлайн вариантов, как было у меня, можете регистрироваться на краудтестинговых платформах (но зачастую это гиблое дело + многие работодатели игнорируют такой опыт), искать в тг-каналах возможности протестировать какие-то проекты за бесплатно (иногда там ищут волонтеров за опыт) либо придумать такой тестовый проект себе самому - снова взяться тестировать какое-либо приложение или сайт, но теперь делать это близко к тому, будто это ваша реальная работа. То есть чтобы было что потом рассказать и показать результаты (тест-кейсы, баг-репорты и т.п.). Багов хватает в любом популярном приложении/сайте, стоит только поискать, хотя баг-репорты и не главное. Главное показать понимание что и как тестировать. + +Когда вы устроитесь на свою первую работу, спустя некоторые время сможете начать готовиться к дальнейшему развитию и выбору направления, ведь никто не заставляет всю жизнь быть ручным тестировщиком. Вы можете сосредоточиться на mobile/web/desktop платформе, профессионально развиваться в менеджеры или автоматизацию, готовиться к узкой специализации - безопасности или performance и т. д., либо сфокусироваться на подготовке по перспективным направлениям: + +* Big Data Testing; +* Internet of Things; +* Artificial Intelligence (AI) and Machine Learning (ML); +* Blockchain Testing; +* QAOps; +* Quality engineering (QE); +* Codeless Automated Testing. + +Помимо прочего, специалисту, планирующему развиваться профессионально, желательно как можно раньше начать сначала посещать релевантные митапы и конференции, а когда-нибудь и начать выступать в роли докладчика. Также не лишними будут различные сертификации (хотя бы тот же ISTQB разных уровней) если работодатель оплачивает банкет, но вообще istqb если где и смотрят, то на западе и обычно не более чем как небольшой бонус. + +Доп. материал: + +* [Направления развития для Junior QA в рамках процессов тестирования](https://www.youtube.com/watch?v=VUiOtjFVVAU) +* [Как стать тестировщиком с нуля](https://habr.com/ru/company/plarium/blog/561454/) +* [Как учиться, чтобы научиться](https://dou.ua/lenta/columns/how-to-learn/) +* [Где начинающему тестировщику взять опыт для первой QA работы?](https://www.youtube.com/watch?v=3O78nFUEOzc) +* [Где начинающему тестировщику получить первый опыт: проект «Хомячки»](https://habr.com/ru/company/yandex\_praktikum/blog/567470/) +* [Курс тестировщика пройден. А дальше что?](https://habr.com/ru/company/yandex\_praktikum/blog/547280/) +* [Где начинающему тестировщику взять опыт для первой QA работы?](https://www.youtube.com/watch?v=3O78nFUEOzc) +* [Как получить первый опыт работы тестировщиком / Практика для тестировщика](https://www.youtube.com/watch?v=fc9Ho4\_U7cE) +* [Заработок для QA - Практика - Фриланс](https://www.youtube.com/watch?v=3o2AcvlqF6U) +* [Устаревшие концепции тестирования: сертификация](https://telegra.ph/Ustarevshie-koncepcii-testirovaniya-sertifikaciya-06-24) +* [end-to-end discussion of ISTQB Foundation syllabus tutorials](https://www.youtube.com/playlist?list=PLj5VKaW115t1o1hk5ZbNWFr4sW5mBpvmv) +* [Geekhub Podcast: про образование в QA с Артемом Ерошенко и Всеволодом Брекеловым](https://www.youtube.com/watch?v=yY20oeJ42XQ%D0%BC) +* [Разговор тестировщиков среднего возраста об индустрии тестирования 21 века](https://habr.com/ru/company/oleg-bunin/blog/578084/) +* [От тестировщика - к QA инженеру. Советы новичкам](https://habr.com/ru/company/nix/blog/576208/) +* [Как и в чем опытному QA развиваться в профессии - и всегда ли это надо делать?](https://habr.com/ru/company/otus/blog/583312/) +* [Пути развития для тестировщика (QA)](https://www.youtube.com/watch?v=raPrEOBGhcI) +* [Куда расти тестировщику](https://www.youtube.com/watch?v=KdmXv5fpKBA) +* [Карьера QA - возможен ли рост выше уровня Senior, но не в менеджмент](https://www.youtube.com/watch?v=5lEKebxdmmw) +* [Тестировщик на прокачку: как X5 Group обучает SDET-специалистов](https://habr.com/ru/company/X5Group/blog/575576/) +* [SDET: как вырастить и не потерять](https://www.youtube.com/watch?v=PMJYLi\_ePiQ) +* [«Правила роста: от джуниора до CTO», конспект вебинара Фёдора Борщёва](https://habr.com/ru/post/482958/) +* [Учимся читать научные статьи у Эндрю Ына из Стэнфорда](https://habr.com/ru/company/ruvds/blog/510550/) diff --git a/kontakty.md b/kontakty.md new file mode 100644 index 0000000..70961e9 --- /dev/null +++ b/kontakty.md @@ -0,0 +1,24 @@ +# Контакты + +![](https://lh3.googleusercontent.com/8KRJh5XXh\_Ku6RsXqGDd7JF\_1F7upBR3ydHsUEy77DYUB5tmZaGrMqA4\_IBrtuFrt70ybyxdv4FL20gEs8JLuA\_i\_7VkQEHTI6XroF2FoxiNLYg4RwF9cQYIn1CemdZZxoOfeXgO) + +**Автор: Еремеев Владислав** + +[**LinkedIn**](https://www.linkedin.com/in/vladislaveremeev/) **-** [**Telegram**](https://t.me/Vladislav\_Eremeev) + +*** + +_Поскольку проект open-source, каждый может внести посильный вклад в его (и всех читающих) развитие. Смело можете писать, особенно если:_ + +* _нашли ошибку;_ +* _прочитали тему, ничего не поняли и нужно переписать понятнее;_ +* _не нашли то, чего искали;_ +* _в другом месте нашли что-то полезное, чего тут нет и хотите, чтобы это увидели и другие;_ +* _ссылка в доп. материалах не соответствует теме, не содержит чего-то дополнительного или более понятного в плане изложения темы;_ +* _есть аргументированная критика и предложения._ + +_**Отправить анонимное сообщение можно в**_ [_**форме обратной связи**_](https://forms.yandex.ru/u/61e02b48c0332911705c01f8/)_**.**_ + +_**Поблагодарить автора материально можно (видимо теперь только по РФ) переводом на Alfa Bank по номеру +79044121375**_ + +_Удачи в карьере!_ diff --git a/mobilnoe-testirovanie/README.md b/mobilnoe-testirovanie/README.md new file mode 100644 index 0000000..5166eab --- /dev/null +++ b/mobilnoe-testirovanie/README.md @@ -0,0 +1,2 @@ +# Мобильное тестирование + diff --git a/mobilnoe-testirovanie/android-debug-bridge-adb.md b/mobilnoe-testirovanie/android-debug-bridge-adb.md new file mode 100644 index 0000000..a3eb72a --- /dev/null +++ b/mobilnoe-testirovanie/android-debug-bridge-adb.md @@ -0,0 +1,19 @@ +# Android Debug Bridge (ADB) + +Отладочный мост Android - это универсальный инструмент командной строки, включенный в пакет Android SDK Platform-Tools, который позволяет вам взаимодействовать с устройством. Команда adb упрощает выполнение различных действий с устройством, таких как установка и отладка приложений, а также предоставляет доступ к оболочке Unix, которую можно использовать для выполнения различных команд на устройстве. + +Это клиент-серверная программа, состоящая из трех компонентов: + +* Клиент, который отправляет команды. Клиент работает на вашей машине разработки. Вы можете вызвать клиент из терминала командной строки, введя команду adb; +* Демон (adbd), который запускает команды на устройстве. Демон работает как фоновый процесс на каждом устройстве; +* Сервер, который управляет связью между клиентом и демоном. Сервер работает как фоновый процесс на вашей машине разработки. + +Когда вы запускаете клиент adb, клиент сначала проверяет, не запущен ли уже процесс сервера adb. Если нет, он запускает серверный процесс. Когда сервер запускается, он привязывается к локальному TCP-порту 5037 и прослушивает команды, отправленные от клиентов adb - все клиенты adb используют порт 5037 для связи с сервером adb. Затем сервер устанавливает соединения со всеми работающими устройствами. Он находит эмуляторы, сканируя порты с нечетными номерами в диапазоне от 5555 до 5585 - диапазоне, используемом первыми 16 эмуляторами. Когда сервер находит демон adb (adbd), он устанавливает соединение с этим портом. Обратите внимание, что каждый эмулятор использует пару последовательных портов - порт с четным номером для консольных подключений и порт с нечетным номером для подключений adb. + +Источники: + +* [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb) + +Доп. материал: + +* [Android Debug Bridge (adb) - основные команды](https://telegra.ph/Android-Debug-Bridge-adb-10-10) diff --git a/mobilnoe-testirovanie/android-ios-developer-settings.md b/mobilnoe-testirovanie/android-ios-developer-settings.md new file mode 100644 index 0000000..45c23c3 --- /dev/null +++ b/mobilnoe-testirovanie/android-ios-developer-settings.md @@ -0,0 +1,57 @@ +# Android/iOS Developer Settings + +В настройках обеих платформ скрыто меню разработчика с полезными возможностями. + +Информации по меню в iOS почти никакой, нашел лишь упоминание таких пунктов: + +* Energy Diagnostic: измерение энергопотребления; +* Network Link conditioner: изменение скорости сети; +* iAd Developer App Testing: отображение и обновление iAds; +* PassKit Testing: дополнительное логирование. + +**Android developer options**: + +* **Общие (General)**: + * Память (**Memory**): отображение статистики памяти, такой как среднее использование памяти, производительность памяти, общий объем доступной памяти, средний объем используемой памяти, объем свободной памяти и объем памяти, используемый приложениями; + * Сделать отчет об ошибке (**Take bug report**): получите копию текущих файлов журнала устройства, чтобы поделиться с кем-нибудь. Когда вы получите уведомление о том, что отчет об ошибке готов, коснитесь его, чтобы поделиться им; + * Демонстрационный режим UI (**System UI demo mode**): упрощает создание чистых скриншотов за счет отображения стандартной предустановленной панели уведомлений, на которой не отображаются уведомления или предупреждения о низком заряде батареи. “Включить демонстрационный режим” (Enable Demo Mode) позволяет вам изменить внешний вид строки состояния с помощью команд демо-режима adb. Или вы можете использовать “Показать демонстрационный режим” (Show Demo Mode), чтобы скрыть уведомления и отобразить предварительно заданную строку состояния; + * Пароль резервного копирования рабочего стола (**Desktop backup password**): устанавливает пароль резервного копирования, чтобы вы могли использовать команды adb для резервного копирования и восстановления приложений и данных устройства под защитой паролем; + * Бодрствовать (**Stay awake**): экран остается включенным каждый раз, когда устройство подключено; + * Включить журнал отслеживания интерфейса хост-контроллера Bluetooth (HCI) (**Enable Bluetooth Host Controller Interface (HCI) snoop log**): фиксирует все пакеты HCI Bluetooth в файле, хранящемся в /sdcard/btsnoop\_hci.log. Вы можете получить пакеты, а затем использовать такую программу, как Wireshark, для анализа и устранения неполадок с информацией. +* **Отладка (Debugging)**: Параметры отладки предоставляют способы настройки отладки на устройстве и установления связи между устройством и вашим компьютером для разработки. Включите отладку по USB, чтобы ваше устройство Android могло связываться с вашей машиной разработки через Android Debug Bridge (adb). Параметр “Подождать отладчик” (Wait for Debugger) недоступен, пока вы не используете команду “Выбрать приложение для отладки” (Select debug app). Если вы включите “Ожидание отладчика” (Wait for Debugger), выбранное приложение будет ожидать подключения отладчика перед своим выполнением. Другие опции отладки включают следующее: + * Постоянно хранить данные журнала на устройстве (**Store logger data persistently on device**): выберите тип сообщений журнала, которые вы хотите постоянно хранить на устройстве. Параметры отключены, все, все, кроме радио, или только ядро; + * Выберите приложение фиктивного местоположения (**Select mock location app**): используйте этот параметр, чтобы подделать местоположение устройства по GPS. Чтобы использовать эту опцию, загрузите и установите приложение фиктивного местоположения GPS; + * Включить проверку атрибутов представления (**Enable view attribute inspection**): сохраняет информацию об атрибутах представления в переменной-члене mAttributes экземпляра View, чтобы ее можно было использовать для отладки. Вы можете получить доступ к информации об атрибутах через пользовательский интерфейс Layout Inspector (без его включения элемент «Атрибуты» недоступен); + * Включить уровни отладки графического процессора (**Enable GPU debug layers**): включите этот параметр, чтобы разрешить загрузку уровней проверки Vulkan из локального хранилища устройства; +* **Сети (Networking)**: Параметры сети позволяют настраивать параметры Wi-Fi и DHCP. Нажмите “Выбрать конфигурацию USB” (Select USB Configuration), чтобы указать, как компьютер будет идентифицировать устройство. Вы можете настроить устройства только для зарядки, для передачи файлов (MTP), для передачи изображений (PTP), для использования вашего мобильного Интернета на ПК (RNDIS) или для передачи аудио или MIDI файлов. Нажмите “Версия Bluetooth AVRCP” (Bluetooth AVRCP version) и выберите версию профиля, которую вы хотите использовать для управления всем аудио / видео оборудованием Bluetooth, к которому у вашего устройства есть доступ. Чтобы точно настроить воспроизведение звука на устройстве есть следующие параметры: Bluetooth Audio Codec, Bluetooth Audio Sample Range, Bluetooth Audio Bits Per sample, Bluetooth Audio Channel Mode, Bluetooth Audio LDAC Codec. В следующем списке описаны другие способы настройки Wi-Fi и DHCP: + * Сертификация беспроводного дисплея (**Wireless display certification**): включает расширенные средства управления конфигурацией и настройки для сертификации беспроводного дисплея в соответствии со спецификациями, изложенными в Спецификации Wi-Fi дисплея Wi-Fi Alliance. Сертификация распространяется на Android 4.4 (уровень API 19) и выше; + * Включить подробное ведение журнала Wi-Fi (**Enable Wi-Fi verbose logging**): увеличивает уровень ведения журнала Wi-Fi для каждой беспроводной сети (SSID), к которой вы подключаетесь, в соответствии с относительной мощностью принимаемого сигнала (RSSI). Дополнительные сведения о журналах см. В разделе [Запись и просмотр журналов с помощью Logcat](https://developer.android.google.cn/studio/debug/am-logcat). + * Агрессивный переход от Wi-Fi к сотовой сети (**Aggressive Wi-Fi to cellular handover**): при низком уровне сигнала Wi-Fi более эффективно переключает соединение для передачи данных в сотовую сеть; +* **Ввод (Input)**: + * Показывать касания (Show taps), нужно для отображения мест касаний экрана. Под вашим пальцем или стилусом появляется круг, который следует за вами при перемещении по экрану. Касание работает как указатель, когда вы записываете видео на свое устройство; + * Местоположение указателя (Pointer Location), нужно для отображения местоположения указателя (касания) на устройстве с помощью перекрестия. В верхней части экрана появится полоса для отслеживания координат перекрестия. Когда вы перемещаете указатель, координаты на полосе отслеживают положение перекрестия, а путь указателя отображается на экране; +* **Рисование (Drawing)**: Параметры рисования предоставляют визуальные подсказки о пользовательском интерфейсе приложения и о том, как он работает. Включите параметр “Показать границы макета” (Show Layout Bounds), чтобы отображать границы, поля и другие конструкции пользовательского интерфейса вашего приложения на устройстве. Другие опции рисования включают следующее: + * Принудительное направление макета RTL (**Force RTL layout direction**): Принудительное направление макета экрана справа налево (RTL) или слева направо (по умолчанию); + * Масштаб анимации окна (**Window animation scale**): устанавливает скорость воспроизведения анимации окна, чтобы вы могли проверить ее производительность на разных скоростях. Чем меньше масштаб, тем выше скорость; + * Масштаб анимации перехода (**Transition animation scale**): устанавливает скорость воспроизведения анимации перехода, чтобы вы могли проверить ее производительность на разных скоростях. Чем меньше масштаб, тем выше скорость; + * Имитация вторичных дисплеев (**Simulate secondary displays**): создание вторичного дисплея в качестве наложения на устройстве. Это полезно при поддержке дополнительных дисплеев с помощью Presentation API. См. [Дополнительные дисплеи](https://developer.android.google.cn/about/versions/android-4.2#SecondaryDisplays); +* **Аппаратное ускорение рендеринга (Hardware accelerated rendering)**: Параметры аппаратного ускорения рендеринга позволяют оптимизировать ваше приложение для целевых аппаратных платформ за счет использования аппаратных опций, таких как графический процессор, аппаратные уровни и сглаживание мультисэмплов (MSAA). Нажмите “Имитировать цветовое пространство” (Simulate color space), чтобы изменить цветовую схему всего пользовательского интерфейса устройства. Варианты относятся к типам дальтонизма. Возможны следующие варианты: Disabled (без моделируемой цветовой схемы), Monochromacy (черный, белый и серый), Deuteranomaly (красно-зеленый), Protanomaly (красно-зеленый) и Tritanomaly (сине-желтый). Протаномалия относится к красно-зеленой цветовой слепоте со слабостью в красных тонах, а дейтераномалия к красно-зеленой дальтонии со слабостью в зеленых тонах. Если вы делаете снимки экрана в смоделированном цветовом пространстве, они выглядят нормально, как если бы вы не меняли цветовую схему. Вот некоторые другие опции: + * Настроить рендеринг ГПУ (**Set GPU renderer**): измените графический движок Open GL по умолчанию на графический движок Open GL Skia; + * Принудительный рендеринг ГПУ (**Force GPU rendering**): заставляет приложения использовать графический процессор для 2D-рисования, если они были написаны без графического рендеринга по умолчанию; + * Показать обновления ГПУ view (**Show GPU view updates**): отображает любой экранный элемент, нарисованный графическим процессором; + * Отладка перерисовки ГПУ (**Debug GPU overdraw**): отображает цветовую кодировку на вашем устройстве, чтобы вы могли визуализировать, сколько раз один и тот же пиксель был отрисован в одном кадре. Визуализация показывает, где ваше приложение может выполнять больше рендеринга, чем необходимо. Дополнительные сведения см. В разделе [Визуализация перерисовки графического процессора](https://developer.android.google.cn/topic/performance/rendering/inspect-gpu-rendering#debug\_overdraw); + * Отладка непрямоугольных операций обрезки (**Debug non-rectangular clip operations**): отключает область обрезки на холсте для создания необычных (непрямоугольных) областей холста. Обычно область обрезки предотвращает рисование чего-либо за пределами круглой области обрезки; + * Принудительное сглаживание (F**orce 4x MSAA**): включает мультисэмпловое сглаживание (MSAA) в приложениях Open GL ES 2.0; + * Отключить HW-оверлеи (**Disable HW overlays**): использование аппаратного оверлея позволяет каждому приложению, отображающему что-либо на экране, использовать меньше вычислительной мощности. Без наложения приложение разделяет видеопамять и должно постоянно проверять наличие коллизий и отсечения, чтобы отобразить правильное изображение. Проверка использует большую вычислительную мощность; +* **Медиа (Media)**: Включите параметр “Отключить маршрутизацию звука USB” (Disable USB audio routing), чтобы отключить автоматическую маршрутизацию на внешние аудиоустройства, подключенные к компьютеру через порт USB. Автоматическая маршрутизация может мешать работе приложений, поддерживающих USB. В Android 11 и более поздних версиях, когда приложение без разрешения RECORD\_AUDIO использует UsbManager для запроса прямого доступа к USB-аудиоустройству с возможностью захвата звука (например, USB-гарнитуре), появляется предупреждающее сообщение, предлагающее пользователю подтвердить разрешение на использование устройства. Система игнорирует любой параметр «всегда использовать», поэтому пользователь должен подтверждать предупреждение и предоставлять разрешение каждый раз, когда приложение запрашивает доступ. Чтобы избежать такого поведения, ваше приложение должно запросить разрешение RECORD\_AUDIO; +* **Мониторинг (Monitoring)**: Параметры мониторинга предоставляют визуальную информацию о производительности приложения, например о длинном потоке (long thread) и операциях с графическим процессором. Нажмите “Профилировать рендеринг графического процессора” (Profile GPU Rendering), а затем “На экране в виде полос” (On screen as bars), чтобы отобразить визуализацию профилирования графического процессора в виде полос. Для получения дополнительной информации см. [Profile GPU rendering](https://developer.android.google.cn/topic/performance/rendering/inspect-gpu-rendering#profile\_rendering); +* **Приложения (Apps)**: Параметры приложения помогают понять, как ваше приложение работает на целевом устройстве. + * Ограничение фоновых процессов (**Background process limit**), нужно чтобы установить количество процессов, которые могут работать в фоновом режиме одновременно. + * Сбросить ограничение в ShortcutManager (**Reset ShortcutManager rate-limiting**), нужно во время тестирования, чтобы фоновые приложения могли продолжать вызывать shortcut APIs, пока не будет достигнут предел; + * Не сохранять активити (**Don't keep activities**) нужно чтобы увеличить время автономной работы, уничтожая все активити, как только пользователь покидает главное окно активити, либо для тестирования некоторых кейсов. + +Также что-то полезное возможно найдется в инженерном меню, чаще это комбинация _#_#4636#_#_ в звонилке. + +Источники: + +* [Android Developers - Android Studio - User guide - Configure on-device developer options](https://developer.android.google.cn/studio/debug/dev-options.html?hl=en-AU#networking) diff --git a/mobilnoe-testirovanie/arkhitektura-android-application.md b/mobilnoe-testirovanie/arkhitektura-android-application.md new file mode 100644 index 0000000..a405ea8 --- /dev/null +++ b/mobilnoe-testirovanie/arkhitektura-android-application.md @@ -0,0 +1,213 @@ +# Архитектура Android Application + +Приложения для Android можно писать на языках Kotlin, Java и C ++. Инструменты Android SDK компилируют ваш код вместе с любыми файлами данных и ресурсов в **APK** или **Android App Bundle**. + +**Android package**, который представляет собой архивный файл с расширением **.apk**, содержит содержимое приложения Android, которое требуется во время выполнения, и это файл, который устройства под управлением Android используют для установки приложения. + +Пакет [**Android App Bundle**](https://telegra.ph/Android-App-Bundle-12-11), который представляет собой архивный файл с расширением **.aab**, содержит содержимое проекта приложения Android, включая некоторые дополнительные метаданные, которые не требуются во время выполнения. AAB - это формат для публикации в маркете, который нельзя установить на устройствах Android, он откладывает создание APK и подписание на более поздний этап. Например, при распространении вашего приложения через Google Play серверы Google Play генерируют оптимизированные APK-файлы, которые содержат только ресурсы и код, которые требуются конкретному устройству, запрашивающему установку приложения. + +Каждое приложение Android находится в собственной изолированной программной среде безопасности или песочнице (security **sandbox**), защищенной следующими функциями безопасности Android: + +* Операционная система Android - это многопользовательская система Linux, в которой каждое приложение является отдельным пользователем. По умолчанию система назначает каждому приложению уникальный идентификатор пользователя Linux (идентификатор используется только системой и неизвестен приложению); +* Система устанавливает разрешения для всех файлов в приложении, так что только идентификатор пользователя, назначенный этому приложению, может получить к ним доступ; +* У каждого процесса есть собственная виртуальная машина (VM), поэтому код приложения работает изолированно от других приложений; +* По умолчанию каждое приложение работает в собственном процессе Linux. Система Android запускает процесс, когда необходимо выполнить любой из компонентов приложения, а затем завершает процесс, когда он больше не нужен или когда системе необходимо восстановить память для других приложений. + +В системе Android реализован принцип наименьших привилегий. То есть каждое приложение по умолчанию имеет доступ только к тем компонентам, которые необходимы ему для работы, и не более того. Это создает очень безопасную среду, в которой приложение не может получить доступ к частям системы, для которых у него нет разрешения. Однако есть способы для приложения обмениваться данными с другими приложениями и для приложения для доступа к системным службам: + +* Можно организовать два приложения для использования одного и того же идентификатора пользователя Linux, и в этом случае они смогут получить доступ к файлам друг друга. Для экономии системных ресурсов приложения с одним и тем же идентификатором пользователя также могут работать в одном процессе Linux и совместно использовать одну и ту же виртуальную машину; +* Приложения также должны быть подписаны тем же сертификатом. Приложение может запрашивать разрешение на доступ к данным устройства, таким как местоположение устройства, камера и соединение Bluetooth. Пользователь должен явно предоставить эти разрешения. Дополнительные сведения см. В разделе «[Работа с разрешениями системы](https://developer.android.google.cn/guide/topics/permissions/overview)». + +**Компоненты приложения** + +Компоненты приложения являются основными строительными блоками Android приложения. Каждый компонент - это точка входа, через которую система или пользователь могут войти в ваше приложение. Некоторые компоненты зависят от других. Есть четыре разных типа компонентов приложения: + +* Activities; +* Services; +* Broadcast receivers; +* Content providers. + +Каждый тип служит определенной цели и имеет отдельный жизненный цикл, который определяет, как компонент создается и уничтожается. + +Начнем разбираться с таких компонентов, как активити и фрагменты, и рассмотрим кейсы, когда система может прекратить их работу. + +**Активити и фрагменты (activities and fragments)** + +С точки зрения тестировщика, активити можно воспринимать как экран, на котором отображаются элементы. Приложение состоит, как минимум, из одной активити. По сути, активити - это контейнер для UI-компонентов. Если активити - это контейнер, то фрагменты - это UI-компоненты активити. Фрагмент тоже, в свою очередь, является контейнером для UI-компонентов. Есть классная аналогия с браузером (спасибо разработчикам!) для более наглядного представления о том, как между собой связаны активити и фрагменты. Представим, что у нас открыто несколько окон одного браузера. Это несколько **активити** внутри одного приложения. + +![https://hsto.org/r/w1560/files/ff8/2e0/026/ff82e00263a949f4bfcbc4d3393b797b.png](https://hsto.org/r/w1560/files/ff8/2e0/026/ff82e00263a949f4bfcbc4d3393b797b.png) + +Внутри окна может быть открыто несколько вкладок. Это **фрагменты** внутри активити. + +![https://hsto.org/r/w1560/files/354/25a/041/35425a041bdc4969b48c23f2f4371d5a.png](https://hsto.org/r/w1560/files/354/25a/041/35425a041bdc4969b48c23f2f4371d5a.png) + +Фрагменты работают чуть быстрее, чем активити. Но на современных устройствах разница практически неощутима. В зависимости от того, каким образом решается задача, разработчик может написать приложение только на активити или на активити с использованием фрагментов. + +Операционная система при управлении жизненным циклом приложения работает именно с активити приложения. Поэтому пока нас больше всего интересует жизненный цикл активити. + +Пользователи запускают большое количество приложений, а значит, создается много процессов с активити. Каждый запущенный процесс съедает оперативную память устройства, и ее становится все меньше. Но Андроид тщательно следит за процессами и в случае нехватки ресурсов для выполнения более приоритетной работы закрывает те, которые менее приоритетны. Давайте разберемся, в какой момент приложение «уязвимо» к таким решениям системы и как это может повлиять на его работоспособность. + +**Жизненный цикл активити** + +После запуска и до завершения активити всегда пребывает в одном из статусов. В тестировании нам это полезно для понимания потенциально проблемных кейсов и в контексте тестирования прерываний (Interrupt testing): + +* Перед завершением Activity, будут вызваны соответствующие методы жизненного цикла; +* Метод onPause() должен остановить все "слушания" и обновления интерфейса. Метод onStop() должен сохранять данные приложения. И наконец, метод onDestroy() высвободит любые ресурсы, выделенные для Activity; +* Когда пользователь переключается обратно на приложение, которое было прервано системным событием, вызывается метод onResume(). На основе сохраненных данных, могут перерегистрироваться «слушатели» и переключиться обновления интерфейса. + +![https://hsto.org/r/w1560/files/ab4/57a/d45/ab457ad457e543fd9aee442107f5475b.png](https://hsto.org/r/w1560/files/ab4/57a/d45/ab457ad457e543fd9aee442107f5475b.png) + +Жизненный цикл активити представлен следующими состояниями: + +![https://hsto.org/r/w1560/files/487/788/406/487788406b3c4161a10fbe3a59def09c.png](https://hsto.org/r/w1560/files/487/788/406/487788406b3c4161a10fbe3a59def09c.png) + +Теперь приведу примеры. Они покрывают основные кейсы, с которыми мы чаще всего сталкиваемся при тестировании. + +**Первый запуск приложения** + +![https://hsto.org/r/w1560/files/fe3/dee/9c8/fe3dee9c816b451e82a81537b3d15369.png](https://hsto.org/r/w1560/files/fe3/dee/9c8/fe3dee9c816b451e82a81537b3d15369.png) + +При первом запуске приложения создается и загружается главная активити в приложении. + +При переходе в состояние «Resumed» активити доступна для взаимодействия с пользователем. Все замечательно, проблем нет. + +**Переход с первого экрана на второй** + +![https://hsto.org/r/w1560/files/5bb/677/6d5/5bb6776d5a73448faf6386b97e78b47e.png](https://hsto.org/r/w1560/files/5bb/677/6d5/5bb6776d5a73448faf6386b97e78b47e.png) + +* Шаг 1: При переходе с первого экрана на второй активити первого экрана сначала встает на паузу. В этот момент могут выполняться такие действия, как сохранение введенных данных и остановка ресурсоемких операций (например, проигрывание анимаций). Это происходит довольно быстро и неощутимо для пользователя. +* Шаг 2, 3, 4: Запускается активити второго экрана. +* Шаг 5: Останавливается активити первого экрана. Также в случае, если Андроид в этот момент пытается освободить память, активити первого экрана дополнительно может перейти в состояние «Destroyed» (то есть уничтожиться). + +Чтобы лучше понять, что из себя представляет состояние «Paused» давайте представим такую ситуацию: экран, поверх которого появился алерт. Мы не можем с ним взаимодействовать, но в то же время мы его видим. + +**Возврат со второго экрана на первый** + +![https://hsto.org/r/w1560/files/cd0/c2f/73b/cd0c2f73b476475898a7f98438780ff0.png](https://hsto.org/r/w1560/files/cd0/c2f/73b/cd0c2f73b476475898a7f98438780ff0.png) + +При возврате со второго экрана на первый происходит почти то же самое, только первая активити не создается заново. Она подгружается из памяти (если, конечно, не была уничтожена системой). Вторая активити уничтожается после того, как была остановлена, так как она убирается из стека переходов. + +**Сворачивание и выход из приложения** + +![https://hsto.org/r/w1560/files/5dd/874/71b/5dd87471b5894987bee507f11e70dbeb.png](https://hsto.org/r/w1560/files/5dd/874/71b/5dd87471b5894987bee507f11e70dbeb.png) + +При сворачивании приложения (например, по кнопке Home) активити останавливается. + +Важно, чтобы при разворачивании приложения активити корректно восстановилась и данные сохранились. + +На всех экранах стараемся проверять сворачивание-разворачивание приложения. Этот кейс особенно актуален на формах ввода. Согласитесь, будет обидно, если текст письма, который вы так старательно набирали, сотрется при банальном сворачивании приложения. Или форма, состоящая из множества полей, снова станет пустой. + +При выходе из приложения (по аппаратной кнопке назад) помимо шага 1 и шага 2, выполняется шаг 3. Активити уничтожается и при следующем запуске приложения создается заново. + +**Поворот экрана** + +![https://hsto.org/r/w1560/files/3f4/fc4/91c/3f4fc491c78848d3964f72d703392f89.png](https://hsto.org/r/w1560/files/3f4/fc4/91c/3f4fc491c78848d3964f72d703392f89.png) + +Один из значимых случаев, который плодит баги - это поворот экрана. Оказывается, при повороте экрана активити проходит полный жизненный цикл. А именно уничтожается и снова создается. И так при каждом повороте. Поэтому, опять же, проверяем поворот на каждом экране. + +Поддержка горизонтальной ориентации экрана, с одной стороны, позволяет проверить корректность работы всех этапов активити, с другой стороны, значительно увеличивает количество тест-кейсов. + +**Многооконный режим** + +Начиная с Андроида 7 (с Андроида 6 как экспериментальная фича) стал доступен многооконный режим. Пользователи получили возможность видеть сразу несколько приложений на экране одновременно. При этом только то приложение, с которым пользователь сейчас взаимодействует, находится в состоянии «Resumed». Остальные устанавливаются в состояние «Paused». + +**Don’t keep activities (Не сохранять действия)** + +Надо ли проверять полный жизненный цикл активити, если приложение не поддерживает поворот экрана? Конечно, надо. + +Если оперативная память давно не чистилась, ее не очень много, и в параллели с вашим приложением было запущено какое-нибудь ресурсоемкое приложение (например, Pokemon Go), то шанс, что Андроид решит «прибить» процесс с вашей активити при переключении на другое приложение, возрастает. + +Как проверить корректность работы приложения вручную, если оно не поддерживает поворот экрана? Довольно просто: установить галку «don’t keep activities» в настройках разработчика и перезапустить приложение. + +В этом случае эмулируется ситуация, когда памяти не хватает и Андроид уничтожает все активити, с которыми пользователь сейчас не взаимодействует, оставляя только ту, что сейчас активна. + +Это не значит, что галка должна всегда быть включенной при тестировании, но периодически смотреть приложение с опцией «don’t keep activities» полезно, чтобы пользователи со слабыми устройствами не сильно страдали и не ругали нас. + +**Broadcast receiver (широковещательный приемник)** + +Для обработки внешних событий используется компонент Broadcast receiver. Приложение может подписываться на события системы и других приложений. Андроид доставляет событие приложению-подписчику, даже если оно не запущено, и таким образом, может «мотивировать» его запуск. + +При тестировании нам важно понимать, какие ожидаются события и как они обрабатываются. + +Например, в коде заранее было прописано, что приложение ждет сообщение от конкретного номера и имеет доступ к смс. Когда пользователю придет секретный код, то Broadcast receiver получит уведомление и в поле подтверждения операции будет введен смс-код. + +**Сервисы (Services)** + +Еще одна очень важная вещь в Андроиде - это сервисы. Они нужны для выполнения фоновых задач. При этом приложение не обязательно должно быть открыто пользователем в этот момент. + +У сервисов есть несколько режимов работы. Пользователь может видеть, что сервис запущен, а может и совершенно не замечать его. + +Если вы услышали волшебное слово «сервис» от разработчика, не поленитесь, выясните, какую логику работы заложили в него: + +* Что делает сервис и в каком виде проявляет себя? +* Как ведет себя сервис, когда приложение не активно? +* Восстанавливается ли сервис после прерывания (входящего звонка, перезапуска телефона)? + +Тут основной совет при проектировании тестовых сценариев - это обдумать пользовательские кейсы, когда работа сервиса может прерваться или начать конфликтовать с работой другого сервиса. Самые коварные ситуации: когда работа сервиса начинается, а пользователь этого не ждал. В этом случае полезно выяснить, что может спровоцировать запуск сервиса. + +Самые простые и безобидные - это **сервисы без дополнительных параметров**. При ручном тестировании мы чаще всего не замечаем их работу. Например, если нужно отправить данные в систему аналитики, то для этой задачи нередко используют именно такие сервисы. + +Еще один тип сервисов это **sticky-сервисы**. Если работа такого сервиса внезапно завершится, то спустя какое-то время sticky-сервис «возродится». Примечательно, что с каждым разом период до «возрождения» увеличивается, чтобы он меньше мешал работе системы. В некоторых приложениях примером sticky-сервиса может быть скачивание файлов на устройство. Возможно, вы замечали, если в «шторке» сбросить закачку, то спустя какое-то время она может восстановиться и продолжить скачивать файлы. + +Самые важные сервисы - те, работу которых пользователь «ощущает» на себе и она для него важна. Они называются **foreground-сервисы**, и у них обязательно есть нотификация в «шторке», которую пользователь не может закрыть. Система их будет уничтожать в последнюю очередь, так как приоритет у таких сервисов самый высокий. + +Например, музыкальный плеер. Если свернуть приложение и даже закрыть его, то плеер продолжает играть, пока пользователь не поставит его на паузу или не закроет. Или пока другое приложение или система не приостановит его работу. В частности, для музыкального плеера вариантов может быть много: входящий звонок, другое музыкальное приложение, звуковая нотификация. + +Раз речь зашла о музыкальных плеерах, то стоит отметить такое понятие, как аудиофокус. + +**Аудиофокус** + +Представим, что при запуске нескольких аудиоплееров, они все будут играть одновременно. Вряд ли это кому-то понравится. Тут на помощь приходит аудиофокус, который запрашивается приложением у системы. В случае **обычного запроса аудиофокуса** система как бы оповещает все запущенные приложения: «Сейчас другое приложение будет говорить, помолчите, пожалуйста». Забавно, но это происходит именно в формате просьбы. + +Если ваше приложение не очень вежливое, то оно спокойно может проигнорировать запрос. Наша задача - проверять эти ситуации. + +Компромиссный режим запроса аудиофокуса называется «**временным перехватом аудиофокуса**». Это значит, что вашему приложению вернется аудиофокус, когда прервавшее его подаст системе сигнал, что аудиофокус освобожден. + +Еще один вид запроса аудиофокуса - это «**duck**». Он просит остальные приложения не молчать, а уменьшить громкость наполовину пока воспроизводится звук запросившего фокус приложения. Например, такой запрос используется при проигрывании звука нотификации о новом сообщении в мессенджере. + +Тестирование аудиофокуса очень важно, т.к. здесь все завязано на совести разработчиков и система не принимает особого участия в разрешении конфликтов. Ну а если баг все-таки вылезет к пользователям, то не сомневайтесь, они быстро вам об этом сообщат. + +На этом, пожалуй, пока можно закончить. Конечно, есть еще много деталей и нет необходимости учитывать абсолютно все при тестировании. По моему опыту, тестировщику необходимо понимать из чего состоит приложение и как оно работает. Это дает возможность анализировать непростые баги, которые возникают на пересечении бизнес-логики приложения и особенностей работы операционной системы. Особенно если дело касается Андроида. + +**Content providers** + +Поставщик контента управляет общим набором данных приложения, которые вы можете хранить в файловой системе, в базе данных SQLite, в Интернете или в любом другом постоянном хранилище, к которому ваше приложение может получить доступ. Через поставщика содержимого другие приложения могут запрашивать или изменять данные, если поставщик содержимого позволяет это. Например, система Android предоставляет поставщика контента, который управляет контактной информацией пользователя. Таким образом, любое приложение с соответствующими разрешениями может запрашивать поставщика содержимого, например ContactsContract.Data, для чтения и записи информации о конкретном человеке. Заманчиво думать о провайдере контента как о абстракции базы данных, потому что для этого распространенного случая в них встроено множество API и встроенная поддержка. Однако с точки зрения системного дизайна у них другое основное назначение. Для системы поставщик контента - это точка входа в приложение для публикации именованных элементов данных, идентифицированных схемой URI. Таким образом, приложение может решить, как оно хочет сопоставить данные, которые оно содержит, с пространством имен URI, передавая эти URI другим объектам, которые, в свою очередь, могут использовать их для доступа к данным. + +Уникальный аспект системы Android заключается в том, что любое приложение может запускать компонент другого приложения. Например, если вы хотите, чтобы пользователь сделал снимок с помощью камеры устройства, вероятно, есть другое приложение, которое делает это, и ваше приложение может использовать его вместо разработки действия для самостоятельной съемки фотографии. Вам не нужно включать или даже ссылаться на код из приложения камеры. Вместо этого вы можете просто запустить действие в приложении камеры, которое делает снимок. По завершении фотография даже возвращается в ваше приложение, чтобы вы могли ее использовать. Пользователю кажется, что камера на самом деле является частью вашего приложения. + +Когда система запускает компонент, она запускает процесс для этого приложения, если оно еще не запущено, и создает экземпляры классов, необходимых для компонента. Например, если ваше приложение запускает действие в приложении камеры, которое делает снимок, это действие выполняется в процессе, принадлежащем приложению камеры, а не в процессе вашего приложения. Следовательно, в отличие от приложений в большинстве других систем, приложения Android не имеют единой точки входа (нет функции main ()). Поскольку система запускает каждое приложение в отдельном процессе с правами доступа к файлам, которые ограничивают доступ к другим приложениям, ваше приложение не может напрямую активировать компонент из другого приложения. Однако система Android может. Чтобы активировать компонент в другом приложении, доставьте системе сообщение, в котором указывается ваше намерение (**intent**) запустить конкретный компонент. Затем система активирует компонент за вас. + +**Активация компонентов (Activating components)** + +Три из четырех типов компонентов - activities, services, and broadcast receivers - активируются асинхронным сообщением, называемым **intent**. Намерения связывают отдельные компоненты друг с другом во время выполнения. Вы можете думать о них как о мессенджерах, которые запрашивают действие у других компонентов, независимо от того, принадлежит ли компонент вашему приложению или другому. Намерение создается с помощью объекта Intent, который определяет сообщение для активации либо определенного компонента (explicit intent), либо определенного типа компонента (implicit intent). + +**Файл манифеста (The manifest file)** + +Прежде чем система Android сможет запустить компонент приложения, система должна знать, что компонент существует, прочитав файл манифеста приложения AndroidManifest.xml. Ваше приложение должно объявить все свои компоненты в этом файле, который должен находиться в корне каталога проекта приложения. Манифест выполняет ряд функций в дополнение к объявлению компонентов приложения, например: + +* Определяет любые разрешения (user permissions), которые требуются приложению, такие как доступ в Интернет или доступ для чтения к контактам пользователя; +* Объявляет минимальный уровень API, необходимый для приложения, в зависимости от того, какие API использует приложение; +* Объявляет аппаратные и программные функции, используемые или требуемые приложением, такие как камера, службы Bluetooth или сенсорный экран; +* Объявляет библиотеки API, с которыми необходимо связать приложение (кроме API-интерфейсов Android framework), например библиотеку Google Maps. + +**Ресурсы приложения (App resources)** + +Приложение Android состоит из большего, чем просто кода - для него требуются ресурсы, отдельные от исходного кода, такие как изображения, аудиофайлы и все, что связано с визуальным представлением приложения. Например, вы можете определять анимацию, меню, стили, цвета и макет пользовательских интерфейсов действий с помощью файлов XML. Использование ресурсов приложения позволяет легко обновлять различные характеристики вашего приложения без изменения кода. Предоставление наборов альтернативных ресурсов позволяет оптимизировать приложение для различных конфигураций устройств, например для разных языков и размеров экрана. + +Для каждого ресурса, который вы включаете в свой проект Android, инструменты сборки SDK определяют уникальный целочисленный идентификатор, который вы можете использовать для ссылки на ресурс из кода вашего приложения или из других ресурсов, определенных в XML. Например, если ваше приложение содержит файл изображения с именем logo.png (сохраненный в каталоге res / drawable /), инструменты SDK генерируют идентификатор ресурса с именем R.drawable.logo. Этот идентификатор сопоставляется с целым числом для конкретного приложения, которое вы можете использовать для ссылки на изображение и вставки его в свой пользовательский интерфейс. + +Одним из наиболее важных аспектов предоставления ресурсов отдельно от исходного кода является возможность предоставления альтернативных ресурсов для различных конфигураций устройств. Например, определяя строки пользовательского интерфейса в XML, вы можете перевести строки на другие языки и сохранить эти строки в отдельных файлах. Затем Android применяет соответствующие языковые строки к вашему пользовательскому интерфейсу на основе квалификатора языка, который вы добавляете к имени каталога ресурсов (например, res / values-fr / для французских строковых значений) и языковых настроек пользователя. + +Android поддерживает множество различных квалификаторов для ваших альтернативных ресурсов. Квалификатор - это короткая строка, которую вы включаете в имя своих каталогов ресурсов, чтобы определить конфигурацию устройства, для которой следует использовать эти ресурсы. Например, вы должны создать разные макеты для своих занятий в зависимости от ориентации и размера экрана устройства. Когда экран устройства находится в портретной ориентации (высокий), вы можете захотеть, чтобы макет с кнопками был вертикальным, но когда экран находится в альбомной ориентации (широкий), кнопки можно выровнять по горизонтали. Чтобы изменить макет в зависимости от ориентации, вы можете определить два разных макета и применить соответствующий квалификатор к имени каталога каждого макета. Затем система автоматически применяет соответствующий макет в зависимости от текущей ориентации устройства. + +Дополнительные сведения о различных типах ресурсов, которые вы можете включить в свое приложение, и о том, как создавать альтернативные ресурсы для различных конфигураций устройств, см. В разделе «[Предоставление ресурсов](https://developer.android.google.cn/guide/topics/resources/providing-resources)». Чтобы узнать больше о передовых методах разработки и разработке надежных приложений производственного качества, см. [Руководство по архитектуре приложений](https://developer.android.google.cn/jetpack/guide). + +Источники: + +* [Android Developers - Docs - Guides - Application Fundamentals](https://developer.android.google.cn/guide/components/fundamentals?hl=en) +* [Системный подход к тестированию Android-приложений, или О чем молчали разработчики](https://habr.com/ru/company/mobileup/blog/327416/) + +Доп. материал: + +* YaTalks 2021. Mobile: [Современная архитектура android приложений](https://www.youtube.com/watch?v=0AQlKbskhkM\&t=18671s) + [презентация](https://disk.yandex.ru/i/ecrzwwYKTlbkgA) +* [Видео: Урок 23. Жизненный цикл активити (Activity Lifecycle)](https://www.youtube.com/watch?v=vv9w9\_l17z4) diff --git a/mobilnoe-testirovanie/arkhitektura-android-os.md b/mobilnoe-testirovanie/arkhitektura-android-os.md new file mode 100644 index 0000000..ea8c7fa --- /dev/null +++ b/mobilnoe-testirovanie/arkhitektura-android-os.md @@ -0,0 +1,73 @@ +# Архитектура Android OS + +![https://developer.android.com/guide/platform/images/android-stack\_2x.png](https://developer.android.com/guide/platform/images/android-stack\_2x.png) + +**Linux Kernel** + +Данный уровень является базовым в архитектуре Android, так как вся система Android построена на ядре Linux с некоторыми архитектурными изменениями. + +Основные задачи, выполняемые ядром: Ядро содержит в себе драйверы, необходимые для взаимодействия с оборудованием. Например, возьмем Bluetooth. В наше время сложно найти устройство, которое бы не включало в себя эту функцию. Поэтому ядро должно включать драйвер для работы с ним. На схеме выше как раз таки перечислены все драйверы, входящие в ядро Linux, поэтому не будем перечислять их все по отдельности. + +* Power Management - это своего рода система управления питанием. Она предоставляет различные средства, с помощью которых приложение может реагировать на режимы питания устройства, а также поддерживать необходимые компоненты устройства активными. Например, при чтении книги нам было бы удобно, если бы экран оставался постоянно активным. Или когда мы включаем музыку и она продолжает проигрываться в фоне при отключенном экране. +* Управление памятью. При запуске различных приложений ядро гарантирует, что пространство памяти, которое они используют, не конфликтует и не перезаписывает друг друга. Также оно проверяет, что все приложения получают достаточный объем памяти для своей работы, и в то же время следит, чтобы ни одно приложение не занимало слишком много места. +* Управление процессом. Каждое приложение в Android работает в отдельном процессе. Ядро же отвечает за управление этими процессами, а именно за создание, приостановку, остановку, или завершение процессов, за одновременное выполнение нескольких процессов, обмен данными между процессами, запуск процессов в фоновом режиме. Помимо этого ядро распределяет работу между процессорами устройства, что максимизирует производительность устройств с несколькими ядрами. + +**Hardware Abstraction Layer (HAL)** + +HAL обеспечивает связь между драйверами и библиотеками. Состоит он из нескольких библиотечных модулей, каждый из которых реализует интерфейс для определенного аппаратного компонента (Bluetooth, Камера итд.). И когда к оборудованию устройства обращаются через API-интерфейс, загружается необходимый для его работы модуль. + +Если объяснять на пальцах, то когда от приложения поступает какое-либо сообщение, HAL его обрабатывает таким образом, чтобы оно стало понятным для драйверов. И наоборот. + +**Android Runtime (ART)** + +Основным языком Android был выбран Java, поскольку это один из самых популярных языков программирования. Для Java существует много наработок и специалистов, а написанные на нем программы переносимы между операционными системами. + +Но для того, чтобы программа работала на Java необходима виртуальная машина - Java Virtual Machine. В Android используется виртуальная машина Android Runtime (ART). Эта машина специально оптимизирована для работы на мобильных устройствах: с нехваткой памяти, с постоянной выгрузкой и загрузкой приложений и т.д. В версиях Android ниже 5.0 Lollipop, использовалась виртуальная машина Dalvik - старая реализация виртуальной машины для Android. + +В ART, как и в Dalvik, используется свой формат байт-кода - DEX (Dalvik executable). При сборке приложения исходные файлы сначала компилируются в файлы типа class обычным компилятором, а затем конвертируются специальной утилитой в DEX. + +И Dalvik, и ART оптимизируют выполняемый код, используя механизм компиляции just-in-time (JIT) - компиляция происходит во время выполнения приложения, что позволяет оптимизировать код для выполнения на конкретном устройстве. При этом байт-код приложения можно переносить на другие устройства. + +ART может компилировать байт-код заранее, а не во время выполнения, используя ahead-of-time (AOT). Система сама решает, когда и какие приложения необходимо скомпилировать. Например, когда устройство не загружено и подключено к зарядке. При этом ART учитывает информацию о приложении, собранную во время предыдущих запусков, что дает дополнительную оптимизацию. + +**Native C/C++ Libraries** + +Набор библиотек, написанных на языках C или C++ и используемых различными компонентами ОС. + +Примеры библиотек: + +* WebKit - представляет из себя движок веб-браузера и другие связанные с ним функции. +* Media Framework предоставляет медиа кодеки, позволяющие записывать и воспроизводить различные медиа-форматы. +* OpenGL - используется для отображения 2D и 3D графики. +* SQLite - движок базы данных, используемый в Android для хранения данных. + +**Java API Framework (Application Framework)** + +Набор API, написанный на языке Java и предоставляющий разработчикам доступ ко всем функциям ОС Android. Эти API-интерфейсы образуют строительные блоки, необходимые для создания приложений, упрощая повторное использование основных, модульных, системных компонентов и сервисов, таких как: + +* Activity Manager - управляет жизненным циклом приложения и обеспечивает общий навигационный стек обратных вызовов. +* Window Manager - управляет окнами и является абстракцией библиотеки Surface Manager. +* Content Providers - позволяет приложению получать доступ к данным из других приложений или обмениваться собственными данными, т.е. предоставляет механизм для обмена данными между приложениями. +* View System - содержит строительные блоки для создания пользовательского интерфейса приложения (списки, тексты, кнопки итд.), а также управляет событиями элементов пользовательского интерфейса. +* Package Manager - управляет различными видами информации, связанными с пакетами приложений, которые в настоящее время установлены на устройстве. +* Telephony Manager - позволяет приложению использовать возможности телефонии. +* Resource Manager - обеспечивает доступ к таким ресурсам, как локализованные строки, растровые изображения, графика и макеты. +* Location Manager - возможность определения местоположения. +* Notification Manager - отображение уведомлений в строке состояния. + +**System Apps** + +Верхний уровень в архитектуре Android, который включает в себя ряд системных (предустановленных) приложений и тонну других приложений, которые можно скачать с Google Play. + +Системные приложения на всех устройствах разные, но все они являются предустановленными производителями устройства (приложение для SMS-сообщений, календарь, карты, браузер, контакты итд.). + +Этот уровень использует все уровни ниже (если смотреть на схему) для правильного функционирования приложений. + +Источники: + +* [Как работает Android. Архитектура платформы](https://bimlibik.github.io/posts/how-does-android-work/) + [оригинал из офф доки](https://developer.android.com/guide/platform) + +Доп. материал: + +* Более подробный цикл статей “Как работает Android”: часть [1](https://habr.com/ru/company/solarsecurity/blog/334796/), [2](https://habr.com/ru/company/solarsecurity/blog/338292/), [3](https://habr.com/ru/company/solarsecurity/blog/338494/), [4](https://habr.com/ru/company/solarsecurity/blog/427431/) +* [Android's HIDL: Treble in the HAL](https://www.slideshare.net/opersys/androids-hidl-treble-in-the-hal) diff --git a/mobilnoe-testirovanie/arkhitektura-ios-application.md b/mobilnoe-testirovanie/arkhitektura-ios-application.md new file mode 100644 index 0000000..47c5e8e --- /dev/null +++ b/mobilnoe-testirovanie/arkhitektura-ios-application.md @@ -0,0 +1,51 @@ +# Архитектура iOS Application + +Приложения представляют очень сложное взаимодействие между вашим кодом и системными фреймворками. Системный фреймворки предоставляют базовую инфраструктуру, с которой все приложения должны работать, а вы пишете код для настройки этой инфраструктуры. + +Фреймворки iOS основаны на таких шаблонах проектирования, как MVC и делегирование. + +**Жизненный цикл iOS приложения** + +Точкой входа для каждого C-приложения является функция main. Во время запуска UIApplicationMain функция устанавливает несколько ключевых объектов и запускает приложение. Сердцем каждого iOS приложения является объект UIApplication, задача которого - облегчить взаимодействие между системой и другими объектами приложения. Рисунок ниже показывает объекты, обычно встречающиеся в iOS приложениях. А еще ниже представлено описание роли каждого объекта в приложении. Первое что стоит отметить - iOS приложения используют архитектуру Model-View-Controller. Эта архитектура имеет решающее значение для создания приложений, которые могут работать на различных устройствах с различными размерами экрана. + +![https://i1.wp.com/blog.justdev.org/wp-content/uploads/2016/05/core\_objects\_2x.png?ssl=1](https://i1.wp.com/blog.justdev.org/wp-content/uploads/2016/05/core\_objects\_2x.png?ssl=1) + +* Объект UIApplication: UIApplication управляет циклом обработки событий и разными типами поведения приложений высокого уровня. Он также сообщает о ключевые переходах приложения и некоторых специальных событиях (например, входящих уведомлений Push) своему делегату, который представляет собой пользовательский объект. Используйте UIApplication «как есть», без подклассов. +* Объект UIDelegate: App Delegate является сердцем вашего кода. Этот объект работает в связке с объектом UIApplication и служит для обработки инициализации приложения, перехода между состояниями, а также обеспечивает множество событий в приложениях высокого уровня. +* Documents и Data Model Objects: Модель данных может быть специфической для вашего приложения. Пример: банковская база данных и приложения со списком фильмов будут иметь разную модель данных. Приложения могут также использовать объекты Documents (подклассы UIDocuments) для управления моделями данных. Объекты Documents необязательны, но предлагают удобный способ группировать данные в пакетах файлов. +* Объект View Controller: Объект View Controller служит для управления отображением контента вашего приложения на экране. Класс UIViewController является базовым классом для всех объектов View Controller. Он предоставляет функциональные возможности по умолчанию для загрузки представления, показывая их, вращая их в ответ на поворот устройства, а также несколько других стандартных систем поведения. +* Объект UIWindow: Выводит и координирует один или несколько View на экране. Большинство приложений имеют только один Window, в котором представлен весь контент приложения на главном экране. Но могут потребоваться дополнительный Window. Например, для отображения вспомогательных элементов на внешнем экране. +* Объекты View, объекты Controls, объекты Layer: Объекты View обеспечивают визуальное представление содержимого вашего приложения. View является объектом, который рисует содержимое в назначенной прямоугольной области и реагирует на события в пределах этой области. Объекты Controls представляют из себя специальные типы View, отвечающие за реализацию привычных объектов интерфейса: кнопки, текстовые поля, переключатели и т. д. Объекты Layer - это объекты данных, которые представляют из себя визуальный контент. + +Приложение в главном цикле обрабатывает все пользовательские события. Главный цикл работает в главном потоке приложения. На изображении ниже показана схема работы главного цикла. + +![https://i2.wp.com/blog.justdev.org/wp-content/uploads/2016/05/event\_draw\_cycle\_a\_2x.png?ssl=1](https://i2.wp.com/blog.justdev.org/wp-content/uploads/2016/05/event\_draw\_cycle\_a\_2x.png?ssl=1) + +В любой момент времени ваши приложение находятся в каком либо из перечисленных ниже состояний. Система меняет состояния вашего приложения в ответ на происходящие события. Например, когда пользователь нажимает кнопку Home, или поступает входящий вызов, или что либо еще - приложения в ответ на все это меняют свое состояние. + +* Not Running: Приложение не запущено, либо запущенно но прервано системой; +* Inactive: Приложение работает, но в настоящий момент ничего не делает (это может быть связано с выполнением другого кода). Приложение, как правило, остается в этом состоянии очень мало времени и переходит в другое состояние; +* Active: Нормальный обычный режим работы приложения на переднем плане; +* Background: Приложение находится в фоне, но работает. Большинство приложений входят в это состояние на короткое время и позже приостанавливаются. Но если необходимо дополнительное время для работы в бекграунде, приложение может оставаться в этом состоянии; +* Suspended: Приложение работает в фоне, но не выполняет никакой код. Система перемещает приложение в это состояние автоматически и не предупреждает об этом. При условии малого количества памяти, система может не предупреждая закрыть приложения в этом состоянии для освобождения памяти. + +![https://i1.wp.com/blog.justdev.org/wp-content/uploads/2016/05/high\_level\_flow\_2x.png?ssl=1](https://i1.wp.com/blog.justdev.org/wp-content/uploads/2016/05/high\_level\_flow\_2x.png?ssl=1) + +Большинство переходов между состояниями обеспечивается соответствующими методами в AppDelegate. + +Приложение должно быть готово к завершению в любое время. Завершение - это нормальная часть жизненного цикла. Система обычно выключает приложения, для очищения памяти и подготовки к запуску других приложений, которые запущены пользователем, но система также может выключить приложения , которые некорректно или не отвечающим на события своевременно. + +Suspended приложения не получают уведомления о завершении. Система убивает процесс и восстанавливает соответствующую память. Если приложение запущено в фоне и не отвечает, система вызовет applicationWillTerminate: чтобы приложение подготовилось к выключению. Система не вызывает метод когда устройство перезагружается. + +Система создает приложение в основном потоке и вы можете создавать отдельные потоки, если вам это необходимо, для решения каких либо задач. Для приложений iOS, предпочтительным методом является использование Grand Central Dispatch (GCD), оперирующим с объектами, и другими интерфейсами асинхронного программирования не создавая и управляя потоками собственноручно. Такие технологии как GCD позволяют определить работу, которую вы хотите сделать и в каком порядке вы хотите ее сделать, но пусть система решает как лучше выполнить эту работу для CPU. Когда система управляет вашими потоками вам становиться легче писать код, обеспечивается большая корректность кода, а так же увеличивает общую производительность. + +![https://i0.wp.com/blog.justdev.org/wp-content/uploads/2016/05/IOSLifeCycle.png?ssl=1](https://i0.wp.com/blog.justdev.org/wp-content/uploads/2016/05/IOSLifeCycle.png?ssl=1) + +Источники: + +* [Preworking 4: жизненный цикл iOS приложения](https://blog.justdev.org/preworking/preworking-4-ios-app-lifecicle/) + +Доп. материал: + +* [Официальная документация](https://developer.apple.com/documentation/uikit) +* [Общее представление об архитектуре Clean Swift](https://habr.com/ru/post/453986/) diff --git a/mobilnoe-testirovanie/arkhitektura-ios.md b/mobilnoe-testirovanie/arkhitektura-ios.md new file mode 100644 index 0000000..52567eb --- /dev/null +++ b/mobilnoe-testirovanie/arkhitektura-ios.md @@ -0,0 +1,113 @@ +# Архитектура iOS + +Все в курсе, что мобильные девайсы Apple работают под управлением iOS. Многие знают, что iOS представляет собой облегченную версию настольной Mac OS X. Некоторые догадываются, что в основе Mac OS X лежит POSIX-совместимая ОС Darwin, а те, кто всерьез интересуется IT, в курсе, что основа Darwin - это ядро XNU, появившееся на свет в результате слияния микроядра Mach и компонентов ядра FreeBSD. Однако все это голые факты, которые ничего не скажут нам о том, как же на самом деле работает iOS и в чем ее отличия от настольного собрата. + +**Mac OS X** + +Операционная система, установленная сегодня на все маки и (в измененном виде) на айдевайсы, ведет свою историю аж с 1988 года, который в мире IT известен также тем, что стал годом выпуска первой бета-версии операционной системы NeXTSTEP. Сама NeXTSTEP была детищем команды разработчиков Стива Джобса, который к тому времени уже покинул Apple и основал компанию NeXT, которая занялась разработкой компьютеров для образовательных нужд. + +В момент своего появления на свет NeXTSTEP была поистине передовой операционной системой, которая включала в себя множество технологических новаций. В основе ОС лежало модифицированное микроядро Mach, дополненное компонентами ядра FreeBSD, включая эталонную реализацию сетевого стека. Более высокоуровневые компоненты NeXTSTEP были написаны с использованием языка Objective-C и предоставляли разработчикам приложений богатый объектно-ориентированный API. Система была снабжена развитым и весьма удобным графическим интерфейсом (ключевые компоненты которого сохранились в OS X и даже iOS) и мощной средой разработки, включавшей в себя в том числе известный всем современным разработчикам визуальный дизайнер интерфейса. + +После провала NeXT и возвращения Стива Джобса в компанию Apple в 1997 году NeXTSTEP легла в основу проекта Rhapsody, в рамках которого началась разработка системы-наследника Mac OS 9. В 2000 году из Rhapsody был выделен открытый проект Darwin, исходники которого опубликованы под лицензией APSL, а уже в 2001 году появилась на свет OS X 10.0, построенная на его основе. Спустя несколько лет Darwin лег в основу операционной системы для готовящегося к выпуску смартфона, о котором до 2007-го, кроме слухов, не было известно почти ничего. + +**XNU и Darwin** + +Условно начинку OS X / iOS можно разделить на три логических уровня: ядро XNU, слой совместимости со стандартом POSIX (плюс различные системные демоны/сервисы) и слой NeXTSTEP, реализующий графический стек, фреймворк и API приложений. Darwin включает в себя первые два слоя и распространяется свободно, но только в версии для OS X. iOS-вариант, портированный на архитектуру ARM и включающий в себя некоторые доработки, полностью закрыт и распространяется только в составе прошивок для айдевайсов (судя по всему, это защита от портирования iOS на другие устройства). + +По своей сути Darwin - это «голая» UNIX-подобная ОС, которая включает в себя POSIX API, шелл, набор команд и сервисов, минимально необходимых для работы системы в консольном режиме и запуска UNIX-софта. В этом плане он похож на базовую систему FreeBSD или минимальную установку какого-нибудь Arch Linux, которые позволяют запустить консольный UNIX-софт, но не имеют ни графической оболочки, ни всего необходимого для запуска серьезных графических приложений из сред GNOME или KDE. + +Ключевой компонент Darwin - гибридное ядро XNU, основанное, как уже было сказано выше, на ядре Mach и компонентах ядра FreeBSD, таких как планировщик процессов, сетевой стек и виртуальная файловая система (слой VFS). В отличие от Mach и FreeBSD, ядро OS X использует собственный API драйверов, названный I/O Kit и позволяющий писать драйверы на C++, используя объектно-ориентированный подход, сильно упрощающий разработку. + +iOS использует несколько измененную версию XNU, однако в силу того, что ядро iOS закрыто, сказать, что именно изменила Apple, затруднительно. Известно только, что оно собрано с другими опциями компилятора и модифицированным менеджером памяти, который учитывает небольшие объемы оперативки в мобильных устройствах. Во всем остальном это все то же XNU, которое можно найти в виде зашифрованного кеша (ядро + все драйверы/модули) в каталоге /System/Library/Caches/com.apple.kernelcaches/kernelcache на самом устройстве. + +Уровнем выше ядра в Darwin располагается слой UNIX/BSD, включающий в себя набор стандартных библиотек языка си (libc, libmatch, libpthread и так далее), а также инструменты командной строки, набор шеллов (bash, tcsh и ksh) и демонов, таких как launchd и стандартный SSH-сервер. Последний, кстати, можно активировать путем правки файла /System/Library/LaunchDaemons/ssh.plist. Если, конечно, джейлбрейкнуть девайс. + +На этом открытая часть ОС под названием Darwin заканчивается, и начинается слой фреймворков, которые как раз и образуют то, что мы привыкли считать OS X / iOS. + +**Фреймворки** + +Darwin реализует лишь базовую часть Mac OS / iOS, которая отвечает только за низкоуровневые функции (драйверы, запуск/остановка системы, управление сетью, изоляция приложений и так далее). Та часть системы, которая видна пользователю и приложениям, в его состав не входит и реализована в так называемых фреймворках - наборах библиотек и сервисов, которые отвечают в том числе за формирование графического окружения и высокоуровневый API для сторонних и стоковых приложений + +Как и во многих других ОС, API Mac OS и iOS разделен на публичный и приватный. Сторонним приложениям доступен исключительно публичный и сильно урезанный API, однако jailbreak-приложения могут использовать и приватный. + +В стандартной поставке Mac OS и iOS можно найти десятки различных фреймворков, которые отвечают за доступ к самым разным функциям ОС - от реализации адресной книги (фреймворк AddressBook) до библиотеки OpenGL (GLKit). Набор базовых фреймворков для разработки графических приложений объединен в так называемый Cocoa API, своего рода метафреймворк, позволяющий получить доступ к основным возможностям ОС. В iOS он носит имя Cocoa Touch и отличается от настольной версии ориентацией на сенсорные дисплеи. + +Далеко не все фреймворки доступны в обеих ОС. Многие из них специфичны только для iOS. В качестве примеров можно привести AssetsLibrary, который отвечает за работу с фотографиями и видео, CoreBlueTooth, позволяющий получить доступ к синезубу, или iAd, предназначенный для вывода рекламных объявлений в приложениях. Другие фреймворки существуют только в настольной версии системы, однако время от времени Apple переносит те или иные части iOS в Mac OS или обратно, как, например, случилось с фреймворком CoreMedia, который изначально был доступен только в iOS. + +Все стандартные системные фреймворки можно найти в системном каталоге /System/Library/Frameworks/. Каждый из них находится в своем собственном каталоге, называемом бандлом (boundle), который включает в себя ресурсы (изображения и описание элементов интерфейса), хидеры языка си, описывающие API, а также динамически загружаемую библиотеку (в формате dylib) с реализацией фреймворка. + +Одна из интересных особенностей фреймворков - их версионность. Один фреймворк может иметь сразу несколько разных версий, поэтому приложение, разработанное для устаревших версий системы, будет продолжать работать, даже несмотря на изменения, внесенные в новые версии ОС. Именно так реализован механизм запуска старых iOS-приложений в iOS 7 и выше. Приложение, разработанное для iOS 6, будет выглядеть и работать именно так, как если бы оно было запущено в iOS 6. + +**SpringBoard** + +Уровнем выше находятся приложения, системные и устанавливаемые из магазина приложений. Центральное место среди них занимает, конечно же, SpringBoard (только в iOS), реализующее домашний экран (рабочий стол). Именно оно запускается первым после старта системных демонов, загрузки в память фреймворков и старта дисплейного сервера (он же менеджер композитинга, он же Quartz Compositor), отвечающего за вывод изображения на экран. + +SpringBoard - это связующее звено между операционной системой и ее пользователем, графический интерфейс, позволяющий запускать приложения, переключаться между ними, просматривать уведомления и управлять некоторыми настройками системы (начиная с iOS 7). Но также это и обработчик событий, таких как касание экрана или переворот устройства. В отличие от Mac OS X, которая использует различные приложения и демоны-агенты для реализации компонентов интерфейса (Finder, Dashboard, LaunchPad и другие), в iOS почти все базовые возможности интерфейса пользователя, в том числе экран блокировки и «шторка», заключены в одном SpringBoard. + +В отличие от других стоковых приложений iOS, которые располагаются в каталоге /Applications, SpringBoard наравне с дисплейным сервером считается частью фреймворков и располагается в каталоге /System/Library/CoreServices/. Для выполнения многих задач он использует плагины, которые лежат в /System/Library/SpringBoardPlugins/. Кроме всего прочего, там можно найти, например, NowPlayingArtLockScreen.lockboundle, отвечающий за отображение информации о проигрываемой композиции на экране блокировки, или IncomingCall.serviceboundle, ответственный за обработку входящего звонка. + +Начиная с iOS 6 SpringBoard разделен на две части: сам рабочий стол и сервис BackBoard, ответственный за коммуникации с низкоуровневой частью ОС, работающей с оборудованием (уровень HAL). BackBoard отвечает за обработку таких событий, как касания экрана, нажатия клавиш, получение показания акселерометра, датчика положения и датчика освещенности, а также управляет запуском, приостановкой и завершением приложений. + +SpringBoard и BackBoard имеют настолько большое значение для iOS, что, если каким-либо образом их остановить, вся система застынет на месте и даже запущенное в данный момент приложение не будет реагировать на касания экрана. Это отличает их от домашнего экрана Android, который является всего лишь стандартным приложением, которое можно остановить, заменить или вообще удалить из системы (в этом случае на экране останутся вполне рабочие кнопки навигации и строка состояния со «шторкой»). + +**Приложения** + +На самой вершине этой пирамиды находятся приложения. iOS различает встроенные (стоковые) высоко привилегированные приложения и сторонние, устанавливаемые из iTunes. И те и другие хранятся в системе в виде бандлов, во многом похожих на те, что используются для фреймворков. Разница заключается лишь в том, что бандл приложения включает в себя несколько иную метаинформацию, а место динамической библиотеки занимает исполняемый файл в формате Mach-O. + +Стандартный каталог хранения стоковых приложений - /Applications/. В iOS он абсолютно статичный и изменяется только во время обновлений системы; пользователь получить к нему доступ не может. Сторонние приложения, устанавливаемые из iTunes, напротив, хранятся в домашнем каталоге пользователя /var/mobile/Applications/ внутри подкаталогов, имеющих вид 4-2-2-2-4, где два и четыре - это шестнадцатеричные числа. Это так называемый GUID - уникальный идентификатор, который однозначно идентифицирует приложение в системе и нужен в том числе для создания изолированной песочницы (sandbox). + +**Sandbox** + +В iOS песочницы используются для изолирования сервисов и приложений от системы и друг от друга. Каждое стороннее приложение и большинство системных работают в песочнице. С технической точки зрения песочница представляет собой классический для мира UNIX chroot, усиленный системой принудительного контроля доступа TrustedBSD MAC (модуль ядра sandbox.kext), которая отрезает приложениям не только доступ к файлам за пределами домашнего каталога, но и прямой доступ к железу и многим системным функциям ОС. + +В целом заключенное в sandbox приложение ограничено в следующих возможностях: + +* Доступ к файловой системе за исключением своего собственного каталога и домашнего каталога пользователя. +* Доступ к каталогам Media и Library внутри домашнего каталога за исключением Media/DCIM/, Media/Photos/, Library/AddressBook/, Library/Keyboard/ и Library/Preferences/. +* Доступ к информации о других процессах (приложение «считает» себя единственным в системе). +* Прямой доступ к железу (разрешено использовать только Cocoa API и другие фреймворки). +* Ограничение на использование оперативной памяти (контролируется механизмом Jatsam). + +Все эти ограничения соответствуют sandbox-профилю (набору ограничивающих правил) container и применяются к любому стороннему приложению. Для стоковых приложений, в свою очередь, могут применяться другие ограничения, более мягкие или жесткие. В качестве примера можно привести почтовый клиент (профиль MobileMail), который в целом имеет такие же серьезные ограничения, как и сторонние приложения, но может получить доступ ко всему содержимому каталога Library/. Обратная ситуация - SpringBoard, вообще не имеющий ограничений. + +Внутри песочниц работают многие системные демоны, включая, например, AFC, предназначенный для работы с файловой системой устройства с ПК, но ограничивающий «область видимости» только домашним каталогом пользователя. Все доступные системные sandbox-профили располагаются в каталоге /System/Library/Sandbox/Profiles/\* и представляют собой наборы правил, написанных на языке Scheme. Кроме этого, приложения также могут включать в себя дополнительные наборы правил, называемых entitlement. По сути, это все те же профили, но вшитые прямо в бинарный файл приложения (своего рода самоограничение). + +Смысл существования всех этих ограничений двойной. Первая (и главная) задача, которую решает sandbox, - это защита от вредоносных приложений. Вкупе с тщательной проверкой опубликованных в iTunes приложений и запретом на запуск не подписанных цифровым ключом приложений (читай: любых, полученных не из iTunes) такой подход дает прекрасный результат и позволяет iOS находиться на вершине в списке самых защищенных от вирусов ОС. + +Вторая проблема - это защита системы от самой себя и пользователя. Баги могут существовать как в стоковом софте от Apple, так и в головах юзеров. Sandbox защищает от обоих. Даже если злоумышленник найдет дыру в Safari и попытается ее эксплуатировать, он все равно останется в песочнице и не сможет навредить системе. А юзер не сможет «сломать свой любимый телефончик» и не напишет гневных отзывов в адрес Apple. К счастью, знающие люди всегда могут сделать jailbreak и обойти защиту sandbox (собственно, в этом и есть смысл джейлбрейка). + +**Многозадачность** + +Одна из самых спорных особенностей iOS - это реализация многозадачности. Она вроде бы и есть, а с другой стороны, ее нет. В сравнении с традиционными настольными ОС и пресловутым Android iOS не является многозадачной операционной системой в привычном смысле этого слова и не позволяет приложениям свободно работать в фоне. Вместо этого ОС реализует API, который приложение может использовать для выполнения отдельных задач, пока оно находится в фоновом режиме. + +Впервые такой API появился в iOS 4 (до этого фоновые задачи могли выполнять только стоковые приложения) и наращивался по мере развития операционной системы. Сегодня (речь идет об iOS 7) так называемый Background API позволяет делать следующее: + +* проигрывать аудио; +* совершать VoIP-звонки; +* получать информацию о смене местоположения; +* получать push-уведомления; +* планировать отложенный вывод уведомлений; +* запрашивать дополнительное время для завершения работы после перехода в фоновый режим; +* обмениваться данными с подключенными к девайсу аксессуарами (в том числе Bluetooth); +* получать и отправлять данные по сети (начиная с iOS 7). + +Такие ограничения на работу в фоне необходимы в первую очередь для того, чтобы сохранить заряд батареи и избежать лагов интерфейса, так знакомых пользователям Android, где приложения могут делать в фоне все что захотят. На самом деле Apple настолько сильно заботится о сохранении батареи, что даже реализовала специальный механизм для группировки фоновых действий приложений и их запуска в нужные моменты, например тогда, когда смартфон активно используется, подключен к Wi-Fi-сети или к зарядному устройству. + +**Шесть стадий загрузки iOS** + +![https://xakep.ru/wp-content/uploads/2015/02/boot\_KakustroenaiOS.png](https://xakep.ru/wp-content/uploads/2015/02/boot\_KakustroenaiOS.png) + +* Boot ROM. После включения устройства первым запускается минималистичный загрузчик, прошитый в постоянную память устройства. Его задача - произвести начальную инициализацию железа и передать управление первичному загрузчику LLB. Boot ROM всегда имеет заводскую прошивку и не может быть обновлен. +* Low Level Bootloader (LLB). Далее управление получает LLB. Это первичный загрузчик, задача которого - найти в памяти устройства iBoot, проверить его целостность и передать ему управление либо переключить девайс в режим восстановления, если это не удалось. Код LLB хранится в NAND-памяти устройства и обновляется вместе с установкой новой версии прошивки. Кроме всего прочего, он выводит на экран загрузочный логотип. +* iBoot. Это вторичный и основной загрузчик айдевайсов. Он включает в себя драйвер файловой системы, с помощью которого получает доступ к содержимому NAND-памяти, находит ядро и передает ему управление. В iBoot также встроен драйвер UART, с помощью которого можно производить отладку ядра и ОС, подключив девайс к COM-порту или USB-порту компа (с помощью кабеля USB - UART). +* Ядро. Здесь все как обычно. Ядро производит инициализацию оборудования, после чего передает управление демону launchd. +* Launchd. Это первичный процесс iOS и Mac OS X, он подключает файловые системы, запускает демоны/службы (например, backupd, configd, locationd), дисплейный сервер, фреймворки, а на последнем этапе загрузки отдает управление SpringBoard. В iOS и Mac OS X launchd используется как замена стандартного /bin/init в UNIX, однако его функциональность гораздо шире. +* SpringBoard. Вот и экран блокировки! + +Первые четыре этапа в этой цепи образуют chain of trust, реализованный с помощью сверки цифровой подписи загружаемого компонента. Цифровую подпись имеют LLB, iBoot и ядро, что позволяет исключить внедрение в цепочку хакнутого загрузчика или ядра, которые могут быть использованы для загрузки сторонней операционной системы или джейлбрейка. Единственный способ обойти этот механизм - найти дыру в одном из загрузчиков и воспользоваться ею для обхода проверки. В свое время было найдено несколько таких дыр в Boot ROM (наиболее известен эксплойт limera1n от geohot, актуальный для iPhone 1-4), а в начале 2014 года и в iBoot (хакер iH8sn0w, эксплойт так и не был опубликован). + +Удерживая кнопку «Домой» при включении iPhone, можно заставить iBoot загрузиться в так называемый режим восстановления (Recovery), который позволяет восстановить прошивку iOS или обновить ее, используя iTunes. Однако механизм автоматического OTA-обновления использует другой режим, именуемый DFU (Device Firmware Upgrade), который активируется на раннем этапе загрузки сразу после Boot ROM и реализован в двух компонентах: iBSS и iBEC. По сути, это аналоги LLB и iBoot, конечная цель которых - не загрузить ОС, а перевести смартфон в режим обновления. + +Источники: + +* [Как устроена iOS](https://xakep.ru/2014/10/08/kau-ustroena-ios/) diff --git a/mobilnoe-testirovanie/kak-protestirovat-prilozhenie-dlya-drugoi-strany.md b/mobilnoe-testirovanie/kak-protestirovat-prilozhenie-dlya-drugoi-strany.md new file mode 100644 index 0000000..c3b0be8 --- /dev/null +++ b/mobilnoe-testirovanie/kak-protestirovat-prilozhenie-dlya-drugoi-strany.md @@ -0,0 +1,7 @@ +# Как протестировать приложение для другой страны? + +* VPN; +* Сброс до заводских настроек и выбор нужного региона; +* Fake GPS; +* Google/Apple аккаунт нужной страны. + diff --git a/mobilnoe-testirovanie/kak-proverit-ispolzovanie-resursov-na-android.md b/mobilnoe-testirovanie/kak-proverit-ispolzovanie-resursov-na-android.md new file mode 100644 index 0000000..1996a12 --- /dev/null +++ b/mobilnoe-testirovanie/kak-proverit-ispolzovanie-resursov-na-android.md @@ -0,0 +1,5 @@ +# Как проверить использование ресурсов на Android + +* В Google Play доступны различные приложения, такие как CPU Monitor, Usemon, CPU Stats, CPU-Z и т. д. Это расширенный инструмент, который записывает информацию о процессах, запущенных на вашем устройстве. Не все показатели могут быть доступны без root, это зависит от конкретного устройства. +* В инструментах разработчика доступны инструменты профилирования; +* [Профилировщик в IDE (Android Studio)](https://developer.android.com/studio/profile/android-profiler). diff --git a/mobilnoe-testirovanie/kak-uspeshno-zarelizit-produkt-v-app-store-i-google-play.md b/mobilnoe-testirovanie/kak-uspeshno-zarelizit-produkt-v-app-store-i-google-play.md new file mode 100644 index 0000000..7e2076a --- /dev/null +++ b/mobilnoe-testirovanie/kak-uspeshno-zarelizit-produkt-v-app-store-i-google-play.md @@ -0,0 +1,48 @@ +# Как успешно зарелизить продукт в App Store и Google Play + +**Специфика работы с платформой Apple** + +* Review Guidelines. Любые реджекты, баны и блокировки всегда исходят из нарушений этих гайдов, ну или потому что Apple посчитали, что вы их нарушаете. Гайдлайны регулярно обновляются, особенно много обновлений бывает перед и после конференции WWDC; +* Следующий по важности документ - [гайдлайны интерфейсов](https://developer.apple.com/design/human-interface-guidelines/). Здесь представлены рекомендации и лучшие практики по построению красивых, удобных и понятных интерфейсов для всех устройств Apple. Его необходимо прочитать хотя бы раз любому дизайнеру интерфейсов, а также полезно будет QA-специалистам и разработчикам; +* [App Store Connect](https://help.apple.com/app-store-connect/en.lproj/static.html) - навряд ли часто открывают. В то же время это исчерпывающая инструкция по использованию консоли для управления вашим приложением. Всякий раз, когда у вас возникает вопрос по работе с Connect’ом, пожалуйста, сверяйтесь с документацией; +* Если у вас уже было опубликовано приложение с поддержкой iPad, то выпилить поддержку уже не получится. + +**Топ-8 причин для реджектов от Apple (в Google Play примерно также)**: + +* App Completeness - не работающие приложения с крашами и багами; +* Inaccurate Metadata - подробно и точно описывайте функционал приложений, прикрепляйте правильные скриншоты; +* Incomplete Info - важно рассказать о вашем продукте все, что стоит знать ревьюерам. Проверяйте актуальность тестовых учеток перед сабмитом. Если вы что-то экспериментируете в билде, расскажите об этом команде ревью; +* Unusual Interface - Apple не зря сделали целый портал про свои интерфейсы. Они хотят чтобы все приложения работали так, как пользователи от них этого ждут. Хороший пример Албания, в которой привычное для нас качание головой вверх-вниз означает нет, а из стороны в сторону - да. Apple это весь мир, не будьте в этом мире Албанией; +* Web Content Aggregators - сайты обернутые в iOS приложение обычно не принимаются; +* Similar App Submission - Apple хотят видеть уникальные приложения и если вы вдруг решили запустить сразу пять одинаковых игр дабы увеличить шансы на взрывной рост, то рискуете остаться без взрывного роста и без приложений; +* Misleading Offers - мы все прошли через рентген для камеры нокии. Не обещать того, чего нет; +* Not Enough Value - Apple хотят видеть уникальные приложения. Это касается не только конкретного разработчика, но и всех вместе. Не нужно делать десятитысячный калькулятор и миллионный фонарик, их достаточно. Также не нужно делать приложение, которым будут пользоваться три человека. Ваше приложение должно нести в себе нужный широкому пользователю, уникальный функционал. + +**Специфика работы с платформой Google Play Developer**: + +* Необходимо следить за [предстоящими обновлениями гайдлайнов](https://developer.android.com/distribute/play-policies) перед и после конференции Google I/O; +* Все политики вы найдете в [Google Play Developer Policy Center](https://play.google.com/intl/en/about/developer-content-policy/), они написаны на русском языке, что заметно удобнее. Во многом политики Google и Apple схожи, однако различия есть и иногда они весьма значительны - обратите на это свое внимание, прочитать и использовать политики только одной платформы - плохая идея; +* Самый полезный ресурс для понимания работы консоли Google Play - это [Google Play Academy](https://playacademy.exceedlms.com/student/catalog), там есть ответы на 90% вопросов и все возможные сценарии ее использования как с точки зрения пользователя (разработчика) так и для маркетологов и ASO-специалистов; +* Если у вас есть вопросы по дизайну своего продукта, вы сомневаетесь о проценте прозрачности или даже не знаете правильно ли используете жесты, вы найдете ответ на свой вопрос и/или сможете открыть для себя что-то новое и полезное для ваших приложений в гайдлайнах [Material Design](https://material.io/design/introduction). + +**Соблюдайте правила сторов** + +В Apple и Google сидят весьма смышленые ребята, основная задача которых не допустить того, чтобы приложения противоречили их политикам: + +* не прячьте части функционала приложения от ревьюверов; +* не пытайтесь обойти комиссию платформ и прятать 3rd-party эквайринг; +* не вводите пользователя в заблуждение; +* не запрашивайте лишние доступы, объясняйте зачем нужны доступы, которые запрашиваете. + +Источники: + +* [Как успешно зарелизить продукт в App Store и Google Play](https://telegra.ph/Kak-uspeshno-zarelizit-produkt-v-App-Store-i-Google-Play-02-27) + +Доп. материал: + +* [Policies & publishing on Google Play](https://www.youtube.com/watch?v=ZDS4diFfBmQ) +* [Соответствие правилам для страниц приложений в Google Play](https://playacademy.exceedlms.com/student/activity/15949) +* [Запуск приложения или игры](https://playacademy.exceedlms.com/student/path/16605) +* [Pre-launch testing for mobile games: tools and best practices on Google Play](https://medium.com/googleplaydev/test-pre-launch-96d0ef3c4d51) +* [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) +* [App Store Connect](https://developer.apple.com/support/app-store-connect/) diff --git a/mobilnoe-testirovanie/kakim-obrazom-testirovshik-poluchaet-prilozhenie-na-test.md b/mobilnoe-testirovanie/kakim-obrazom-testirovshik-poluchaet-prilozhenie-na-test.md new file mode 100644 index 0000000..82af641 --- /dev/null +++ b/mobilnoe-testirovanie/kakim-obrazom-testirovshik-poluchaet-prilozhenie-na-test.md @@ -0,0 +1,18 @@ +# Каким образом тестировщик получает приложение на тест? + +**Android**: + +* Разработчик скинет .apk :) или .aab, который нужно разархивировать; +* Из CI-агента. Тот же Jenkins/TeamCity может присылать ссылку на билд в tg-канал или можно забрать его вручную; +* Сбилдить в Android Studio самому из нужной ветки; +* [Открытые и закрытые бета-тестирования приложений в Google Play](https://support.google.com/googleplay/android-developer/answer/9845334?hl=ru); + +**iOS**: + +* сбилдить в Xcode; +* внутреннее и внешнее тестирование в [TestFlight](https://testflight.apple.com); +* сервис [tiny.app.link](https://getappbox.com) + +Доп. материал: + +* [Visual Studio App Center](https://appcenter.ms) diff --git a/mobilnoe-testirovanie/middleware.md b/mobilnoe-testirovanie/middleware.md new file mode 100644 index 0000000..85f468c --- /dev/null +++ b/mobilnoe-testirovanie/middleware.md @@ -0,0 +1,40 @@ +# Middleware + +![https://www.zaproo.com/uploads/f515911965f54bfda8c1d2a8353fcc51.png](https://www.zaproo.com/uploads/f515911965f54bfda8c1d2a8353fcc51.png) + +Связу́ющее програ́ммное обеспе́чение (англ. middleware; также переводится как промежу́точное программное обеспечение, программное обеспечение среднего слоя, подпрогра́ммное обеспечение, межплатфо́рменное программное обеспечение) - широко используемый термин, означающий слой или комплекс технологического программного обеспечения для обеспечения взаимодействия между различными приложениями, системами, компонентами. (с) Вики. В данном разделе нас интересует применение в мобильной разработке. + +Особенностью заказной разработки мобильных приложений является то, что основной сервер с API обычно предоставляет заказчик. Ниже список, с чем в этом случае придется иметь дело мобильным разработчикам: + +* API не дописано - разработчики заказчика загружены текущей работой и не мотивированы сдать его в срок, при том, что у маркетинга планы и сроки запуска мобильного приложения горят; +* API сильно не совпадает со структурой мобильного приложения (данные для экранов приходится дергать с 3-4 методов и обрабатывать локально); +* Нет документации, либо она сильно разрознена и не актуальна; +* Несколько точек входа (разросшаяся инфраструктура находится на нескольких серверах с разными адресами); +* Уже существующее API меняется после апдейтов основного сайта;Отсутствие тестовых серверов; +* Баги (много багов). + +И добавим сюда понимание, что со всем этим придется бороться сразу на двух платформах, которые хоть и являются мобильными, часто используют разные архитектурные подходы и, как следствие, разные сроки старта и готовности этапов. Все это приводит к увеличению сроков разработки и, соответственно, стоимости разработки. + +Для минимизации всех этих проблем предлагается использовать промежуточный сервер - шину данных. + +Middleware - чаще всего простой быстро настраиваемый сервер, не хранящий каких-либо данных, кроме логов. Он позволяет использовать для общения мобильных приложений с собой простой REST API, строго подогнанный под логику экранов, а сам уже обращается к целевому API необходимым образом. + +Бонусом мы имеем возможность разрабатывать приложения со своими наработками по авторизации, обработкам ошибок и прочим мелочам, протестированными и проверенными. + +Плюсы такого подхода: + +* Отсутствуют простои из-за неготовности API заказчика - в худшем случае на шине отдаются тестовые данные; +* Упрощается реализация мобильного приложения практически до тонкого клиента; +* Единственная точка входа позволяет упростить архитектуру работы с сетью в МП; +* Возможность выкладывать обновления для сервера шины (меняющую взаимодействие с сервером заказчиком) без обновления МП, в кратчайшие сроки, без модерации со стороны третьих фирм; +* Простота и отсутствие полноценной БД позволяет легко разворачивать любое количество тестовых серверов; +* Удобное логирование всех сетевых ошибок и оповещение о них; +* Изменения в работе API заказчика необходимо вносить только в одном месте - на сервере шины; +* Документация ведется принятым и привычным в компании способом; +* Использование наработок снижает сроки и стоимость разработки. + +Все это позволяет снизить сроки и стоимость, напрямую и косвенно, за счет снижения рисков простоя, сложности реализации серверной части и тестирования. Шикарный бонус разработчику - возможность предложить более низкую цену и выиграть конкурс, а заказчику - сэкономить и уменьшить сроки внедрения МП. + +Источники: + +* [Middleware, необходимость в мире разработки мобильных приложений](https://www.saratovit.ru/2019/12/27/middleware-mobile-apps/) diff --git a/mobilnoe-testirovanie/osnovnye-proverki-pri-testirovanii-mobilnogo-prilozheniya.md b/mobilnoe-testirovanie/osnovnye-proverki-pri-testirovanii-mobilnogo-prilozheniya.md new file mode 100644 index 0000000..e0c11f1 --- /dev/null +++ b/mobilnoe-testirovanie/osnovnye-proverki-pri-testirovanii-mobilnogo-prilozheniya.md @@ -0,0 +1,133 @@ +# Основные проверки при тестировании мобильного приложения + +![http://apps.testinsane.com/mindmaps/uploads/html/Mobile%20Testing.html](https://lh3.googleusercontent.com/zCEGij6Czp\_ZbLUbd2FF8cxsCWyTVQZzt2yPI4rO9h1HcPIlWFa3DN\_X98m4k7522p4nA3OOe1RPDLT5ooNTS3CvLLZLZ1YE2grZKm9UNACqR1NO9rgHNUh-U-deAdqrgyfjpfi\_) + +![https://www.istqb.org/certifications/mobile-tester](https://lh4.googleusercontent.com/FXMIUoBn80ckGlWV-HxPLRrlDGtO4XnOBBEoGgc4t9t3gVI2m0Y048GEjoGV7FWP5I189Ma1YiecY4C75EjcW0xL1fRGRhRXL2oVJu3C9BkWKskOVT2AqNGPsVXb3XBFY1ZMK8E9) + +В описанный ниже чек-лист вошли только общие характеристики. Естественно, в тестируемом приложении может быть функциональность, для которой нужно применять отдельный подход и создать отдельные сценарии. То же самое верно для производительности, удобства использования, безопасности и прочего тестирования, которое необходимо вашему приложению. Чек-лист состоит из восьми разделов: + +* Функциональное тестирование; +* Тестирование совместимости; +* Тестирование безопасности; +* Тестирование локализации и глобализации; +* Тестирование удобства использования; +* Стрессовое тестирование; +* Кросс-платформенное тестирование; +* Тестирование производительности. + +**Функциональное тестирование**: В данном пункте нам важно убедиться, что наш продукт соответствует нужной функциональной спецификации, упомянутой в документации по разработке. + +* Установка/удаление/накатка версий; +* Запуск приложения (отображение Splash Screen); +* Работоспособность основного функционала приложения; + * Авторизация (по номеру телефона/через соц. сети/e-mail); + * Регистрация (по номеру телефона/через соц. сети/e-mail); + * Онбординг новых пользователей; + * Валидация обязательных полей; + * Навигация между разделами приложения; + * Редактирование данных в профиле пользователя; + * Проверка оплаты; + * Тестирование фильтров; + * Бонусы; +* Корректное отображение ошибок; +* Работа с файлами (отправка/получение/просмотр); +* Тестирование тайм-аутов; +* Тестирование заглушек (не соединения с интернетом/нет, например, товаров и т.д); +* Тестирование pop-up, алертов; +* Тестирование WebView; +* Скролл/свайп элементов; +* Тестирование PUSH уведомлений; +* Сворачивание/разворачивание приложения; +* Разные типы подключений (сотовая связь/Wi-Fi); +* Ориентация экрана (альбомная/портретная); +* Темная/светлая темы; +* Реклама в приложении; +* Шаринг контента в соц. сети; +* Работа приложения в фоне; +* Пагинация страниц; +* Политики конфиденциальности и прочие ссылки на документы. + +**Тестирование совместимости**: Тестирование совместимости используется, чтобы убедиться, что ваше приложение совместимо с другими версиями ОС, различными оболочками и сторонними сервисами, а также аппаратным обеспечением устройства. + +* Корректное отображение гео; +* Информации об операциях (чеки и т.д.); +* Различные способы оплаты (Google Pay, Apple Pay); +* Тестирование датчиков (освещенности, температуры устройства, гироскоп и т.д.); +* Тестирование прерываний (входящий звонок/смс/push/будильник/режим «Не беспокоить» и т.д.); +* Подключение внешних устройств (карта памяти/наушники и т.д.). + +**Тестирование безопасности**: Данная проверка нацелена на поиск недостатков и пробелов с точки зрения безопасности приложения. + +* Тестирование разрешений (доступ к камере/микрофону/галерее/и т.д.); +* Данные пользователя (пароли) не передаются в открытом виде; +* В полях, с вводом пароля и подтверждением пароля, данные скрываются астерисками. + +**Тестирование локализации и глобализации**: Тестирование интернационализации/глобализации приложения включает тестирование приложения для различных местоположений, форматов дат, чисел и валют, а также замену фактических строк псевдостроками. Тестирование локализации включает тестирование приложения с локализованными строками, изображениями и рабочими процессами для определенного региона. + +* Все элементы в приложении переведены на соответствующий язык; +* Тексты зашиты внутри приложения и пользователь в настройках приложения может выставить необходимый язык; +* Тексты зависят от языка в системных настройках; +* Тексты приходят с сервера; +* Корректное отображение форматов дат (ГОД - МЕСЯЦ - ДЕНЬ или ДЕНЬ - МЕСЯЦ - ГОД.); +* Корректное отображение времени в зависимости от часового пояса. + +**Тестирование удобства использования** + +Тестирование удобства использования помогает удостовериться в простоте и эффективности использования продукта пользователем, с целью достижения поставленных целей. Иными словами, это не что иное, как тестирование дружелюбности приложения для пользователя. + +* Корректное отображение элементов на устройствах с различными разрешениями экранов; +* Все шрифты соответствуют требованиям; +* Все тексты правильно выровнены; +* Все сообщения об ошибках верные, без орфографических и грамматических ошибок; +* Корректные заголовки экранов; +* В поисковых строках присутствуют плейсхолдеры; +* Неактивные элементы отображаются серым; +* Ссылки на документы ведут на соответствующий раздел на сайте; +* Анимация между переходами; +* Корректный возврат на предыдущий экран; +* Поддерживаются основные жесты при работе с сенсорными экранами (swipe back и т.д.); +* Пиксель-перфект. + +**Стрессовое тестирование**: Стрессовое тестирование направлено на определение эффективности производительности приложения в условиях повышенной нагрузки. Стресс-тест в этом контексте ориентирован только на мобильные устройства. + +* Высокая загрузка центрального процессора; +* Нехватка памяти; +* Загрузка батареи; +* Отказы; +* Низкая пропускная способность сети; +* Большое количество взаимодействий пользователя с приложением (для этого может понадобиться имитация реальных условий состояния сети). + +**Кросс-платформенное тестирование**: Важный вид тестирования, который необходимо проводить для понимания того, будет ли должным образом отображаться тестируемый продукт на различных платформах, используемых целевой аудиторией. + +* Работоспособность приложения на различных устройствах разных производителей + +**Тестирование производительности**: Если пользователь устанавливает приложение, и оно не отображается достаточно быстро (например, в течение трех секунд), оно может быть удалено в пользу другого приложения. Аспекты потребления времени и ресурсов являются важными факторами успеха для приложения, и для измерения этих аспектов проводится тестирование производительности. + +* Время загрузки приложения; +* Обработка запросов; +* Кэширование данных; +* Потребление ресурсов приложением (например расход заряда батареи). + +Помимо прочего, можно использовать **эвристики и мнемоники**: I SLICED UP FUN, COP FLUNG GUN, SFDPOT, LONG FUN CUP. + +_Примечание: в свете последних анонсов раскладных смартфонов и Android 12L, следует также при необходимости учитывать такие кейсы._ + +Источники: + +* [Чек-лист тестирования мобильных приложений](https://habr.com/ru/post/534190/) + +Доп. материал: + +* [Распространенные баги на iOS](https://telegra.ph/bagi-na-iOS-02-05) +* [Распространенные баги на Android](https://telegra.ph/bagi-na-android-10-07) +* [ISTQB Mobile Application Testing](https://www.istqb.org/certification-path-root/mobile-application-testing.html) +* [Mobile App Testing Tutorials (A Complete Guide With 30+ Tutorials)](https://www.softwaretestinghelp.com/beginners-guide-to-mobile-application-testing/) +* [Жизнь без AppStore и Google Play: работаем с Huawei Mobile Services и AppGallery](https://habr.com/ru/post/551262/) +* [Особенности тестирования Android без Google-сервисов](https://habr.com/ru/company/surfstudio/blog/559106/) +* YaTalks 2021. Mobile: [Моделирование угроз для мобильных приложений](https://www.youtube.com/watch?v=0AQlKbskhkM\&t=16024s) + [презентация](https://disk.yandex.ru/i/kLk2Nscwqnto2Q) +* [Как тестировать мобильные игры](https://dou.ua/forums/topic/34948/) +* [Free Mobile App Testing Tutorial](https://www.guru99.com/mobile-testing.html) +* [Как тестировать мобильное приложение](https://www.youtube.com/watch?v=sCpY9E9oKW4) +* [Простые мобильные баги: примеры](https://www.youtube.com/watch?v=cqF99cqtcTw) +* [Чеклист по UX из 30 пунктов для мобильных приложений](https://habr.com/ru/company/edison/blog/474472/) +* Больше чек-листов и идей можно найти в разделе полезных ресурсов diff --git a/mobilnoe-testirovanie/osnovnye-razlichiya-android-ios.md b/mobilnoe-testirovanie/osnovnye-razlichiya-android-ios.md new file mode 100644 index 0000000..3090d70 --- /dev/null +++ b/mobilnoe-testirovanie/osnovnye-razlichiya-android-ios.md @@ -0,0 +1,27 @@ +# Основные различия Android/iOS + +Последние годы обе системы заимствовали что-то друг у друга и пользовательский опыт теперь у них мало чем отличается, тем не менее, различий всё ещё хватает в другом: + +* iOS - закрытая система, а Android - open-source; +* Языки разработки: Android - Kotlin/Java, iOS - objective-С или Swift; +* Гайдлайны: [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/) (HIG) у iOS и [Material Design](https://material.io) у Android; +* Простота получения root-прав на многих устройствах Android; +* Различная целевая аудитория, в т.ч. разный ее размер (у Android сегодня ориентировочно 80% всех гаджетов в мире); +* Различная монетизация, в т.ч. ее размер (согласно статистике, iOS пользуются более платежеспособные люди, которые делают покупки в 3 раза чаще); +* Различный market share (например, в США в лидерах айфоны); +* Отличия в модерации приложений для публикации в магазине приложений - у Android процедура значительно быстрее и проще; +* Функция «Назад» (виртуальная кнопка или жест). Во всех Android-смартфонах клавишу, возвращающую на шаг назад, можно закрепить в нижней части экрана (вместе с виртуальными кнопками возврата на главный экран и вызова меню запущенных программ). С жестами ситуация не отличается: на каком экране (или в каком приложении) ни находился бы юзер, проведя пальцем вправо или влево от соответствующей стороны дисплея, он сможет вернуться на шаг назад. В iOS все работает немного иначе. Вернее, универсальности на уровне системы, а не отдельной программы не предусмотрено. В некоторых приложениях жест «Назад» присутствует (например, в популярном Instagram) и действует едва ли не с середины дисплея - удобно. Где-то такое работает только с левого края экрана (скажем, в приложении «Настройки»). Еще где-то его просто нет. «Передвигаться» по меню такие программы предлагают нажатием на виртуальную клавишу, предусмотренную разработчиками конкретной программы; +* В сети в целом часто жалуются на файловую систему iOS. Вернее, претензии предъявляются к ее серьезной ограниченности. Если к Android-устройству можно подключить накопитель и переписать данные с него или на него, или оперировать файлами через тот же telegram, то с iPhone такое уже не пройдет (не считая условных фотографий, и то не без «костылей», если речь не про синхронизацию с Mac); +* Отсутствие возможности набора текста свайпами на русской раскладке фирменной клавиатуры Apple (в сторонних можно); +* Скачать какой-нибудь .ipa и установить в обход App Store не получится; +* Возможность установки свежей версии «операционки» на смартфоны от Apple, вышедшие более пяти лет назад и уже не доступные в продаже. + +Источники: + +* [Как я перешел на iPhone после многих лет с Android-смартфонами. Плюсы и минусы экосистемы Apple](https://tech.onliner.by/2021/11/22/plyusy-i-minusy-ekosistemy-apple) + +Доп. материал: + +* [32 отличия дизайна мобильного приложения под iOS и Android](https://habr.com/ru/company/redmadrobot/blog/491674/) +* [Гайдлайны Google Material и Apple Human Interface. Android, iOS и Material You](https://www.youtube.com/watch?v=28m34MR\_g2c) +* [Difference Between iOS and Android Testing](https://w3softech.com/blog/difference-between-ios-and-android-testing/) diff --git a/mobilnoe-testirovanie/osobennosti-v-testirovanii-mobilnykh-prilozhenii.md b/mobilnoe-testirovanie/osobennosti-v-testirovanii-mobilnykh-prilozhenii.md new file mode 100644 index 0000000..9c27154 --- /dev/null +++ b/mobilnoe-testirovanie/osobennosti-v-testirovanii-mobilnykh-prilozhenii.md @@ -0,0 +1,23 @@ +# Особенности в тестировании мобильных приложений + +Многие особенности очевидны из самого названия “мобильные” - смартфон имеет маленький дисплей, им пользуются на ходу и в условиях совместного использования с большим количеством других приложений и подключенных устройств, а высокий темп современной жизни заставит пользователя уйти к конкурентам, если экран приложения загружается дольше пары секунд, если с приложением сложно взаимодействовать или оно доставляет еще какие-либо неудобства. + +**Отличия от веба и десктопа**: + +* Постоянные прерывания в работе приложения: сворачивание, блокировка, входящий звонок или сообщение, уведомления, обновления приложений, выключение или перезагрузка, выгрузка системой из ОЗУ, разряд АКБ, подключение зарядки или других устройств, переход в энергосберегающий режим и режим ожидания, включение и отключение функций необходимых устройству (gps, bluetooth, связь), использование/отзыв разрешений, подключение/отключение карты памяти/симки/АКБ, платежи NFC, принудительная остановка); +* Работа в беспроводной сети с изменяющейся стабильностью и скоростью приема сигнала, переключение между сотовой связью и wi-fi; +* Уведомления; +* Взаимодействие с web view; +* Использование вертикальной и горизонтальной ориентации, повороты; +* Распространение приложений через маркеты; +* Необходимо соответствие гайдлайнам систем; +* Большое внимание уделяется UI и UX; +* В случае Android большая фрагментация устройств и прошивок со своими особенностями; +* Тач-интерфейс, мультитач, жесты; +* Множество каналов ввода: стоковая клавиатура, сторонние клавиатуры, хардовые клавиатуры, голос, жесты и т. д.; +* Биометрия; +* Повышенные требования к энергопотреблению и использованию аппаратных ресурсов; +* Ситуации установки и обновления при нехватке памяти, переноса приложения на карту памяти и обратно; +* Важность инсталляционного тестирования, особенно обновлений, т.к. в условиях высококонкурентного мобильного рынка приложения обновляются часто, чтобы предоставить пользователям новые функции как можно скорее и при этом должны проходить бесшовно; +* GPS и локализация; +* Размер дисплея, челка и вырез под фронтальную камеру; diff --git a/mobilnoe-testirovanie/pokrytie-devaisov.md b/mobilnoe-testirovanie/pokrytie-devaisov.md new file mode 100644 index 0000000..36cbd0e --- /dev/null +++ b/mobilnoe-testirovanie/pokrytie-devaisov.md @@ -0,0 +1,42 @@ +# Покрытие девайсов + +В крупной компании джун-тестировщик с этим вопросом столкнется разве что на собеседовании. Можно рассказать общие принципы: + +* составление таблицы на 5-10 критериев отбора; +* выбор, учитывая особенности приложения, характеристики реальных устройств и бюджет; +* упомянуть, что девайс на руках - не единственный вариант, частично можно протестировать эмуляторами и симуляторами и про фермы тоже не забыть. + +В компании поменьше, оказавшись в начале пути перед выбором реальным, а не теоретическим, будет заметно сложнее. Самый простой и быстрый вариант, взять готовый усредненный список предлагаемый [BrowserStack](https://www.browserstack.com/test-on-the-right-mobile-devices). Если не ищете легких путей - идем дальше. + +**Первым делом запросите статистику у команды** + +Если вдруг она есть, да еще и подробная - вы счастливчик и сюда заглянули скорее из любопытства. Если вам сказали что ее нет, не отступайте так сразу, может оказаться что таки есть, допустим, статистика сайта, но про это или не подумали, или решили что она не годится, или прошлая версия приложения, или был проект близкой тематики, но не взлетел. Любая статистика лучше ее полного отсутствия, даже если это не достоверные данные на конкретное приложение, а срез аудитории в вашей теме. Но рассматривайте эти варианты только как подсказку, а не как готовый список. + +**Изучите целевую аудиторию (ЦА)** + +Часто этим пунктом пренебрегают. Но он может быть важен. Приложение элитного Барбершопа нацелит вас на новые модели смартфонов, флагманы с большим экраном; в женском салоне предположительно увеличится процент айфонов и уменьшится любовь к формату Plus (модели iOS увеличенного размера с приставками Max, Plus). А если ваша ЦА средний класс в регионах - тут будет большой разброс по производителям/устройствам, заметный процент старых моделей и Android в приоритете. + +**Особенности самого приложения тоже могут влиять на выбор** + +Пообщайтесь с менеджером или разработчиками (как вариант редкий, но существующий - изучите документацию), чтобы потом не оказалось, что в приложении графическом вы не можете протестировать поведение Pencil 2, потому что купили девайсы только с первым. Или ваше мобильное приложение сильно зависит от железа, а вы этот момент не учли и у всех ваших девайсов схожие характеристики. Узнайте и выпишите отдельно требования. Погуглите могут ли быть нюансы на разных устройствах при использовании «ваших» технологий (NFC, Fingerprint etc.). + +**Готовим шаблон** + +При наличии своей статистики таблицу можно заполнить сразу в чистовую. Иначе накидать черновик с которым вы потом будете работать, уточняя и редактируя. + +* **Производители**. Посмотреть лидирующих (по трафику) вендоров можно на [Statcounter](https://gs.statcounter.com/vendor-market-share/mobile/russian-federation). Определиться с разработкой версии для Huawei без гугл-сервисов; +* **Соотношение сторон экрана**. При выборе постарайтесь захватить оба значения ближе к краю (из используемых) и среднее; +* **Размер**. Нужны ли планшеты, а также отдельно варианты для Android и для iOS, т.к. у них немного отличается и подход и обозначение; +* **Особенности**. На iOS могут быть нюансы работы нативной «Назад» у моделей с монобровью/челкой, хотя физически она и расположена в зоне статус-бара. Любое приложение с ландшафтной ориентацией и полным использованием экрана (например плеер) также желательно посмотреть на моделях с бровью. Если у вас не веб, а приложение, рассчитанное не на премиум-сегмент, да еще и с записью данных на устройство - работа с SD-картой иногда вызывает вопросы, включаем в список. + +Источники: + +* Выбор мобильных устройств: пошаговая инструкция для начинающих QA. [Часть I](https://habr.com/ru/post/513018/) + +Доп. материал: + +* Выбор мобильных устройств: пошаговая инструкция для начинающих QA. [Часть II](https://habr.com/ru/post/516160/) +* [Сервисы статистики для мобильных приложений](https://habr.com/ru/post/457304/) +* [Облачные платформы для мобильного тестирования](https://habr.com/ru/post/464433/) +* [Что общего у мобильного QA и осьминога](https://habr.com/ru/company/badoo/blog/317964/) +* [Тестовая ферма из Android-устройств: как собрать, отладить и не взорвать офис](https://habr.com/ru/company/vk/blog/579210/) diff --git a/mobilnoe-testirovanie/poslednee-obnovlenie-android-ios-chto-novogo.md b/mobilnoe-testirovanie/poslednee-obnovlenie-android-ios-chto-novogo.md new file mode 100644 index 0000000..122bcfe --- /dev/null +++ b/mobilnoe-testirovanie/poslednee-obnovlenie-android-ios-chto-novogo.md @@ -0,0 +1,3 @@ +# Последнее обновление Android/iOS, что нового? + +Актуализируется перед собеседованием, т.к. написанное здесь будет слишком быстро устаревать. diff --git a/mobilnoe-testirovanie/simulyatory-i-emulyatory.md b/mobilnoe-testirovanie/simulyatory-i-emulyatory.md new file mode 100644 index 0000000..f627a28 --- /dev/null +++ b/mobilnoe-testirovanie/simulyatory-i-emulyatory.md @@ -0,0 +1,16 @@ +# Симуляторы и эмуляторы + +_Эмулятор (emulator): Устройство, компьютерная программа или система, которая принимает те же самые входные данные и выдает те же самые выходные данные, что и данная система. (IEEE 610)_ + +_Имитатор (simulator): Устройство, компьютерная программа или система, используемая в тестировании, работающая или ведущая себя аналогично заданной при тех же входных данных. (IEEE 610, DO178b)_ + +**Реальное устройство**: позволяет запускать мобильные приложения и проверять его функциональность. Тестирование реального устройства гарантирует, что ваше приложение будет работать без проблем на клиентских телефонах. Когда устройств становится слишком много, их иногда собирают в так называемые фермы устройств. Реальными устройствами также не обязательно обладать, сейчас широко распространены облачные решения. + +**Эмулятор**: пытается дублировать устройство - это полноценная виртуалка (контейнер) со своей сетевой картой и диском, то есть представляет собой полную повторную реализацию конкретного устройства или платформы изолированно внутри нашей хост-системы. Одним из недостатков такого подхода является скорость работы. Примером служит эмулятор в Android Studio, хотя можно найти и неофициальные эмуляторы и образы Android-устройств. + +**Симулятор**: пытается дублировать только поведение устройства. Как правило, симулятор - это имитация лишь отдельных свойств, возможностей или функций симулируемой системы, причем не в полном объеме, а только в том, в каком это необходимо в рамках тех задач, которые были поставлены перед симулятором. Вы как будто бы работаете с настоящим устройством, но при этом под капотом оно является лишь ПО-имитацией, не работающей изолированно от нашей системы и использующей общий диск и сеть. Примером служит симулятор в XCode. + +Доп. материал: + +* [Как тестировать на эмуляторе (android studio)](https://www.youtube.com/watch?v=ic-sniUEYw4) +* [Как тестировать на симуляторе. Основы тестирования на симуляторе Iphone. Simulator ios xcode](https://www.youtube.com/watch?v=LimscelXdFI) diff --git a/mobilnoe-testirovanie/testirovanie-dip-linkov-mobile-deep-links.md b/mobilnoe-testirovanie/testirovanie-dip-linkov-mobile-deep-links.md new file mode 100644 index 0000000..74fff9c --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-dip-linkov-mobile-deep-links.md @@ -0,0 +1,31 @@ +# Тестирование дип линков (mobile deep links) + +Дип линкинг (deep linking) позволяет конечному пользователю с помощью ссылки открыть страницу с нужным контентом внутри мобильного приложения, минуя его домашнюю страницу и минимизируя трату времени на поиск необходимого контента. + +В случае, если приложение не установлено на девайсе, отложенный дип линкинг (deferred deep linking) позволяет пользователю открыть нужную страницу внутри мобильного приложения даже после его установки. + +Контекстный дип линкинг (contextual deep linking) дает дополнительную возможность сохранения информации (например, о промо кампании) во время всего сценария установки приложения. + +**Проблемы, с которыми сталкиваются разработчики и тестировщики**: + +* Поддержка различных технологий работы с дип линками и разработка линков, которые будут работать во всех мобильных браузерах; +* Интеграция с соц.сетями и мессенджерами; +* Встроенные браузеры (in-app browsers); +* Отслеживание атрибуции (attribution); +* Предотвращение мошенничества; +* Некоторые end-to-end сценарии очень тяжело (или невозможно) автоматизировать; +* Постоянная поддержка. + +**Полезные инструменты** + +* [UA Switcher плагин](https://chrome.google.com/webstore/detail/user-agent-switcher/lkmofgnohbedopheiphabfhfjgkhfcgf), который позволяет просматривать веб-страницы, используя user agent мобильных браузеров. Также можно импортировать свои кастомные конфигурации. +* Сайты, позволяющие сгенерировать webhook ссылки: [раз](http://webhook.site) и [два](http://hookbin.com). Большинство провайдеров дип линков позволяют отслеживать ивенты “на лету”, достаточно лишь вставить полученную ссылку в панель управления провайдера. +* [Сайт](https://halgatewood.com/deeplink/) для проверки, откроет ли дип линк ваше приложение. +* [App Search Validation Tool](https://search.developer.apple.com/appsearch-validation-tool) от Apple. Можно протестировать правильность конфигурации Universal Links. +* [Deep Link Tester](https://github.com/andmar1x/deep-link-tester) для Android, который можно собрать своими руками. Также можно скачать готовые аналоги с Google Play. +* Подписка на обновления сторонних приложений. Мы используем [AppShopper](http://appshopper.com), этот сервис присылает письма на почту каждый раз, когда интересующее нас приложение обновилось в App Store. Это очень удобно - сразу видно, какие мессенджеры следует протестировать в первую очередь. +* Электронные таблицы и таблицы решений (decision tables) для поддержания структуры основных сценариев. + +Источники: + +* [Разработка и тестирование мобильных дип линков (mobile deep links)](https://software-testing.ru/library/testing/mobile-testing/2837-mobile-deep-links) diff --git a/mobilnoe-testirovanie/testirovanie-pokupok-v-android-prilozheniyakh.md b/mobilnoe-testirovanie/testirovanie-pokupok-v-android-prilozheniyakh.md new file mode 100644 index 0000000..6edc13d --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-pokupok-v-android-prilozheniyakh.md @@ -0,0 +1,166 @@ +# Тестирование покупок в Android-приложениях + +С помощью набора API-интерфейсов разработчики могут предлагать два типа продуктов: + +* Управляемые продукты в приложении (Managed in-app products): Как следует из названия, этими продуктами управляет разработчик, и они делятся на расходуемые и нерасходуемые (consumable and non-consumable). Расходуемый продукт обычно носит временный характер, и после его использования его можно снова купить, в то время как нерасходуемый продукт - это одноразовое преимущество, которое пользователь будет продолжать получать в вашем приложении$ +* Подписки (Subscriptions): Эти продукты имеют срок действия (дни, месяцы, недели, годы) и автоматически продлеваются в конце каждого платежного цикла. Если подписка не продлевается, продукт перестает быть активным для пользователя. + +Официальная документация очень полезна, когда дело доходит до первых шагов по добавлению встроенных продуктов в ваше приложение. В частности, тренинг «[Продажа продуктов в приложениях](https://developer.android.com/training/in-app-billing/index.html)» хорошо структурирован и проведет вас через каждый необходимый шаг: + +* Добавление библиотеки Play Billing в приложение (также ознакомьтесь с [этой статьей](https://medium.com/exploring-android/exploring-the-play-billing-library-for-android-55321f282929) Джо Берча); +* Настройка продуктов в консоли Google Play; +* Тестирование встроенных продуктов в вашем приложении. + +Согласно документации по тестированию, у нас есть два способа тестирования покупок: + +* Статические ответы от Google Play: Используя ограниченный набор ID продуктов, вы можете запускать статические ответы из Google Play, чтобы проверить, правильно ли ваше приложение обрабатывает все возможные состояния. Вы должны использовать это при интеграции Play Billing Library в наше приложение или для инструментального тестирования; +* Тестовые покупки: Аккаунт Google, внесенный в белый список как license-test в Play Console, сможет совершать покупки без фактической оплаты. Вы можете использовать это, когда приложение отправляется в QA или для общего тестирования. + +Используя так называемую In-app Billing Sandbox, мы можем разрешить доступ к тестовым покупкам. Это самое близкое к реальным покупкам, за несколькими заметными исключениями: + +* С вас не взимается никакая сумма за продукт, который вы покупаете; +* Если вы покупаете подписку, расчетный период повторяется ежедневно, независимо от продолжительности, настроенной в Play Console; +* У вас есть ручное управление откликом для каждой покупки. + +Последний пункт особенно интересен, потому что у нас есть два способа настройки поведения тестовой покупки. + +Первый метод позволяет точно контролировать поведение лицензирования для всех тестировщиков: например, оставив RESPOND\_NORMALLY, мы получим поведение, похожее на реальное. Второй метод, с другой стороны, позволяет грубо контролировать реакцию поддельной кредитной карты: вы можете решить, будет ли карта всегда одобрять покупку или всегда отклонять ее. Интуитивно понятно, что этот второй метод может быть настроен каждым тестировщиком. + +![https://miro.medium.com/max/3948/1\*lOsmv4znt1BJZz0S4f8Ptw.png](https://miro.medium.com/max/3948/1\*lOsmv4znt1BJZz0S4f8Ptw.png) + +![https://miro.medium.com/max/1376/1\*3OBb98gVTQg4L3tmvk1OYQ.png](https://miro.medium.com/max/1376/1\*3OBb98gVTQg4L3tmvk1OYQ.png) + +Чтобы получить право на пробную покупку, необходимо пройти несколько шагов: + +* Ваш APK должен быть загружен в Play Console (черновики больше не поддерживаются); +* Добавьте license testers в Play Console; +* Пригласите тестировщиков присоединиться к группе альфа-/бета-тестирования (если есть); +* Подождите 15 минут, затем начните тестирование. + +Звучит достаточно просто, верно? Документация также очень обнадеживает: “Легко настроить пробные покупки”. + +Тестирование, согласно реальной жизни. Вы неукоснительно следите за документацией, ждете 15 минут (на всякий случай 30), запускаете тестирование и… возникает ошибка. Что теперь? Оказывается, документация довольно оптимистично объясняет необходимые шаги для тестирования встроенных покупок. Согласно [этому ответу StackOverflow](https://stackoverflow.com/questions/13117081/the-item-you-requested-is-not-available-for-purchase/35132936#35132936), который, в свою очередь, представляет собой набор различных проб и ошибок других пользователей, а также мой личный опыт, на самом деле существует более 10 условий, которые вам необходимо выполнить или учесть, прежде чем вы сможете правильно использовать тестовые продукты: + +* Ваше приложение опубликовано (то есть не находится в черновике); +* APK должен быть опубликован (рабочий, альфа- или бета-каналы); +* APK, который вы загрузили, соответствует тому, который вы тестируете, когда речь идет о коде версии, имени версии и подписи хранилища ключей (этот пункт, по моему опыту, не нужен); +* При тестировании на устройстве вы используете учетную запись, отличную от той, которая привязана к Play Console (т. е. не учетную запись разработчика); +* Инструкции ждать 15 минут слишком оптимистичны, так как распространение изменений из Play Console может занять до 2 часов; +* Дважды проверьте, соответствует ли артикул, который вы используете в приложении, артикулу продукта, который был настроен в Play Console; +* Дважды проверьте, не пытаетесь ли вы приобрести уже имеющийся продукт или уже активную подписку; +* Дважды проверьте, активировали ли вы свои продукты в Play Console: по умолчанию продукты в консоли деактивированы, и вам нужно активировать их вручную; +* Если вы используете альфа-/бета-каналы, убедитесь, что учетная запись, которую вы тестируете, входит в группу тестирования (т. е. нажала «Стать тестировщиком» после перехода по URL-адресу подписки); +* Если вы используете разновидности ABI, такие как arm-v7, arm-v8 и т. д., убедитесь, что APK, который вы используете для тестирования, содержит все библиотеки ABI; +* Убедитесь, что при получении Intent с помощью getBuyIntent вы передаете правильный тип продукта, т. е. inapp, если вы покупаете управляемые продукты в приложении, или подписки, если вы покупаете подписки; +* Если вы используете открытый ключ для повышения безопасности, убедитесь, что он совпадает с ключом в Play Console, поскольку со временем он может меняться (см. [здесь](https://stackoverflow.com/questions/14600664/android-in-app-purchase-signature-verification-failed/14647065#14647065)); +* Убедитесь, что сервисы Google Play обновлены на тестовом устройстве, перейдя на страницу [сервисов Google Play](https://play.google.com/store/apps/details?id=com.google.android.gms\&hl=en) в Play Store. + +Как видите, песочница далеко не проста, когда дело доходит до реального использования, но, по крайней мере, теперь у нас есть несколько дополнительных подсказок, чтобы начать поиск решения! + +Итак, вы должны тестировать свою интеграцию Google Play Billing Library на протяжении всей разработки. Для тестирования на этапе разработки мы рекомендуем использовать тестировщиков лицензий (license testers) для выполнения сценариев, описанных в этом разделе. Сведения о настройке license testers см. в разделе [Проверка выставления счетов в приложении с помощью лицензирования приложений](https://support.google.com/googleplay/android-developer/answer/6062777). + +Использование license testers дает следующие преимущества: + +* Обычно Платежная библиотека Google Play блокируется для приложений, которые не подписаны (signed) и не загружены в Google Play. Тестеры лицензий могут обойти эту проверку, что означает, что вы можете загружать приложения для тестирования, даже для приложений, использующих отладочные сборки с отладочными подписями, без необходимости загрузки в новую версию вашего приложения. Обратите внимание, что имя пакета должно совпадать с именем приложения, настроенного для Google Play, а учетная запись Google должна быть тестером лицензии для учетной записи Google Play Console; +* Тестировщики лицензий имеют доступ к тестовым методам оплаты, которые позволяют избежать взимания с тестировщиков реальных денег за покупки. Вы также можете использовать тестовые способы оплаты для имитации определенных ситуаций, например отклонения платежа; +* Тестировщики лицензий могут быстро протестировать функции подписки. + +Вот некоторые дополнительные сведения о процессе тестовой покупки: + +* Для тестовых покупок используется тот же процесс покупки приложений, что и для реальных покупок; +* Налоги не рассчитываются для пробных покупок; +* Google Play указывает на пробную покупку, отображая уведомление в центре диалогового окна покупки. + +Вы можете подтвердить учетную запись, которая совершает покупку, развернув диалоговое окно покупки. Обратите внимание на следующее: + +* Тестовые учетные записи должны быть на Android-устройстве тестировщика; +* Если на устройстве имеется более одной учетной записи, покупка осуществляется с использованием учетной записи, с которой было загружено приложение; +* Если ни одна из учетных записей не загрузила приложение, покупка осуществляется с помощью первой учетной записи. + +Прежде чем распространять свое приложение, вы можете использовать [тестовые версии](https://support.google.com/googleplay/android-developer/answer/9845334?visit\_id=637775040806604937-1685107894\&rd=1) (test track) Google Play для дополнительной проверки. Например, вы можете использовать тестовые версии, чтобы ваша группа контроля качества проверяла новый выпуск. С помощью тестовых версий пользователи могут установить ваше приложение из Google Play и протестировать версию вашего приложения, которая еще не является общедоступной. Пользователи могут совершать реальные покупки, используя любой из своих способов оплаты в Google Play. + +_Примечание. Покупки пользователей в тестовых версиях приводят к фактическому списанию средств с учетных записей пользователей, если только пользователь не является license tester._ + +Чтобы протестировать интеграцию с биллинговой библиотекой Google Play с помощью тестовых версий, выполните следующие действия: + +* Опубликуйте свое приложение в test track. Обратите внимание, что после публикации приложения в версии для тестирования может пройти несколько часов, прежде чем оно станет доступным для тестировщиков. +* Убедитесь, что каждый тестировщик подписался на тест вашего приложения. На URL-адресе вашего теста ваши тестировщики увидят объяснение того, что значит быть тестировщиком, а также ссылку для регистрации. + +Вы можете протестировать интеграцию на любом аппаратном устройстве с Android 1.6 или более поздней версии. На устройстве должна быть установлена самая актуальная версия приложения Google Play. Общие сведения о том, как настроить устройство для использования в разработке приложений для Android, см. в разделе [Использование аппаратных устройств](https://developer.android.com/studio/run/device). + +_Примечание. Несмотря на то, что тестеры лицензий рекомендуются для разработки и тестирования, убедитесь, что вы также тестируете свое приложение, используя учетные записи, не являющиеся тестировщиками лицензий, время от времени или при внесении крупных изменений. Нелицензионное тестирование помогает гарантировать, что ваше приложение не полагается на тестирование конкретной логики, такой как продолжительность продления (renewal durations)._ + +_Примечание. Пользователи в testing tracks также могут быть license testers для вашего приложения._ + +**Тестирование одноразовых продуктов** + +Тестирование расходных материалов (**consumable products**): + +* Успешная покупка, когда пользователь получает товар. С помощью license tester Test instrument вы можете настроить оплату как всегда успешную; +* Покупка, при которой оплата не была списана, и пользователь не должен получить товар. С помощью license tester вы можете использовать Test instrument, всегда отклоняющий оплату; +* Убедитесь, что товары можно покупать несколько раз. + +Вы также должны убедиться, что покупки подтверждены должным образом, как описано в разделе «[Обработка покупок](https://developer.android.com/google/play/billing/integrate#process)». Для покупок у license tester покупка будет возвращена через 3 минуты, если ваше приложение не подтвердит покупку, и вы получите электронное письмо об отмене. Вы также можете проверить вкладку «Заказы» в консоли Google Play, чтобы узнать, был ли возмещен заказ через 3 минуты. + +Тестирование **non-consumable products**: следует тестировать так же, как и consumable products, но вы должны убедиться, что элемент нельзя купить снова в вашем приложении. Обязательно проверьте подтверждение покупки как для consumable products, так и для non-consumable products (если применимо), поскольку логика обработки каждого из двух типов покупок различается. + +_Примечание. Чтобы совершить несколько тестовых покупок одного и того же non-consumable product, вы можете вернуть средства и отозвать покупки с помощью Google Play Console._ + +**Тестирование функций подписки** + +Флоу покупки одноразовых продуктов и подписок аналогичны, но у подписок есть дополнительные сценарии, такие как успешное или отклоненное продление подписки. Чтобы протестировать продление, вы можете использовать Test instrument, always approves and Test instrument, always declines payment methods, доступные для license testers. Используйте эти инструменты оплаты для тестирования сценариев, выходящих за рамки успешного сценария подписки. + +Как и в случае с одноразовыми продуктами, вы также должны убедиться, что покупки подтверждены должным образом, как описано в разделе «Обработка покупок». Для покупок у тестировщиков лицензий покупка будет возвращена через 3 минуты, если ваше приложение не подтвердит покупку, и вы получите электронное письмо об отмене. Вы также можете проверить вкладку «Заказы» в Google Play Console, чтобы узнать, был ли возвращен заказ через 3 минуты. + +Периоды продления: Тестовые подписки продлеваются быстрее, чем фактические подписки, а тестовые подписки можно продлевать не более шести раз. В следующей таблице указано время продления тестирования для подписок различной продолжительности. Эти времена являются приблизительными. Вы можете увидеть небольшие отклонения в точном времени события. Чтобы компенсировать вариацию, вызывайте API для просмотра текущего состояния после каждой даты истечения срока действия подписки. + +| Срок реальной подписки (**Production subscription period**) | Продление тестовой подписки (**Test subscription renewal**) | +| ----------------------------------------------------------- | ----------------------------------------------------------- | +| 1 неделя | 5 минут | +| 1 месяц | 5 минут | +| 3 месяца | 10 минут | +| 6 месяцев | 15 минут | +| 1 год | 30 минут | + +Функции подписки на основе времени, такие как бесплатные пробные версии, также сокращены для тестирования. В следующей таблице указаны периоды тестирования, связанные с функциями подписки на основе времени: + +| **Feature** | **Test period** | +| ---------------------------------------------------- | ------------------------------------- | +| Подтверждение покупки | 5 минут | +| Бесплатная пробная версия | 3 минуты | +| Начальный ценовой период (Introductory price period) | То же, что и subscription test period | +| Льготный (Grace) период (3- и 7-дневный) | 5 минут | +| Account hold | 10 минут | +| Пауза (1 месяц) | 5 минут | +| Пауза (2 месяц) | 10 минут | +| Пауза (3 месяц) | 15 минут | + +Разверните [следующий раздел](https://developer.android.com/google/play/billing/test#test\_cases), щелкнув Показать/Скрыть, чтобы отобразить сценарии тестирования, которые следует использовать для проверки интеграции подписки. + +**Тестирование промокодов (промоакций)** + +Вы можете использовать Google Play Console для [создания кодов для собственного тестирования](https://support.google.com/googleplay/android-developer/answer/6321495). Имейте в виду, что вы можете создавать только 500 промокодов в квартал для всех управляемых продуктов в приложении. + +Вам следует протестировать следующие сценарии погашения (Redemption) промокода: + +* При вводе промокода в диалоговом окне покупки, запущенном в вашем приложении; +* При активации промокода в приложении Google Play Store; +* При активации промокода на странице https://play.google.com/store с помощью кнопки «Активировать» на панели навигации слева. + +В этих сценариях вы должны тестировать коды всеми возможными способами. Мы рекомендуем выполнить как минимум следующие тесты: + +* Выкуп до установки приложения; +* Выкуп, пока приложение работает на переднем плане. Обратите внимание, что для этого теста вам понадобится другое устройство для тестирования с помощью приложения Google Play Store. Обязательно протестируйте погашения с разных экранов в своем приложении; +* Погашение с многооконным режимом, в котором ваше приложение и приложение Google Play Store отображаются одновременно. + +Для каждого теста убедитесь, что элемент правильно обнаружен и что пользователь уведомлен. + +Источники: + +* [Testing in-app purchases on Android](https://medium.com/bleeding-edge/testing-in-app-purchases-on-android-a6de74f78878) +* [Test your Google Play Billing Library integration](https://developer.android.com/google/play/billing/test) + +Доп. материал: + +* [Более подробно о подписках](https://developer.android.com/google/play/billing/subscriptions) +* [Дмитрий Макаренко - Тестирование платежей в Android-приложении](https://www.youtube.com/watch?v=U9r-uOI7g3Q\&ab\_channel=Heisenbug) diff --git a/mobilnoe-testirovanie/testirovanie-pokupok-v-ios-prilozheniyakh.md b/mobilnoe-testirovanie/testirovanie-pokupok-v-ios-prilozheniyakh.md new file mode 100644 index 0000000..5c14c31 --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-pokupok-v-ios-prilozheniyakh.md @@ -0,0 +1,20 @@ +# Тестирование покупок в iOS-приложениях + +На iOS есть два варианта тестирования: классический, посредством Sandbox покупок, и новый способ локального тестирования покупок через Xcode (StoreKit local testing). + +* [Sandbox тестирование](https://developer.apple.com/apple-pay/sandbox-testing/) - процесс несколько муторный и работает только на реальном девайсе. Чтобы тестировать в Sandbox, в самом начале надо завести аккаунт тестировщика на портале, связать его со своим устройством и после этого этого проверить все сценарии. Некоторые сценарии которых требуют очень большого количества манипуляций (refund, ask to buy, lifetime non-consumable покупки); +* [Тестирование в Xсode](https://developer.apple.com/documentation/xcode/testing-your-apps-in-xcode) стало доступным, начиная с Xcode 12 (iOS 14), и значительно упростило процесс тестирования. Во-первых, тестировать покупки в Xcode можно на раннем этапе, когда приложение не подключено к AppStore Connect. Во-вторых, для Xcode не нужно заводить дополнительных аккаунтов в AppStore, что сильно ускоряет процесс конфигурации тестов, особенно для lifetime non-consumable. В-третьих, локальное тестирование можно автоматизировать, что потенциально снижает шанс появления ошибок в коде. Более того, можно даже писать UI-тесты на пейволы и другие интерфейсы, где фигурируют покупки. + +Однако некоторые вещи доступны только в Sandbox. Например, использовать таблицу цен с автоматической конвертацией на разные валюты можно только в AppStore. Также валидация покупок (receipt validation) в обычном виде уже не работает - локальные покупки валидируются через Xcode, и этот механизм ложится на плечи разработчика. В остальном Xcode покрывает большинство сценариев и задач тестирования. + +Источники: + +* [iOS in-app purchases, часть 4: локальное тестирование покупок в XCode](https://habr.com/ru/company/adapty/blog/571960/) + +Доп. материал: + +* [Testing In-App Purchases in Xcode](https://developer.apple.com/documentation/storekit/original\_api\_for\_in-app\_purchase/testing\_in-app\_purchases\_in\_xcode) +* [Test in-app purchases in Sandbox](https://help.apple.com/app-store-connect/#/dev7e89e149d) +* [In-app purchase types](https://help.apple.com/app-store-connect/#/dev3cd978dbd) +* [In-app purchase statuses](https://help.apple.com/app-store-connect/#/dev840c56fb6) +* [Auto-renewable subscription information](https://help.apple.com/app-store-connect/#/dev7f2d6b652) diff --git a/mobilnoe-testirovanie/testirovanie-prosmotrennykh-tovarov.md b/mobilnoe-testirovanie/testirovanie-prosmotrennykh-tovarov.md new file mode 100644 index 0000000..8111a1f --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-prosmotrennykh-tovarov.md @@ -0,0 +1,20 @@ +# Тестирование просмотренных товаров + +Весьма популярная фича во многих маркетплейсах, которая выделяет просмотренные товары от непросмотренных в какой-либо ленте, чтобы пользователю было проще ориентироваться. + +**Немного ТЗ** + +* Карточка товара будет считаться просмотренной, если она была открыта и в ней хоть что-то показали пользователю без ошибок. Срок хранения «просмотренности» на клиенте составляет неделю. Затем товар помечается непросмотренным; +* Для авторизованных пользователей: если пользователь разлогинивается, то все статусы «просмотрено» сбрасываются; +* Для неавторизованных пользователей: если пользователь авторизуется, то все статусы «просмотрено» сохраняются; +* Также имеются и другие товары с различными статусами, которым отдаются приоритеты. + +**Как тестировать и на что обращать внимание** + +* **Логика**: с одной стороны, логика довольно простая, необходимо просмотреть товар, вернуться в ленту и проверить, появился ли статус «просмотрено». Не совсем так. Обращаем внимание на условие того, а при каком условии именно проставляется статус. Верно! Необходимо, чтобы не просто товар отобразился, проверить, отобразились ли данные по товару. Например, если вернуться «назад» когда товар не отобразился, то товар не будет засчитан как «просмотренный». А если пользователь не авторизован? Необходимо проверить кейсы, связанные с авторизацией и разлогином. Просмотренный товар неавторизованным пользователем должен либо помечаться просмотренным после авторизации, либо возвращаться в «непросмотренные» при разлогине. Проверяем срок хранения статуса «просмотрено» в течение N времени. А если товар неделю статус хранится на клиенте - в таком случае ждать столь продолжительное время не стоит, можно изменить в коде переменную, отвечающую за срок хранения статуса. +* **Верстка**: при добавлении различных новых бейджей стоит отдельное внимание уделять верстке карточек на разных устройствах с разным разрешением экрана и альбомной ориентации. +* **Дополнительные проверки**: в зависимости от реализации могут быть добавлены тултипы, попапы, тоасты - все это, разумеется, требует дополнительных проверок. Также не стоит забывать и про базовые кейсы при тестировании. + +Источники: + +* [Просмотренные товары](https://telegra.ph/Prosmotrennye-tovary-10-17) diff --git a/mobilnoe-testirovanie/testirovanie-push-uvedomlenii.md b/mobilnoe-testirovanie/testirovanie-push-uvedomlenii.md new file mode 100644 index 0000000..12ff873 --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-push-uvedomlenii.md @@ -0,0 +1,65 @@ +# Тестирование push-уведомлений + +**Push-уведомления** - это сообщения, отправляемые приложением на мобильное устройство клиента. Они обычно используются для доставки обновлений продуктов, напоминаний, персонализированных предложений, последних новостей и любой информации, которая является неотъемлемой частью функциональности приложения и требует особого внимания или быстрых действий. + +**Принцип работы push-уведомлений** + +* пользователь устанавливает приложение на устройство; +* выдается запрос прав на отправку уведомлений, и в случае успеха - ОС получает токен (идентификатор устройства) у службы push-уведомлений; +* ОС передает токен на сервер для подключения к уведомлениям; +* сервер шлет уведомления при наступлении определенного события. + +В случае iOS уведомления работают через облачную платформу APNS (Apple Push Notification Service). + +Если говорить о решении пуш-уведомлений от Android, то есть несколько вариантов. Самый простой способ действовать - использовать Firebase Cloud Messaging (для устройств Android с Google Apps). Если у ваших пользователей есть устройства Huawei (а именно, без Google Apps), вам следует прибегнуть к Huawei Push Kit. + +Конечно, вы также можете создать собственного провайдера push-уведомлений или использовать готовые проекты, поскольку платформа имеет открытый исходный код. + +**Разница между push-уведомлениями в iOS и Android** + +Функции push-уведомлений в iOS и Android довольно сильно различаются. + +iOS основана на модели push Opt-In, которая не позволяет брендам отправлять мобильные push-уведомления пользователям своих приложений до тех пор, пока эти пользователи не согласятся их получать. Android, с другой стороны, автоматически разрешает пользователям получать push-уведомления с возможностью отказаться от них вручную. + +Подход Android по сравнению с iOS по умолчанию дает более широкую аудиторию пользователей с поддержкой push. Однако, когда у пользователей нет возможности легко отказаться от их получения, нерелевантные или слишком частые уведомления могут подтолкнуть клиентов отключить сообщения или удалить приложение. + +**Тестирование push-уведомлений** + +**Не приходят push-уведомления**: Чтобы разобраться в причине, для начала проверьте, чтобы в меню устройства была активирована соответствующая функция (разрешены уведомления для конкретного приложения). Затем убедитесь, что не включен режим «Не беспокоить». Если всё настроено правильно, но уведомления не приходят, попробуйте перезагрузить устройство и заново авторизоваться в приложении. Бывает так, что необходимо заново отправить push-токен на серверную часть сервиса. Проверьте также, какой стиль уведомления используется (необходим «Баннер» либо «Предупреждение»). Если не помогло всё перечисленное, попробуйте перезайти в свою учетную запись магазина приложений, либо откройте саму программу, в том случае, если на другие приложения тоже не приходят push-уведомления (стоит также проверить наличие интернета на устройстве). + +**Переходы по push-уведомлению**: При тестировании необходимо проверить такие сценарии (с учётом того, что пользователь может быть авторизован или неавторизован): + +* переход по push-уведомлению с заблокированного экрана; +* переход по push-уведомлению из «шторки»; +* пользователь находится в приложении; +* переход по push-уведомлению при свёрнутом приложении; +* пользователь разлогинился после получения push; +* переход по push-уведомлению с включенным «Don't keep Activities» (характерно для Android-приложений). + +Существуют push-уведомления, которые ведут на определенный экран с выбором определенных фильтров. В таком случае необходимо проверить, что переход осуществляется на правильный экран. Если это был поисковой запрос, то проверьте, что текст поискового запроса отображается в строке поиска и выдача товаров соответствует поиску. Также могут передаваться определенные фильтры, в таком случае необходимо проверить, что выбраны все «зашитые» фильтры. + +Если push-уведомление ведет на WebView, то проверьте, что WebView открывается корректно на обеих платформах. И что в push зашит корректный URL. + +**Устаревший push-токен**: У устройства изменился push-токен, когда восстановили приложение из резервной копии системы и не передался новый push-токен. + +**Очередь со стороны Apple**: В Apple большая очередь на отправку push-уведомлений, они приходят с задержкой (Apple не гарантирует доставку push). + +**Проверка максимального и минимального количества отображаемых символов**: В iOS и Android имеется лимит отображаемых символов. Он разный. Максимальное значение количества символов для платформы iOS - ограничение в 4 строки (178 символов), а для Android - не более 13 строк (663 символа). Не забудьте также проверить push-уведомление, содержащее минимальное количество символов, для обоих платформ можно задать 1 символ. + +**Кастомный звук для push-уведомления**: При тестировании push-уведомлений важно учитывать тот факт, что звук push-уведомления может быть задан кастомный. В таком случае необходимо проверять и звуковое сопровождение нотификации. + +**Изображения в push-уведомлениях**: Push-уведомление может содержать изображение, при отправке пуша - клиент получает ссылку на изображение и перед показом загружает его, далее происходит процесс обогащения пуша картинкой - она устанавливается. Уведомление отображается после загрузки картинки. Если push-уведомление содержит картинку, необходимо проверить, что она отображается. + +**Локальные push-уведомления**: Локальные уведомления планируются самим приложением и служат для своевременного и актуального информирования пользователей, пока приложение не работает на переднем плане. Чтобы уведомление отобразилось, его необходимо запланировать самому пользователю. В таких случаях проверяем кейсы, связанные с таймингом отправки сообщения. + +**Проблемы на серверной стороне**: В другие приложения приходят push-уведомления, но не приходит на наше, хотя push-токен отправлен на сервер. Стоит проверить корректность отправки push на другие аккаунты сервиса и другие устройства. При отсутствии push-уведомлений сообщите команде серверной разработки. + +Источники: + +* [Тестирование push-уведомлений в мобильных приложениях](https://habr.com/ru/company/youla/blog/553762/) +* [Механизм пуш-уведомлений для iOS и Android](https://macdays.ru/soft/mehanizm-push-uvedomlenij-dlya-ios-i-android/) + +Доп. материал: + +* [Отправка push-уведомлений с помощью Firebase Cloud Messaging](https://medium.com/nuances-of-programming/%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-push-%D1%83%D0%B2%D0%B5%D0%B4%D0%BE%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-firebase-cloud-messaging-66e329fdfdc2) +* [Отправка push-уведомлений в приложение для iOS с помощью облачных сообщений Firebase](https://code.tutsplus.com/ru/tutorials/get-started-with-firebase-messaging-for-ios--cms-32126) diff --git a/mobilnoe-testirovanie/testirovanie-reklamy.md b/mobilnoe-testirovanie/testirovanie-reklamy.md new file mode 100644 index 0000000..ae2bba5 --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-reklamy.md @@ -0,0 +1,103 @@ +# Тестирование рекламы + +Для тестирования в основном используется тестовая реклама, которую партнёры готовят заранее. Это делается, потому что разные характеристики рекламы на продакшене не позволяют быть уверенным, что новый функционал или фикс бага не задели основные параметры и работу рекламного креатива. + +Но получение тестовой рекламы требует изменения определённых параметров в наших экспериментах, обращения к тестовой админке медиатора, добавления тест-мода (специальные параметры, чтобы партнер понимал, что запрашивается именно тестовый креатив), использования своей дебаг-панели, а также VPN по странам, а в отдельных кейсах - по городам. И тут нам понадобятся некоторые инструменты. + +**Инструменты** + +* Сниффер для анализа трафика; +* Админка у медиатора, где можно настроить получение рекламы от конкретного партнера на свой тестовый юнит (специальный id, используя который, паблишер запрашивает рекламу у медиатора); +* Своя админка с фича-тогглами, где можно включить/отключить, или изменить наши эксперименты; +* Наша дебаг-панель; +* VPN; +* Внешние гайдлайны; +* Внутренняя база знаний и Confluence для её хранения; +* Чек-листы; +* TMS. + +**Инструмент №1. Charles**. Активно используется не только тестировщиками, но и разработчиками. Практически все задачи требуют замены продакшн параметров на тестовые. Например, часто возникает необходимость добавить в конфиг эксперимент или обращаться к тестовым юнитам медиатора. К тому же для тестирования при запросе рекламы необходимо добавлять дополнительные параметры тест-мода. Также довольно часто требуется имитировать проблемы с загрузкой креативов и проверять их с нужными параметрами, например, во время регрессионного тестирования. + +**Инструмент №2. Тестовая админка медиатора**. Медиатор - это специальная платформа, которая позволяет подключать приложение сразу к нескольким рекламным сетям, а также управлять показом рекламы (например, Google AdMob, Fyber и другие). Ещё во время онбординга мы проводим обучающие курсы по рекламе, где сотрудники в тестовой админке медиатора создают свой тестовый юнит для настройки параметров рекламы под себя. + +**Инструмент №3. Админка с фича-тогглами**. Практически все рекламные (и не только) механики в приложении iFunny закрыты под фича-тогглы (механизм реализации, при котором часть кода прячется за флаг, контролирующий его включение или выключение). Это нужно, чтобы сделать более надёжным и безопасным выпуск той или иной функциональности. Чтобы получить нужный для тестирования конфиг, мы используем нашу админку с фича-тогглами или подменяем параметры, используя Charles. А эксперименты помогают понять, какая из запущенных гипотез является наиболее оптимальной. Всё это есть в нашей админке, которая хранит данные и управляет ими по всем фичам и экспериментам. Документацию обновляем и дополняем по мере необходимости: если после обновления SDK изменилась описанная логика работы, или если вышли нормативы/регламенты, требующие внесения обязательных правок. + +**Инструмент №4. Дебаг-панель**. Для удобства разработали свою рекламную дебаг-панель, которая представляет собой отдельный интерфейс и в большинстве случаев позволяет локально на клиенте настроить необходимые параметры, заменяя собой практически все инструменты, описанные выше. + +![https://hsto.org/r/w1560/getpro/habr/upload\_files/16d/042/758/16d0427580bad8c30051d400f256a378.jpeg](https://hsto.org/r/w1560/getpro/habr/upload\_files/16d/042/758/16d0427580bad8c30051d400f256a378.jpeg) + +**Инструмент №5. VPN**. В основном используется для проверки задач, связанных с GDPR и CCPA. Для тестирования GDPR подходит VPN с возможностью получения IP европейской страны. Для тестирования CCPA необходим VPN с возможностью получения калифорнийского IP. + +**Инструмент №6**. Внешние гайдлайны. В работе с рекламными SDK часто используем их официальную документацию, где можно получить: + +* рекламные креативы и их идентификаторы, которые используются для настройки и получения тестовой рекламы; +* форматы запросов и ответов рекламной SDK, а также параметры, из описания которых понимаем, за что они отвечают, и какие возможные значения для них допустимы; +* changelog изменений рекламных SDK - чтобы понять, на какие изменения при обновлении SDK нужно обратить внимание во время тестирования. + +**Инструмент №7**. Внутренняя документация. Внешние гайды не всегда являются достаточно подробными. Кроме того, проверка одной и той же функциональности от разных SDK требует переключения между разными источниками для поиска необходимой информации. Поэтому оказалось удобным агрегировать информацию из разных гайдлайнов SDK и делать сборную внутреннюю документацию в нашем Confluence, дополняя ее своими комментариями. + +**Инструмент №8. Чек-листы**. Наравне с внешней и внутренней документацией для проверок различных задач используем чек-листы (пример можно посмотреть ниже в разделе про обновление SDK). Для такого типа задач, как проверка обновлений SDK, обновлений медиатора или адаптеров, мы используем уже составленный чек-лист, который изменяется по мере необходимости. Для остальных задач составляем чек-листы либо в процессе разработки задачи, либо непосредственно перед тестированием, в зависимости от сложности задач. + +**Инструмент №9. Тест-кейсы**. Тест-кейсы - неотъемлемая часть тестирования любого проекта/функциональности, в том числе рекламы. Тест-кейсы разделены по приоритетам, что позволяет использовать risk-based testing, о котором будет рассказано подробнее ниже. В тест-кейсах фигурируют такие проверки, как загрузка и показ рекламы, запросы на рекламу, работа разных механик (например: водопад, аукцион), а также запрос и отображение рекламы от партнерских рекламных сетей. Данные проверки в полной мере позволяют убедиться, что рекламный функционал работает без сбоев/корректно. + +**Задачи** + +Тестирование рекламных интеграций, чтобы все механики работали как часы - довольно трудоемкий процесс. Среди всех задач есть много рутинных, но они компенсируются интересными и технически сложными исследованиями по ходу проработки других задач. + +Разберем, с чем приходится сталкиваться на постоянной основе: + +* Обновление SDK; +* Тестирование форматов; +* Безопасность; +* Регрессионное тестирование; +* Смоук тестирование; +* Другие задачи (юридические вопросы, локализации, эксперименты, аналитика, рефакторинг и так далее). + +**Задача №1. Обновление SDK**. Можно сказать, что обновление SDK - наиболее популярная задача в рамках тестирования рекламы. Из-за частого проведения тестирования обновлений SDK (а также медиатора или адаптеров) составили чек-лист проверок: + +* Вёрстка. Проверяем всё: центрирование, размер, отображение на устройствах с разными разрешениями экранов. +* Пользовательские сценарии. Тап по контенту/кнопке и по privacy icon, возврат в приложение, воспроизведение и остановка видеорекламы. +* Репорт (отправка жалоб, связанных с рекламой). Пользователь может пожаловаться на рекламный контент или сообщить о технических проблемах. +* Соответствие стандартам [GDPR](https://habr.com/ru/company/digitalrightscenter/blog/344064/) и CCPA. +* Отправка аналитики. Внутренняя и внешняя (партнёру и медиатору). +* Технические проверки. Например, уход в фон во время загрузки рекламы. + +**Задача №2. Тестирование форматов**. Баннерная и нативная рекламы у нас закрепились и работают стабильно, но мы пробуем интегрировать и другие виды, в частности, fullscreen-рекламу. В целом, тестирование Rewarded Video и Interstitial во многом схоже с тестированием других видов: проверяется корректная загрузка и отображение рекламы, а также отправка аналитики. + +Ключевым в проверке fullscreen-рекламы является ее отображение на разных по диагонали экранах, например, на смартфоне и планшете. Важно, чтобы появившаяся на экране реклама не перекрывалась другими элементами, и по завершению таймера скрывалась автоматически или тапом по крестику, возвращая пользователя в исходную точку приложения: + +Отдельно нужно сказать про механику Rewarded Video - после окончания просмотра рекламы (или просмотра до определенной временной метки) пользователь должен получить вознаграждение. Поэтому очень важно хорошо протестировать этот функционал. + +Подробно про разные форматы мобильной рекламы мы уже писали в отдельной [статье](https://habr.com/ru/company/funcorp/blog/549730/). + +**Задача №3. Безопасность**. Чтобы следить за качеством трафика, интегрировали в iFunny внешнее антифрод-решение. В него для дополнительной проверки атрибуции показов и кликов на каждое событие генерируется новое. На стороне системы с помощью технологий машинного обучения и большого объема накопленных данных происходит дальнейший анализ. Со своей стороны мы проверяем отправку и разметку событий для разных сетей и разных типов рекламы. + +**Задача №4. Регрессионное тестирование**. Раз в две недели iFunny релизится на iOS и Android. Независимо от количества рекламных задач, попавших в релизную ветку, мы проводим регрессионное тестирование рекламного функционала/блока. В регрессионных паках собраны следующего рода проверки: + +* Основные проверки, что реклама запрашивается и отображается на нужных экранах приложения; +* Работа нативной и баннерной рекламы, а также рекламных сетей, с которыми сотрудничаем - по сути, это упрощенный чек-лист, используемый для тестирования SDK (добавления, обновления); +* Работа разных механик: водопад и биддинг (что это такое, можно ознакомиться [здесь](https://habr.com/ru/company/funcorp/blog/467979/)); +* Проверка на соответствие юридическим нормам; +* Проверки каких-то наших внутренних разработок (например, эксперименты с дизайном). + +Если встречаем проблемы в процессе тестирования (не проходят какие-то кейсы регресса), то чиним в текущей релизной ветке - не катимся с рекламой, которая не работает. + +Проведение полного ручного прогона регресса занимает порядка 2-3 дней. Поэтому, чтобы сократить время прохождения регресса, используется практика проведения Risk-based testing (вид тестирования, основанный на вероятности риска). Суть такого тестирования - исключить некоторое количество тест-кейсов из прогона, проведение которых не может выявить потенциальных ошибок на текущем релизном билде. Иными словами, кейс не имеет смысла включать в регрессионное тестирование, если при разработке не был затронут функционал, проверяющийся в кейсе. + +**Задача №5. Смоук тестирование**. Перед тем, как выкладывать сборку в сторы, а также при тестировании хотфиксов, мы прогоняем смоук тесты. В рамках смоук тестирования реклама проверяется, но не так детально, как при регрессе. Мы тестируем основные моменты, связанные с рекламой, а именно ее загрузку и отображение. + +**Задача №6. Другое**. К тестированию других задач можно отнести: + +* юридические задачи, например, связанные с GDPR и CCPA; +* задачи локализации (для пользователей iFunny из Бразилии); +* эксперименты, связанные с дизайном рекламы; +* задачи аналитики; +* рефакторинг, оптимизации. Например, оцениваем доступный нам для анализа контент на предмет валидности. + +Источники: + +* [Гайд по тестированию рекламы для мобильных приложений](https://habr.com/ru/company/funcorp/blog/562804/) + +Доп. материал: + +* [Реклама в мобильных приложениях](https://telegra.ph/Reklama-v-mobilnyh-prilozheniyah-10-24) diff --git a/mobilnoe-testirovanie/testirovanie-sokhranennykh-poiskov.md b/mobilnoe-testirovanie/testirovanie-sokhranennykh-poiskov.md new file mode 100644 index 0000000..5d9dcd9 --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-sokhranennykh-poiskov.md @@ -0,0 +1,78 @@ +# Тестирование сохраненных поисков + +Сохраненные поиски - удобный инструмент, с помощью которого можно сохранить необходимый запрос и быть в курсе о новых поступлениях. Это удобно так как: + +* не нужно каждый раз выставлять параметры и фильтры поиска заново, вы сразу переходите к нужным результатам; +* вы получаете уведомления о новых объявлениях сразу после их публикации. + +**Сохранение поискового запроса неавторизованным и авторизованным пользователями** + +Разумеется есть два вида пользователей: авторизованный и неавторизованный. Если мы сохраняем поисковой запрос будучи неавторизованным пользователем, в таком случае проверяем, что выполняется переход на экран авторизации и после авторизации или регистрации пользователя, поисковой запрос добавляется в раздел "избранное". Кейсы, на которые стоит обратить внимание, если пользователь новый, то ему должны отобразиться все необходимые попапы, тултипы, онбординги. Есть большая вероятность, что про них могли забыть.\*\* \*\*При сохранении поискового запроса авторизованным пользователем, все гораздо проще - поиск сохраняется, а сохраненный поиск пользователь может обнаружить на экране с сохраненными поисками (о нем мы поговорим несколько позже). + +**Текстовый поиск** + +Не всегда пользователь хочет задавать фильтры для поискового запроса, а желает ограничиться например только одним текстовым поиском. При сохранении текстового поиска необходимо проверить, что на бэк с клиента уходит корректный запрос, в котором передается параметр с нашим поисковым запросом. Также стоит учесть кейсы, когда значение параметра, содержащего поисковой запрос, оказалось пустым, а также кейсы, когда в параметре содержится эмодзи. + +**Поиск с выбранными фильтрами** + +Наиболее распространенный кейс, когда пользователь задает специфичный поисковой запрос и хочет его сохранить. Например пользователь ищет автомобиль со множеством фильтров. + +В данном кейсе необходимо проверить сохранение при различных комбинациях фильтров, а также что все фильтры корректно передаются с клиента на бэк. В дальнейшем, разумеется, при открытии сохраненного запроса со множеством комбинаций фильтров, стоит проверить, что все фильтры, пришедшие с бэка, корректно отображаются у пользователя и поисковая выдача соответствует запросу. + +**Настройка частоты уведомлений при сохранении** + +Пользователь может настроить частоту уведомлений о новых поступлениях. Мы выбираем определенный параметр, который в данном случае передается на бэк. А уже в дальнейшем, в соответствии с заданными параметрами, будет приходить push-уведомление клиенту. Как и в предыдущих кейсах, стоит проверить, что передается корректное значение параметра частоты уведомлений, а также это выбранное значение отображается на клиенте. + +**Отображение сохраненного поискового запроса** + +Пользователь сохранил поисковой запрос. А теперь рассмотрим кейсы, которые стоит учесть при тестировании экрана, где отображаются все сохраненные поисковые запросы. + +**Текстовый поисковой запрос (длинный текст)** + +Стоит учесть, что пользователь может сохранить поисковой запрос с абсолютном разным количеством символов, поэтому обращаем внимание на проверки, когда оставшиеся символы должны скрываться под многоточие. + +**Сохраненный поиск с выбранными фильтрами** + +Как мы уже говорили выше, когда мы ищем тот или иной товар, мы задаем определенные фильтры. Это может быть определенная стоимость, наличие доставки, удаленность от нас, наличие скидки и многое другое. Фильтров может быть много, поэтому не всегда они все могут поместиться в ячейке. В данном случае, фильтры, которые не поместились, должны скрываться также под многоточие. + +**Поисковой запрос с emoji** + +Пользователь может выразить свои эмоции и добавить в поисковой запрос, например эмодзи. Стоит проверить как корректное сохранение поискового запроса, так и отображение товаров по данному поиску. + +**Карусель товаров в сохраненном поиске** + +По определенному запросу может быть много товаров. Сгруппированные товары по категории располагаются в карусели. Естественно не все товары будут помещаться, поэтому пользователь должен иметь возможность просмотреть ленту со всеми товарами из карусели. Для начала, стоит проверить отображение разного количества товаров (минимальное и максимальное значение). Следом, стоит проверить скролл товаров в карусели. Также проверяем переходы из карусели на ленту с товарами. Для этого может быть реализована кнопка в конце карусели, например "Посмотреть все объявления", либо активное название карусели, например, при тапе на заголовок "телефоны", у нас откроется лента с товарами, выбранными в соответствии с заданными фильтрами. + +**Сохраненный поиск без подходящих товаров** + +Предположим, пользователь задал такой поисковой запрос, по которому в выдаче на данный момент нет подходящих товаров? В таком случае он может сохранить такой запрос, а на экране сохраненных поисков уже карусели с товарами не будет. Когда товары, соответствующие запросу появятся на сервисе, то они отобразятся пользователю в карусели товаров. + +Необходимо учесть, что может быть как один товар, так и n-количество товаров, соответственно скролл товаров в карусели должен работать корректно, а также все атрибуты превью карточки товара (стоимость, название, "сердечко" избранного) отображаются на карточке. + +**Настройка частоты уведомлений о новых поступлениях** + +Поиск может быть нам интересен по-разному. Например, мы очень хотим не пропустить появление нового товара, в таком случае выберем "Уведомления сразу", либо не хотим получать уведомления часто и предпочтем "Уведомления раз в день". В любом выбранном нами случае, мы должны получать уведомления ровно столько раз, сколько мы выбрали в настройке. + +**Настройка частоты уведомлений, если уведомления отключены** + +А если пользователь отключит в настройках уведомления? В таком случае подписаться на поиск и настроить уведомления не получится. Однако можно перейти в настройки и включить уведомления. Тут важно проверить переход между приложением и экраном настроек уведомлений. + +**Удаление поиска** + +Пользователю может быть не интересен поисковой запрос и он захочет его удалить. В данном случае, удалить поиск возможно из боттомшита "Подписка на поиск". После удаления проверяем то, чтобы поиск исчезал с экрана "Поиски", а также верстку ленты с сохраненными поисками. Она не должна ломаться. Также стоит учесть кейсы с отключенным соединением с интернетом. + +**Каунтеры поисков** + +Каунтеры - счетчики, которые служат для интерактивного отображения какого-то количества: новые товары, сообщения, избранное и многое другое. Разумеется, при появлении нового товара в сохраненном поиске, информация об этом товаре придет к нам с бэка. Каунтеры приходят также с бэка. Основные кейсы при тестировании счетчиков будут связаны с удалением товаров и проверки, что значение каунтера изменилось в меньшую сторону, а также, что при поступлении нового товара каунтер изменяется в большую сторону. Но это не все. Стоит проверить максимальное отображаемое значение (в кружке) для каунтера, например, если товаров будет более 100. В таком случае реализация может быть разной, например отображаться значение 99+. Также может отображаться полностью значение счетчика, например 115, тогда следует исходить из логики работы приложения и проверить как будет отображаться максимально допустимое значение (например, вряд ли в приложении для заказа пиццы, пользователь добавит в заказ 124 455 пицц). + +**Уведомления по новым товарам в сохраненном поиске** + +При тестировании push-уведомлений по новым товарам стоит выполнять проверки, характерные для тестирования пушей. В данной статье не будем затрагивать все кейсы при тестировании push-уведомлений, так как они описаны в одной нашей статье. + +**Дополнительные проверки** + +В зависимости от реализации могут быть добавлены тултипы, попапы, тоасты - все это, разумеется, требует дополнительных проверок. Также не стоит забывать и про базовые кейсы при тестировании. + +Источники: + +* [Тестирование сохраненных поисков](https://telegra.ph/Testirovanie-sohranennyh-poiskov-05-20) diff --git a/mobilnoe-testirovanie/testirovanie-trebovanii-k-mobilnym-prilozheniyam.md b/mobilnoe-testirovanie/testirovanie-trebovanii-k-mobilnym-prilozheniyam.md new file mode 100644 index 0000000..fca7b79 --- /dev/null +++ b/mobilnoe-testirovanie/testirovanie-trebovanii-k-mobilnym-prilozheniyam.md @@ -0,0 +1,177 @@ +# Тестирование требований к мобильным приложениям + +Шпаргалка-чеклист для ревью ТЗ к мобильному приложению: + +**Общие вопросы по приложению** + +* Для каких платформ будет разрабатываться приложение и какие версии ОС будут поддерживаться? Необходимо всегда помнить о минимальной поддерживаемой версии ОС. Иначе можно обнаружить, что функциональность не работает у пользователей, когда задача уже закрыта. +* На каких устройствах необходимо проверить приложение? Например, приложение должно работать как на смартфонах, так и на планшетах. Или должна быть поддержка Apple Watch. +* Какую ориентацию экранов поддерживает приложение? Портретная и/или ландскейп? Неприятный момент: если смена ориентации экрана хорошо работает на смартфонах, это не значит, что всё будет так же на планшетах. +* На каких девайсах приоритетнее всего смотреть? На ваших девайсах приложение может идеально работать, а вот у заказчика на любимом (вставьте китайский android-смартфон) все разъехалось... +* Должен быть идеальный пиксель-перфект или допускаются некоторые погрешности? Привет, тестирование на соответствие макетам! Ещё неплохо уточнить, должна ли растягиваться вёрстка или под каждый размер экрана должны быть свои макеты? +* Существуют ли другие клиентские приложения? Например, есть админка, которая внезапно начнет удалять или добавлять элементы. Или веб-версия, которая существует уже в продакшене. Главное - узнать об этом как можно раньше. +* Есть ли какие-то внешние устройства, которые могут повлиять на логику мобильного приложения? Например, beacon'ы, отправляющие сигналы приложению, или принтеры, печатающие информацию из приложения. +* Какая целевая аудитория у приложения? Все пользователи в Play Market/AppStore или 50 человек в компании заказчика? + +**Разбор приложения по экранам** + +* Состав экрана и возможные действия на нем. Из каких элементов состоит экран? Какие действия можно совершить? Какие состояния экрана возможны? Какие есть переходы и на какие экраны они ведут? Что должно отображаться при возврате на этот экран? Ответы на эти вопросы необходимо найти, а лучше зафиксировать в документации. +* Взаимодействие с сервером на экране. Какие запросы идут на экране? Понимание того, какие запросы на сервер отправляются на экране, поможет выявить такие требования, которые не сможет реализовать сервер по тем или иным причинам. +* Активность по таймеру. Например, отправляется важная аналитика раз в две минуты или идет обновление данных. +* Кэширование данных. Загрузка одних и тех же данных при каждом входе на экран может раздражать пользователей. При кэшировании необходимо продумать, когда должна обновляться информация на экране? Когда должен очищаться кэш? +* Заглушки. Что отображается, если данных нет? Пустой экран - неинформативный для пользователя. А съехавшая заглушка может быть поводом для недовольства заказчика. +* Поведение в случаях ошибки. Что должно отображаться, если произошла ошибка? Например, отсутствие интернета, серверная или незадокументированная ошибка. +* Медленная загрузка данных. Что должно происходить при медленной загрузке данных? Лоадеры, блокировка действий, кастомные анимации - всё должно быть продумано. +* Действия, которые влияют на поведение других экранов. Как действие на одном экране повлияет на поведение на других? Сквозные действия - опасная штука. Особенно, если разработка и тестирование идет по экранам или по отдельным фичам. Тут без регрессии обойтись сложно. Поэтому на некоторых проектах, прежде чем писать тест-кейсы, мы строим матрицу влияния для новых фич. +* Обновление данных на экране. Когда происходит обновление? Есть следующие варианты и они могут сочетаться: + * Каждый раз при открытии экрана (данные живут только пока у пользователя открыт экран). + * Каждый раз при запуске приложения (данные живут только пока у пользователя запущено приложение). + * По pull-to-refresh'у/по специальной кнопке обновления/по таймеру (данные хранятся в локальном хранилище устройства и при перезапуске приложения восстанавливаются). + +Далее рассмотрим функциональность, которая часто используется в приложениях. + +**Навигация в приложении** + +* С помощью бокового меню. Какие разделы являются корневыми? Какие разделы открываются поверх корневых? Сбрасывается ли история переходов между корневыми разделами? +* С помощью таббара. Остаётся ли таббар на экране при углублении по навигации внутри раздела? Возвращает ли на корневой экран при повторном тапе на разделе? +* Различие в переходах между аппаратной и программной кнопкой «Back» в Android. + +**Локализация** + +Виды поддерживаемой локализации: + +* Тексты зашиты внутри приложения. Пользователь в настройках приложения может выставить необходимый язык. +* Тексты зависят от языка в системных настройках. Язык определяется в зависимости от установленного языка в системных настройках. +* Тексты приходят с сервера. Тексты приходят с сервера, и язык зависит либо от настроек устройства, либо от настроек приложения. + +**Разрешения** + +* Запрос на доступ к нотификациям, геолокации, галерее, камере, смс… Кастомный экран или просто системный алерт? +* Пользователь отказался предоставить доступ. Как приложение поведет себя в этом случае? Предусмотрена ли логика перезапроса на доступ? +* Пользователь отключил в системных настройках доступ (см. пункт выше). + +**Списки** + +Часто мобильные приложения включают в себя списки. Для них стоит обратить внимание на следующие моменты: + +* Первая загрузка списка. Сколько элементов загружаются за один раз? Что происходит при загрузке? Какое максимальное время может загружаться список? +* Наличие пэйджинга. Есть ли подгрузка элементов при скролле или весь список загружается за раз? Если есть подгрузка, то обязательно надо проверить, что элементы на границах не пропадают и не дублируются. +* Обновление списка (см. варианты выше). +* Наличие разделов. +* Наличие фильтров/сортировок. Фильтр может быть локальным или серверным. Для списков, которые загружаются целиком или зашиты внутри приложения, фильтры чаще всего локальные, и тестирование их не вызывает особых трудностей. Для списков с подгрузкой фильтры могут повлечь большое количество проверок. Аналогично для сортировок. +* Состав каждого элемента в списке. Тут может быть как элементарный текст, так и целые экраны со своей внутренней логикой. +* Взаимодействие с элементами. Добавление нового элемента, удаление, скрытие, перетаскивание. +* Синхронизация списка между всеми устройствами. В качестве примера можно привести синхронизацию файлов после его изменения на всех устройствах. +* Сохранение позиции скролла. При переходах между разделами или при возвращении на экран со списком может быть очень важной фичей. Например, если это лента постов. + +Поиск по списку + +* Онлайн/оффлайн поиск. С оффлайновым поиском всё просто. По сути, это локальный фильтр. Для онлайнового поиска, так же как и для онлайновых фильтров, кейсов будет гораздо больше. +* Посимвольный поиск или поиск по нажатию на кнопку поиска. Обратите внимание, для посимвольного поиска должно быть ограничение на количество запросов, иначе сервер может начать игнорировать спам от приложения. +* Очистка поисковой строки. +* Наличие подсказок. +* Наличие истории запросов. + +**Форма ввода** + +* Перечень полей с их описанием и особенностями. +* Условия сохранения и сброса данных в полях. Когда и какие поля должны сохранять свои значения? Когда очищаться? +* Ограничения на количество и вид символов. +* Клавиатура для ввода данных по выбранному полю. Вид клавиатуры: цифровая или символьная. Должна ли клавиатура сдвигать контент при открытии? При каких условиях она должна закрываться? +* Логика переходов между полями. По кнопке «Далее», по «Next» на клавиатуре. +* Валидация некорректно введенных данных. Проверки на сервере или на клиенте. +* Автозапросы на сервер при определенных условиях. Например, если пользователь ввел 6-значный код подтверждения. + +**Учетные записи** + +* Требования к регистрации и авторизации пользователей. Есть ли возможность регистрации не через мобильное приложение? +* Восстановление учетной записи. Например, если пользователь забыл пароль от приложения. +* Логаут. Очистка данных (в частности, сброс привязки пуш-нотификаций) для учетной записи. +* Авторизация по смс-коду. Должны учитываться кейсы с телефонным номером, его форматом, кодом возможных стран. Переотправка смс в случае проблем с получением. +* Авторизация через соцсети (см. подробности ниже в разделе «Регистрация/авторизация через соцсети»). +* Авторизация на нескольких устройствах одновременно. Автологаут или обработка синхронизации данных. +* Обработка ошибки неверного, устаревшего токена учетной записи. +* Изменение данных учетной записи. Например, смена пароля. + +**Регистрация/авторизация через соцсети** + +* Создание учетной записи при первой авторизации через соцсеть. +* Подгрузка данных из соцсети. Синхронизация при их изменении в соцсети. Например, имя-фамилия пользователя и аватарка. +* Авторизация через мобильное приложение, соцсети или браузер/вебвью. +* Запрет доступа приложению к данным из соцсети. + +**Ролевая модель** + +* Описание ролевой модели. Какие действия доступны для каждой роли? +* Взаимодействие между представителями разных ролей. Взаимодействие между представителями одной роли. +* Переход пользователей от одной роли к другой. Какие действия для этого должны выполниться? +* Предполагаемое процентное соотношение представителей разных ролей. На какую роль обратить внимание в первую очередь? + +**Карта** + +* Первая загрузка карты. Какая область должна загрузиться? Где и в каком масштабе должна быть отцентрирована карта? +* Загрузка и отрисовка элементов. Должны ли загруженные элементы кэшироваться? Когда элементы должны обновляться? Этот момент очень важно продумать, чтобы обеспечить быструю загрузку данных и плавные перемещения по карте. +* Логика работы элементов на карте. Пины, попапы над пинами, карточки для пинов, построение маршрута. +* Поддержка масштабирования, вращения, наклона карты. +* Обновление геопозиции и отправка координат текущего местоположения при свернутом приложении. + +**Чаты** + +* Обработка кейсов, если отправка сообщений была при отсутствии интернет-соединения или при плохом интернете. Повторная отправка сообщений. +* Групповые чаты. Логика добавления/удаления собеседников в чате. Максимальное количество собеседников. +* Статусы отправки/получения сообщений. Тут лучше сразу обратить внимание на групповые чаты. Что считается прочитанным сообщением в групповых чатах? +* Подгрузка истории чата (см. вопросы для списков). +* Наличие дополнительных фич: удаление сообщений, отображение «Пользователь Х печатает», превью отправляемых файлов, пересылки сообщений. +* Механизм работы чата. Например, необходимо понимать принцип работы чата на сокетах, чтобы во время тестирования локализовывать баги и определять, на чьей стороне проблема. + +**Отправка файлов на сервер и скачивание на устройство** + +* Формат файлов. Какие форматы файлов система должна обрабатывать и на какие выдавать ошибку? +* Возобновление прерванной отправки/скачивания. Автоматическое или после подтверждения пользователя? +* Максимальное количество отправляемых/закачиваемых файлов. +* Нехватка памяти на устройстве для скачивания файла. На практике были случаи, когда памяти не хватает, чтобы не просто скачать файл, а даже сделать запись в базу данных. Такие проблемы приходилось обрабатывать. +* Отмена отправки/скачивания файла. +* Замена файла один на другой. +* Скачивание на внешнюю память SD Card. +* Скачивание в фоне при свернутом приложении. + +**Внешние устройства** + +* Подключение/отключение устройства. Канал связи, по которому оно взаимодействует с приложением (Wi-Fi/Bluetooth). +* Влияние внешнего устройства на логику приложения. +* Конфигурация внешнего устройства. Есть ли какие-то системы, которые администрируют внешнее устройство? +* Максимальное расстояние, на котором происходит взаимодействие. +* Сила/мощность сигнала. Выясните, от чего могут зависеть эти параметры? Например, если beacon спрятать в металлическую банку, то шансы на потерю его сигнала резко возрастает. +* Подключение нескольких внешних устройств одновременно. Например, переключение с одного устройства на другое может привести к любопытным кейсам. +* Подключение к внешнему устройству при свернутом приложении/при заблокированном экране. + +**Аудиоплеер/видеоплеер** + +* Поддерживаемые форматы файлов. +* Кэширование проигрываемого контента. Обязательно нужно понять, какой объем данных необходимо кэшировать для удобства пользователя. +* Проигрывание в фоне. Нужна ли подгрузка данных при свернутом приложении? +* Нотификация плеера в системной шторке. +* Интеграция с Bluetooth-гарнитурой, CarPlay и с другими внешними системами. + +**Оплата банковской картой** + +* Привязка к профилю и удаление банковской карты. Есть ли тестовое снятие минимальной суммы? Например, 1 рубль, который потом вернется на счет. +* Оплата привязанной картой. Например, будет ли повторный запрос на смс-подтверждение при последующих оплатах? +* Обработка ошибок при попытке привязать/оплатить по карте. +* Синхронизация списка карт при наличии нескольких клиентов в системе. Например, есть веб-версия и есть iOS-версия. +* Сканирование через камеру и распознавание номера карты. + +**Время, календарь, таймер** + +* Календарь/время. Влияет ли на логику приложения некорректно выставленная дата и время? Можно ли выбрать период? Какая область допустимых значений? +* Таймер. Локальный/серверный? Как происходит синхронизация серверного таймера? Например, в Android приложение может ориентироваться не на время, установленное на устройстве, а на время запуска устройства. Как бы пользователь не переводил часы в системных настройках, таймер не собьется. + +**Нотификации** + +* Вид нотификаций. Есть ли нотификации на определенные события, которые зашиты в приложение? Или push-нотификации, которые присылает сервер? +* Действия, которые доступны при нотификации. Что будет, если перейти по нотификации? Закрыть её? Что если нотификация устарела и она недоступна? +* Привязка нотификаций к определенной учетке. Какие действия указывают серверу, что один пользователь вышел и зашел другой? + +Источники: + +* [Шпаргалка по тестированию требований к мобильным приложениям](https://habr.com/ru/company/mobileup/blog/336992/) diff --git a/mobilnoe-testirovanie/tipy-mobilnykh-prilozhenii.md b/mobilnoe-testirovanie/tipy-mobilnykh-prilozhenii.md new file mode 100644 index 0000000..586b733 --- /dev/null +++ b/mobilnoe-testirovanie/tipy-mobilnykh-prilozhenii.md @@ -0,0 +1,115 @@ +# Типы мобильных приложений + +**Нативные приложения**: написаны на родном для определенной платформы языке программирования. Для Android этим языком является Kotlin/Java, тогда как для iOS - objective-С или Swift. Нативные приложения находятся на самом устройстве, доступ к ним можно получить, нажав на иконку. Они устанавливаются через магазин приложений (Play Market на Android, App Store на iOS и др.). Они разработаны специально для конкретной платформы и могут использовать все возможности устройства - камеру, уведомления и т.п. (при наличии разрешений). В зависимости от предназначения нативного приложения, оно может всецело или частично обходиться без наличия интернет-соединения; + +**Веб-приложения**: на самом деле не являются приложениями как таковыми. В сущности, они представляют собой сайты, которые адаптированы и оптимизированы под любой смартфон и выглядят похоже на нативное приложение. И для того, чтобы воспользоваться им, достаточно иметь на устройстве браузер, знать адрес и располагать интернет-соединением. Запуская мобильные веб-приложения, пользователь выполняет все те действия, которые он выполняет при переходе на любой веб-сайт, а также получает возможность «установить» их на свой рабочий стол, создав закладку страницы веб-сайта. Веб-приложения отличаются кроссплатформенностью, то есть способны функционировать, независимо от платформы девайса. Очевидным недостатком такого вида приложений является утрата работоспособности при потере интернет-соединения. Причем из этого выплывает и другой минус - их производительность, которая находится на среднем уровне, в сравнении с другими видами приложений и зависит от возможностей интернет-соединения провайдера услуг. Помимо вышеперечисленного, веб-приложения не могут получить доступ к функциям системы и самого устройства; + +**Гибридные приложения**: это веб-приложение в обертке нативного приложения, что служит контейнером для отображения веб-приложения через встроенный упрощенный браузер (webview в Android(Chrome webview в последней версии) и WKWebView в iOS). Нативный “фундамент” даёт преимущества нативных приложений: доступ к функционалу смартфона (API системы, пуши и т.п.), размещение в маркетах, иконка на рабочем столе и т.п., а сторона веб-приложений дает плюсы в виде кроссплатформенности и простоты обновления контента. Компания, имеющая веб-приложение, может практически “на коленке” собрать гибридные приложения для основных платформ и обеспечить себе присутствие в маркете и на рабочем столе клиентов; + +**Кроссплатформенные приложения**: которые иногда путают с гибридными. Такие приложения разрабатываются с помощью кроссплатформенных фреймворков: [React Native](https://reactnative.dev) (JavaScript), [Flutter](https://flutter.dev) (Dart), [Ionic](https://ionicframework.com) (JavaScript), [Xamarin](https://dotnet.microsoft.com/en-us/apps/xamarin) (.NET and C#) и т.п. и имеют общий код для iOS и Android. + +**Аналоги инсталлируемых приложений** + +* Progressive Web Apps (PWA); +* Google Play Instant (Android Instant Apps (AIA)); +* Accelerated Mobile Pages (AMP). + +**Progressive Web Apps (PWA)**: термин «прогрессивное веб-приложение» не является официальным названием. Это просто сокращение, которое изначально использовалось Google для обозначения концепции создания гибкого, адаптируемого приложения с использованием только веб-технологий. PWA - это веб-приложения, которые постепенно улучшаются, чтобы функционировать как установленные нативные приложения на поддерживаемых платформах, но при этом функционируют как обычные веб-сайты в других браузерах. Качества PWA сочетают в себе лучшее из Интернета и скомпилированных приложений. PWA запускаются в браузерах, как веб-сайты. Но PWA также имеют доступ к функциям приложений; Например: + +* PWA все еще может работать, когда устройство отключено; +* PWA можно установить в операционной системе; +* PWA поддерживают push-уведомления и периодические обновления; +* PWA могут получить доступ к аппаратным функциям. + +Кроссплатформенность таких веб-приложений не ограничивается мобильными устройствами. Например, на платформе Windows такие приложения тоже выглядят и существуют в системе точно также, как и нативные приложения: можно установить из стора, добавить ярлык в пуск, доступны File systems, Video, Audio, High-performance code, Databases, USB, Bluetooth и т.п., при этом все фактическое содержимое является веб-сайтом. + +На самом деле, скорее всего, вы раньше часто посещали PWA, даже не осознавая этого. Если вы когда-нибудь просматривали Instagram, Pinterest, Spotify или Tinder на своем ноутбуке или смартфоне, вы столкнулись с PWA. + +Таким образом, PWA имеют гораздо более низкую стоимость кроссплатформенной разработки, чем скомпилированные приложения, которым требуется определенная кодовая база для каждой платформы. + +Для того, чтобы веб-приложение можно было называть PWA, оно должно соответствовать определенным критериям: + +* Обнаруживаемое (**Discoverable**): Приложение можно обнаружить в результатах веб-поиска и в поддерживаемых магазинах приложений; +* Устанавливаемое (**Installable**): можно закрепить и запустить приложение с главного экрана; +* Возможность повторного вовлечения (**Re-engageable**): приложение может получать push-уведомления, даже если неактивно; +* Независимо от сети (**Network-independent**): приложение работает в автономном режиме и в условиях слабого подключения к сети; +* Прогрессивное (**Progressive**): UX увеличивается или уменьшается в зависимости от возможностей устройства; +* Безопасное (**Safe**): приложение обеспечивает безопасный HTTPS endpoint и другие меры безопасности для пользователей; +* Отзывчивое (**Responsive**): приложение адаптируется к размеру и ориентации экрана, методу ввода; +* Линкованное (**Linkable**): делитесь и запускайте приложение по стандартной ссылке. + +Итак, как можно ли узнать, является ли веб-сайт PWA? Ну, нет. По крайней мере, не совсем точно. Если вы не разработчик и не копаетесь в исходном коде сайта, у вас нет определенного способа точно сказать, построен ли сайт на технологии PWA. При этом есть несколько уловок, которые, хотя и не гарантируют точного результата, могут дать вам некоторые признаки того, что данный веб-сайт является PWA. + +* **Одностраничный сайт**. Это самый простой способ узнать, может ли веб-сайт быть PWA. Он основан на природе PWA: Progressive Web Apps технически представляют собой одностраничный веб-сайт. Это не означает, что веб-сайт, построенный на основе PWA, имеет только одну страницу. Это означает, что событие просмотра страницы происходит только один раз, когда пользователь изначально загружает сайт. После этого все загрузки страниц обрабатываются Javascript. Это отличается от обычных веб-сайтов, где каждое изменение страницы вызывает перезагрузку страницы вместе со всем исходным кодом HTML. Так как это работает? Что ж, очень просто: взгляните на активную вкладку в вашем браузере. Если сайт является PWA, при смене страниц сайт не перезагружается, что означает отсутствие анимации «загрузки» на вкладке браузера. Теперь давайте посмотрим на наш сайт [SimiCart](https://www.simicart.com/pwa.html/) в качестве примера. При смене страниц сайт не перезагружается! Технически вы просто все время остаетесь на одной «странице». Вот почему страницы PWA загружаются так быстро и плавно. Все страницы предварительно загружаются при первом посещении сайта и доставляются вам впоследствии. Они не зависят от скорости вашей сети и могут работать даже в автономном режиме! +* **Service Workers**. Service Workers - это название технологии, лежащей в основе прогрессивного веб-приложения, которая обеспечивает его автономные возможности, push-уведомления и кэширование ресурсов. Согласно Google, сервис-воркеры лежат в основе методов PWA. Итак, если мы сможем выяснить, использует ли веб-сайт технологию Service Workers, мы сможем сказать, может ли этот сайт быть PWA. Если вы используете браузеры на базе Chrome, вы можете легко это проверить с помощью Inspector Tool. Щелкните правой кнопкой мыши веб-сайт, который вы хотите проверить, выберите «Проверить элемент». Затем перейдите на вкладку «Приложение» - «Рабочие службы». Вы можете легко увидеть, есть ли на этом сайте Service Workers. Опять же, этот трюк только дает намек на то, что определенный веб-сайт является PWA. Несмотря на то, что Service Workers является основной частью PWA, они не являются эксклюзивной частью PWA. Веб-сайты, не относящиеся к PWA, также могут использовать Service Workers для улучшения своей функциональности. Если вы хотите узнать больше о PWA Service Worker, у нас есть [эксклюзивная статья](https://www.simicart.com/blog/pwa-service-worker/) для вас, чтобы узнать все об этой удивительной технологии. +* \*\*HTTPS \*\*secure origin. PWA работают только по HTTPS. +* **Manifest.json** - Имеется файл настроек. + +**Accelerated Mobile Pages (AMP)** + +Accelerated Mobile Pages (AMP) - это технология с открытым исходным кодом, позволяющая создавать веб-страницы, которые быстро загружаются в мобильных браузерах. Формат AMP состоит из: + +* AMP HTML - язык HTML, в котором часть тегов заменена на эквивалентные AMP-теги, а часть запрещена для использования; +* AMP JS - в работе используется собственная JS-библиотека, позволяющая элементам страницы загружаться асинхронно; +* Google AMP Cache - в процессе индексации AMP-страницы, поисковая система кэширует её данные и воспроизводит со своих серверов. + +Многие воспринимают AMP как способ положить статический контент своего сайта (статьи, новости, заметки и т.д.) в кэш Google, чтобы при открытии из поиска этот контент загружался мгновенно (о высокой скорости загрузки AMP страниц свидетельствует иконка молнии в результатах поиска :)). Естественно, если вам нужно добиться именно такого результата, то с AMP это сделать будет очень легко. Но AMP - это гораздо больше чем просто технология для работы со статическим контентом или кэшем Google. AMP уже давно используется как библиотека общего назначения, основанная на web компонентах, для создания быстрых динамических страниц и даже сайтов целиком, на которые пользователи попадают как из поиска, так и из других источников, включая прямые заходы. С этой точки зрения AMP можно поставить в один ряд с Polymer, React или Angular. Естественно с оглядкой на то, что AMP предназначена для простых (чтобы это не значило) сайтов, где основной упор делается на контент, а динамическая составляющая ограничена. + +Отдельно хочется отметить, что несмотря на название - Accelerated Mobile Pages, AMP может использоваться для создания любых сайтов, как десктопных, так и мобильных. Сайт проекта - [ampproject.org](https://amp.dev) является замечательным примером того, что можно сделать с AMP для десктопа. + +**Google Play Instant (Android Instant Apps (AIA))** + +Google Play Instant (прошлое название Android Instant Apps) - это функция, которая позволяет вам использовать приложение без необходимости полностью загружать его на свой телефон: просто найдите его в Play Store и нажмите «Открыть приложение». Более того, это позволяет вам перейти к определенному действию в приложении, которое вы не установили, просто нажав URL-адрес. Недавно Google добавил в Play Store кнопку «Попробовать» для некоторых приложений с мгновенным запуском Android. + +Например, если вам прислали ссылку на видео в Buzzfeed, то можно сразу же открыть её в приложении этого сервиса, даже если оно у вас не установлено. Ранее выбор был лишь либо отдельно установить приложение, либо перейти по ссылке в браузере. Конечно, это несколько дольше, чем просто открыть веб-страницу, но всё же намного быстрее, чем устанавливать целое приложение ради одной ссылки. Обещают, что занимать весь процесс открытия чего-либо во «мгновенных приложениях» будет несколько секунд. Однако полноценную функциональность установленного приложения вы не получите, будет загружено лишь то, что необходимо для выполнения текущего действия, например, просмотра видео. + +На странице часто задаваемых вопросов о приложениях Google с мгновенным запуском говорится, что эти приложения могут использовать следующие разрешения: + +* ОПЛАТА +* ACCESS\_COARSE\_LOCATION +* ACCESS\_FINE\_LOCATION +* ACCESS\_NETWORK\_STATE +* КАМЕРЫ +* INSTANT\_APP\_FOREGROUND\_SERVICE только в Android O. +* INTERNET +* READ\_PHONE\_NUMBERS только в Android O. +* ЗАПИСЬ АУДИО +* VIBRATE + +Все, что отсутствует в этом списке, не поддерживается Instant Apps. Обратите внимание, что такие вещи, как Bluetooth, установка будильника, использование отпечатков пальцев и установка обоев, отсутствуют. + +Другие ограничения включают отсутствие поддержки фоновых служб (приложений, которые могут запускаться без ведома пользователя), push-уведомлений, доступа к внешнему хранилищу или просмотра установленных приложений на устройстве. Приложения с мгновенным запуском также не смогут изменять настройки на устройстве пользователя, такие как обои. + +Ограничения на размер сборки: + +* Dynamic Feature Modules вообще не ограничены по размеру; +* Instant-Enabled Dynamic Feature Modules могут занимать до 10 Мб. + +Если ваша фича: + +* больше 10 Мб, то извините; +* от 4 до 10 Мб - доступна по кнопке «Попробовать» из Google Play и все; +* меньше 4 МБ - доступны все средства привлечения пользователей в Instant-Enabled модуль (запуск из рекламы, по ссылке, из сообщений и т.д.). + +Примерами Instant Apps являются BuzzFeed, Skyscanner, Onefootball, Red Bull TV, приложение UNS ShareTheMeal, Sports.ru, Vimeo и многие другие. + +Источники: + +* [What Is PWA? All You Need to Know About Progressive Web Apps](https://www.simicart.com/blog/what-is-progressive-web-app/) +* [Overview of Progressive Web Apps (PWAs)](https://docs.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/) +* [Используем AMP как библиотеку общего назначения для создания быстрых динамических сайтов](https://habr.com/ru/company/google/blog/419589/) +* [Приложения с мгновенным запуском Android - что они значат для пользователей и разработчиков?](https://android.inform.click/prilozhenija-s-mgnovennym-zapuskom-android-chto-oni-znachat-dlja-polzovatelej-i-razrabotchikov/) +* [Google Play Instant. Рефакторинг длиною в жизнь](https://habr.com/ru/company/oleg-bunin/blog/462511/) + +Доп. материал: + +* [Сайт, где можно узнать, что может PWA](https://whatpwacando.today) +* [12 Best Examples of Progressive Web Apps (PWAs) in 2021](https://www.simicart.com/blog/progressive-web-apps-examples/) +* [11 Best Progressive Web Apps (PWAs) Games in 2021](https://www.simicart.com/blog/pwa-games/) +* [Тестирование аналогов инсталлируемых приложений. Диана Пинчук. Comaqa Spring 2019](https://www.youtube.com/watch?v=i9kmWZGnVEY) +* [MDN Web Docs - Progressive web apps (PWAs)](https://developer.mozilla.org/en-US/docs/Web/Progressive\_web\_apps) +* [An Introduction to Progressive Web Apps](https://www.cloudways.com/blog/progressive-web-apps/) +* [All You Need to Know About Progressive Web App to Decide if Your Business Needs One](https://fulcrum.rocks/blog/progressive-web-app/) +* [Натив или гибрид? Специалисты Яндекса отвечают на главный вопрос мобильной разработки](https://habr.com/ru/company/yandex/blog/326882/) +* [Офф. дока Google Play Instant](https://developer.android.com/topic/google-play-instant) +* [Особенности тестирования приложения на Flutter под iOS и Android и чем оно отличается от тестирования нативного приложения](https://habr.com/ru/company/atisu/blog/598389/) diff --git a/obshee/README.md b/obshee/README.md new file mode 100644 index 0000000..976f522 --- /dev/null +++ b/obshee/README.md @@ -0,0 +1,2 @@ +# Общее + diff --git a/obshee/alfa-i-beta-testirovanie-alpha-testing-and-beta-testing.md b/obshee/alfa-i-beta-testirovanie-alpha-testing-and-beta-testing.md new file mode 100644 index 0000000..01fcdf0 --- /dev/null +++ b/obshee/alfa-i-beta-testirovanie-alpha-testing-and-beta-testing.md @@ -0,0 +1,38 @@ +# Альфа- и бета- тестирование (Alpha Testing and Beta Testing) + +_Альфа-тестирование (alpha testing): Моделируемое или действительное эксплуатационное тестирование потенциальными пользователями/заказчиками или независимой командой тестирования на стороне разработчиков, но вне разрабатывающей организации. Альфа-тестирование часто применяется к коробочному программному обеспечению в качестве внутреннего приемочного тестирования. (ISTQB)_ + +_Бета-тестирование (beta testing): Эксплуатационное тестирование потенциальными и/или существующими клиентами/заказчиками на внешней стороне никак не связанными с разработчиками, с целью определения действительно ли компонент или система удовлетворяет требованиям клиента/заказчика и вписывается в бизнес-процессы. Бета-тестирование часто проводится как форма внешнего приемочного тестирования готового программного обеспечения для того чтобы получить отзывы рынка. (ISTQB)_ + +Альфа- и бета-тестирование - это Customer Validation methodologies (Acceptance Testing types) которые помогают укрепить веру в запуске продукта и, таким образом, привести к успеху продукта на рынке. Несмотря на то, что они оба полагаются на реальных пользователей и обратную связь разных команд, ими движут разные процессы, стратегии и цели. Эти два типа тестирования вместе увеличивают успех и продолжительность жизни продукта на рынке. Эти этапы можно адаптировать к продуктам Consumer, Business или Enterprise. Этапы альфа- и бета-тестирования в основном сосредоточены на обнаружении ошибок в уже протестированном продукте и дают четкое представление о том, как продукт на самом деле используется пользователями в реальном времени. Они также помогают получить опыт работы с продуктом перед его запуском, а ценные отзывы эффективно используются для повышения удобства использования продукта. Цели и методы альфа- и бета-тестирования переключаются между собой в зависимости от процесса, которому следуют в проекте, и могут быть изменены в соответствии с процессами. + +[Альфа-тестирование](https://www.softwaretestinghelp.com/alpha-testing/) - это форма внутреннего приемочного тестирования (internal acceptance testing), выполняемого, в основном, собственными командами по обеспечению качества и тестированию ПО. Альфа-тестирование - это последнее тестирование, проводимое группами тестирования на месте разработки после приемочного тестирования и перед выпуском программного обеспечения для бета-тестирования. Альфа-тестирование также может быть выполнено потенциальными пользователями или клиентами приложения. Но все же это форма внутреннего приемочного тестирования. + +[Бета-тестирование](https://www.softwaretestinghelp.com/beta-testing/) - это следующий этап после альфа-тестирования. Это заключительный этап тестирования, на котором компании выпускают ПО для нескольких внешних групп пользователей, не входящих в группы тестирования компании или сотрудников. Эта начальная версия программного обеспечения известна как бета-версия. Большинство компаний собирают отзывы пользователей в этом выпуске. Короче говоря, бета-тестирование можно определить как тестирование, проводимое реальными пользователями в боевой среде. Несмотря на то, что компании проводят строгую внутреннюю проверку качества с помощью специальных групп тестирования, практически невозможно протестировать приложение для каждой комбинации тестовой среды. Бета-версии упрощают тестирование приложения на тысячах тестовых машин и исправление проблем перед выпуском приложения для широкой публики. Выбор групп для бета-тестирования может производиться в зависимости от потребностей компании. Компания может либо пригласить нескольких пользователей для тестирования предварительной версии приложения, либо выпустить ее открыто, чтобы это мог сделать любой. Устранение проблем в бета-версии может значительно снизить затраты на разработку, поскольку большинство незначительных сбоев будут исправлены до окончательной версии. До сих пор многие крупные компании успешно использовали бета-версии своих самых ожидаемых приложений. + +| **Alpha Testing** | **Beta Testing** | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Testing environment | Real environment | +| Functional, usability | Functional, Usability, Reliability, Security | +| White box and / or Black box testing | Black box testing | +| На найденные дефекты создаются баг-репорты с high priority, после чего они немедленно исправляются | Дефекты собираются из обратной связи от пользователей и записываются как улучшения для будущей версии | +|Цели:
Цели:
Когда?
Когда?
Продолжительность теста:
Продолжительность теста:
Stakeholders:
Engineers (in-house developers), Quality Assurance Team, and Product Management Team
|Stakeholders:
Product Management, Quality Management, and User Experience teams
| +|Участники:
Участники:
Ожидания:
Ожидания:
Критерии начала (Entry Criteria):
Критерии начала (Entry Criteria):
Критерии окончания (Exit Criteria):
Критерии окончания (Exit Criteria):
Плюсы (Pros):
Плюсы (Pros):
Минусы (Cons):
Минусы (Cons):
192.168.0.0
192.168.1.0
|192.168.0.255
192.168.1.255
|256
256
| + +Думаю из представленной таблицы сразу становится понятно почему самый распространенный диапазон это 192.168.X.X + +Чтобы узнать, например, ip-адрес своего компьютера (на базе ос windows), наберите в терминале команду ipconfig. + +Для выхода в глобальные сети, ваш локальный ip-адрес подменяется роутером на глобальный, который вам выдал провайдер. Глобальные ip-адреса не попадают под диапазоны из таблички выше. Так вот локальные ip-адреса - это серые ip-адреса, а глобальные - это белые. + +Для большего понимания рассмотрите схему ниже. На ней я подписал каждое устройство своим ip-адресом. + +![https://hsto.org/r/w1560/webt/ii/bc/kf/iibckfbsqrxermagkbtpx5rdvgg.png](https://hsto.org/r/w1560/webt/ii/bc/kf/iibckfbsqrxermagkbtpx5rdvgg.png) + +На схеме видно, что провайдер выпускает нас в глобальные сети (в интернет) с белого ip-адреса 91.132.25.108 + +Для нашего роутера провайдер выдал серый ip-адрес 172.17.135.11 + +И в нашей локальной сети все устройства соответственно тоже имеют серые ip-адреса 192.168.Х.Х + +Узнать под каким ip-адресом вы выходите в глобальную сеть можно на сайте 2ip.ru + +Но из всего этого стоит помнить один очень важный фактор! + +В настоящее время обострилась проблема нехватки белых ip-адресов, так как число сетевых устройств давно превысило количество доступных ip. И по этой причине интернет провайдеры выдают пользователям серые ip-адреса (в рамках локальной сети провайдера, например в пределах нескольких многоквартирных домов) и выпускают в глобальную сеть под одним общим белым ip-адресом. + +Чтобы узнать серый ip-адрес выдает вам провайдер или белый, можно зайти к себе на роутер и посмотреть там, какой ip-адрес получает ваш роутер от провайдера. + +Например я на своем домашнем роутере вижу серый ip-адрес 172.17.132.2 (см. диапазаон локальных адресов). Для подключения белого ip-адреса провайдеры обычно предоставляют доп. услугу с абон. платой. + +На самом деле, для домашнего интернета это совсем не критично. А вот для офисов компаний рекомендуется покупать у провайдера именно белый ip-адрес, так как использование серого ip-адреса влечет за собой проблемы с работой ip-телефонии, а также не будет возможности настроить удаленное подключение по VPN. То есть серый ip-адрес не позволит вам вывести в интернет ваш настроенный сервер и не позволит настроить удаленное подключение на сервер из другой сети. + +**NAT** + +В предыдущем разделе я отметил, что “в настоящее время обострилась проблема нехватки белых ip-адресов” и поэтому распространенная схема подключения у интернет провайдеров сейчас, это подключать множество клиентов серыми ip-адресами, а в глобальный интернет выпускать их под одним общим белым ip. + +Но так было не всегда, изначально всем выдавались белые ip-адреса, и вскоре, чтобы избежать проблему дефицита белых ip-адресов, как раз и был придуман NAT (Network Address Translation) - механизм преобразования ip-адресов. + +NAT работает на всех роутерах и позволяет нам из локальной сети выходить в глобальную. + +Для лучшего понимания разберем два примера: + +1. Первый случай: у вас куплен белый ip-адрес 91.105.8.10 и в локальной сети подключено несколько устройств. + +![https://hsto.org/r/w1560/webt/bh/eu/nw/bheunwlkvbzlzrepyn28mcpytjy.png](https://hsto.org/r/w1560/webt/bh/eu/nw/bheunwlkvbzlzrepyn28mcpytjy.png) + +Каждое локальное устройство имеет свой серый ip-адрес. Но выход в интернет возможен только с белого ip-адреса. + +Следовательно когда, например, ПК1 с ip-адресом 192.168.1.3 решил зайти в поисковик Яндекса, то роутер, выпуская запрос ПК1 в глобальную сеть, подключает механизм NAT, который преобразует ip-адрес ПК1 в белый глобальный ip-адрес 91.105.8.10 + +Также и в обратную сторону, когда роутер получит от сервера Яндекса ответ, он с помощью механизма NAT направит этот ответ на ip-адрес 192.168.1.3, по которому подключен ПК1. + +2\. Второй случай: у вас также в локальной сети подключено несколько устройств, но вы не покупали белый ip-адрес у интернет провайдера. + +![https://hsto.org/r/w1560/webt/eg/iu/di/egiudi2dlq38oarasalf3bir6r4.png](https://hsto.org/r/w1560/webt/eg/iu/di/egiudi2dlq38oarasalf3bir6r4.png) + +В этом случае локальный адрес ПК1(192.168.1.3) сначала преобразуется NAT'ом вашего роутера и превращается в серый ip-адрес 172.17.115.3, который вам выдал интернет-провайдер, а далее ваш серый ip-адрес преобразуется NAT’ом роутера провайдера в белый ip-адрес 91.105.108.10, и только после этого осуществляется выход в интернет (глобальную сеть). + +То есть, в этом случае получается, что ваши устройства находятся за двойным NAT’ом. + +Такая схема имеет более высокую степень безопасности ваших устройств, но также и имеет ряд больших минусов. Например, нестабильная sip-регистрация VoIP оборудования или односторонняя слышимость при звонках по ip-телефонии. + +Более подробно о работе механизма NAT, о его плюсах и минусах, о выделении портов, о сокетах и о видах NAT я напишу отдельную статью. + +**DHCP - сервер и подсети** + +Чтобы подключить устройство, например, компьютер к интернету вы обычно просто подключаете провод (витую пару) в компьютер и далее в свободный порт на роутере, после чего компьютер автоматически получает ip-адрес и появляется выход в интернет. + +Также и с Wi-Fi, например со смартфона или ноутбука, вы подключаетесь к нужной вам сети, вводите пароль, устройство получает ip-адрес и у вас появляется интернет. + +А что позволяет устройству получить локальный ip-адрес автоматически? Эту функцию выполняет DHCP-сервер. + +Каждый роутер оснащен DHCP-сервером. IP-адреса, полученные автоматически являются динамическими ip-адресами. Почему динамические? Потому что, при каждом новом подключении или перезагрузки роутера, DHCP-сервер тоже перезагружается и может выдать устройствам разные ip-адреса. + +То есть, например, сейчас у вашего компьютера ip-адрес 192.168.1.10, после перезагрузки роутера ip-адрес компьютера может стать 192.168.1.35 + +Чтобы ip-адрес не менялся, его можно задать статически. Это можно сделать, как на компьютере в настройках сети, так и на самом роутере. А также, DHCP-сервер на роутере вообще можно отключить и задавать ip-адреса вручную. Можно настроить несколько DHCP-серверов на одном роутере. Тогда локальная сеть разделится на подсети. + +Например, компьютеры подключим к нулевой подсети в диапазон 192.168.0.2-192.168.0.255, принтеры к первой подсети в диапазон 192.168.1.2-192.168.1.255, а Wi-Fi будем раздавать на пятую подсеть с диапазоном 192.168.5.2-192.168.5.255 (см. схему ниже) + +![https://hsto.org/r/w1560/webt/v7/-0/nj/v7-0njzgdcepea6hkajkgsup-ug.png](https://hsto.org/r/w1560/webt/v7/-0/nj/v7-0njzgdcepea6hkajkgsup-ug.png) + +Обычно, разграничение по подсетям производить нет необходимости. Это делают, когда в компании большое количество устройств, подключаемых к сети и при настройке сетевой безопасности. Но такая схема в компаниях встречается довольно часто. Поэтому обязательно нужно знать очень важный момент. + +Внимание! Если вам необходимо с ПК зайти на web-интерфейс, например, принтера или ip-телефона и при этом ваш ПК находится в другой подсети, то подключиться не получится. + +Для понимания разберем пример: + +![https://hsto.org/r/w1560/webt/7e/03/x4/7e03x4oc0r2v2u88n\_yq9ga4zxe.png](https://hsto.org/r/w1560/webt/7e/03/x4/7e03x4oc0r2v2u88n\_yq9ga4zxe.png) + +Допустим вы работаете за ПК1 с локальным ip-адресом 10.10.5.2 и хотите зайти на web-интерфейс ip-телефона с локальным ip-адресом 192.168.1.3, то подключиться не получится. Так как устройства находятся в разных подсетях. К ip-телефона, находящиеся в подсети 192.168.1.X, можно подключиться только с ПК3 (192.168.1.5). + +Также и к МФУ (172.17.17.10) вы сможете подключиться только с ПК4 (172.17.17.12). + +Поэтому, когда подключаетесь удаленно к пользователю на ПК, чтобы зайти на web-интерфейс ip-телефона, то обязательно сначала сверяйте их локальные ip-адреса, чтобы убедиться, что оба устройства подключены к одной подсети. + +**Устройства маршрутизации сети (маршрутизатор, коммутатор, свитч, хаб)** + +Как ни странно, но есть такой факт, что новички в IT (иногда и уже действующие сис.админы) не знают или путают такие понятия как маршрутизатор, коммутатор, свитч, сетевой шлюз и хаб. + +Я думаю, причина такой путаницы возникла из-за того, что наплодили синонимов и жаргонизмов в названиях сетевого оборудования и это теперь вводит в заблуждение многих начинающих инженеров. + +Давайте разбираться. + +* Роутер, маршрутизатор и сетевой шлюз: Все знают что такое роутер. Что это именно то устройство, которое раздает в помещении интернет, подключенный от интернет провайдера. Так вот маршрутизатор и сетевой шлюз это и есть роутер. Данное оборудование является основным устройством в организации сети. В инженерной среде наиболее используемое название это “маршрутизатор”. Кстати маршрутизатором может быть не только приставка, но и системный блок компьютера, если установить туда еще одну сетевую карту и накатить, например, RouterOS Mikrotik. Далее разрулить сеть на множество устройств с помощью свитча. +* Что такое Свитч и чем он отличается от Коммутатора и Хаба: Свитч и Коммутатор это тоже синонимы. А вот хаб немного другое устройство. О нем в следующем пункте. Коммутатор (свитч) служит для разветвления локальной сети. Как тройник или сетевой фильтр, куда мы подключаем свои устройства, чтобы запитать их электричеством от одной розетки. Коммутатор не умеет маршрутизировать сеть как роутер. Он не выдаст вашему устройству ip-адрес и без помощи роутера не сможет выпустить вас в интернет. У стандартного маршрутизатора обычно 4-5 портов для подключения устройств. Соответственно, если ваши устройства подключаются проводами и их больше чем портов на роутере, то вам необходим свитч. Можно к одному порту роутера подключить свитч на 24 порта и спокойно организовать локальную сеть на 24 устройства. А если у вас завалялся еще один роутер, то можно в его web-интерфейсе включить режим коммутатора и тоже использовать как свитч. +* Хаб: Хаб выполняет те же функции, что и коммутатор. Но его технология распределения сильно деревянная и уже устарела. Хаб раздает приходящие от роутера пакеты всем подключенным устройствам без разбора, а устройства уже сами должны разбираться их это пакет или нет. А коммутатор имеет MAC таблицу и поэтому распределяет приходящие пакеты на одно конкретное устройство, которое и запрашивало этот пакет. Следовательно передача данных коммутатором быстрее и эффективнее. В настоящее время уже редко где встретишь использование хаба, но всё таки они попадаются, нужно быть к этому готовым и обязательно рекомендовать пользователю замену хаба на свитч. + +**Основные команды для анализа сети** + +* Команда Ping: Чтобы понять активен ли ip-адрес или само устройство, можно его “пропинговать”. Для этого в командной строке пишем команду ping “ip-адрес”. Ping намного полезней использовать с ключами: + + * \-t -”пинговать” непрерывно (для остановки нажимаем комбинацию Ctrl+С); + * \-а -отображать имя “пингуемого” узла (сайта/устройства/сервера). + + При непрерывном пинге можно увидеть адекватно ли ведет себя пингуемый узел и примерное качество работы интернет канала. Внимание! Иногда на роутерах отключена отправка ICMP пакетов (кто-то отключает специально, а где-то не включена по умолчанию), в таком случае на "пинги" такой узел отвечать не будет, хотя сам будет активен и нормально функционировать в сети. Еще одна возможность “пинга” это узнать какой ip-адрес скрывается за доменом сайта. А именно, на каком сервере установлен хост сайта; +* Трассировка: Иногда очень важно увидеть каким путем идет пакет до определенного устройства. Возможно где-то есть пробоина и пакет не доходит до адресата. Так вот утилита трассировки помогает определить на каком этапе этот пакет застревает. На ОС Windows эта утилита вызывается командой “tracert” ip-адрес или домен. На ОС Linux эта утилита вызывается командой traceroute. Утилитой трассировки также и обладают некоторые устройства, маршрутизаторы или голосовые VoIP шлюзы. +* Утилита whois: Данная утилита позволяет узнать всю информацию об ip-адресе или о регистраторе домена. + +**Транспортные протоколы TCP и UDP** + +Все передачи запросов и прием ответов между устройствами в сети осуществляются с помощью транспортных протоколов TCP и UDP. + +TCP протокол гарантированно осуществляет доставку запроса и целостность его передачи. Он заранее проверяет доступность узла перед отправкой пакета. А если по пути целостность пакета будет нарушена, то TCP дополнит недостающие составляющие. В общем, это протокол, который сделает все, чтобы ваш запрос корректно дошел до адресата. Поэтому TCP самый распространенный транспортный протокол. Он используется когда пользователь серфит интернет, лазает по сайтам, сервисам, соц. сетям и т.д. + +UDP протокол не имеет такой гарантированной передачи данных, как TCP. Он не проверяет доступность конечного узла перед отправкой и не восполняет пакет в случае его деградации. Если какой-то пакет или несколько пакетов по пути утеряны, то сообщение дойдет до адресата в таком неполном виде. + +Зачем тогда нужен UDP? Дело в том, что данный транспортный протокол имеет огромное преимущество перед TCP в скорости передачи данных. Поэтому UDP широко используется для пересылки голосовых и видео пакетов в реальном времени. А именно, в ip-телефонии и видео звонках. + +К примеру, любой звонок через WhatsApp или Viber использует транспортный протокол UDP. Также и при видео звонках, например, через Skype или те же мессенджеры WhatsApp и Viber. + +Именно потому что UDP не гарантирует абсолютную передачу данных и целостность передаваемого пакета, зачастую возникают проблемы при звонках через интернет. Это прерывание голоса, запаздывание, эхо или робоголос. Данная проблема возникает из-за нагруженного интернет канала, двойного NATа или радиоканала. Хорошо бы конечно в таких случаях использовать TCP, но увы, для передачи голоса необходима мгновенная передача целостных пакетов, а для этой задачи идеально подходит UDP. + +Чтобы не возникало проблем с использованием UDP протокола, нужно просто организовать качественный интернет канал. А также настроить на роутере выделенную полосу для UDP, чтобы нагрузка с других устройств, которые используют TCP не мешала работе транспортного протокола UDP. + +Источники: + +* [Сети для начинающего IT-специалиста. Обязательная база](https://habr.com/ru/post/491540/) + +Доп. материал: + +* [Podlodka #239 - Сети, часть 1: Интернет](https://www.youtube.com/watch?v=k\_GE-YfcnLg), [Podlodka #249 - Сети, часть 2](https://www.youtube.com/watch?v=G23ZpWRdjOI) +* [Лекции по курсу "Компьютерные сети"](https://www.youtube.com/playlist?list=PLtPJ9lKvJ4oiNMvYbOzCmWy6cRzYAh9B1) +* Таненбаум Э., Уэзеролл Д. - “Компьютерные сети” +* В. Г. Олифер, Н. А. Олифер. “Компьютерные сети. Принципы, технологии, протоколы.” +* [Цикл из 15 статей “Сети для самых маленьких”](https://habr.com/ru/post/134892/) +* [Трансляция Saint HighLoad++ 2021, 20.09, Гриффиндор](https://www.youtube.com/watch?v=wG4u5XEl-vo) +* [Список сетевых протоколов](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA\_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D1%85\_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D0%BE%D0%B2) +* [Маска подсети](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D0%BA%D0%B0\_%D0%BF%D0%BE%D0%B4%D1%81%D0%B5%D1%82%D0%B8) +* [Сетевая топология](https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F\_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F) +* [Что такое VPN, Proxy, Tor? Разбор](https://habr.com/ru/company/droider/blog/549212/) +* [Как устроен и работает протокол DHCP](https://interface31.ru/tech\_it/2019/07/kak-ustroen-i-rabotaet-protokol-dhcp.html) +* [Ликбез №1. Как организована связь у операторов и что на нее влияет](https://mobile-review.com/articles/2016/likbez-1.shtml) diff --git a/seti-i-okolo-nikh/etalonnye-modeli-osi-i-tcp-ip.md b/seti-i-okolo-nikh/etalonnye-modeli-osi-i-tcp-ip.md new file mode 100644 index 0000000..1808ae8 --- /dev/null +++ b/seti-i-okolo-nikh/etalonnye-modeli-osi-i-tcp-ip.md @@ -0,0 +1,65 @@ +# Эталонные модели OSI и TCP/IP + +Мы опишем два важных архитектурных типа - эталонные модели OSI и TCP/IP. Несмотря на то что протоколы, связанные с эталонной моделью OSI, сейчас не используются, сама модель до сих пор весьма актуальна, а свойства ее уровней, которые будут обсуждаться в этом разделе, очень важны. В эталонной модели TCP/IP все наоборот: сама модель сейчас почти не используется, а ее протоколы являются едва ли не самыми распространенными. Исходя из этого, мы обсудим подробности, касающиеся обеих моделей. К тому же иногда приходится больше узнавать из поражений, чем из побед. + +**Эталонная модель OSI** + +![](https://lh6.googleusercontent.com/yf6aXK-NhW3KlkBek6XgTKzbLxIyyo7M7KA\_zBgONzSJU6U8-MtPNlaqXSlHYNuCodWkXNpJqAPQGDoef23VbjdRaRVV9wmG4hLVBI2lyHwXqbolIvODn8QCnr3-wZSrVWxyQ2k\_) + +Эта модель основана на разработке Международной организации по стандартизации (International Organization for Standardization, ISO) и является первым шагом к международной стандартизации протоколов, используемых на различных уровнях (Day и Zimmerman, 1983). Затем она была пересмотрена в 1995 году (Day, 1995). Называется эта структура эталонной моделью взаимодействия открытых систем ISO (ISO OSI (Open System Interconnection) Reference Model), поскольку она связывает открытые системы, то есть системы, открытые для связи с другими системами. Для краткости мы будем называть эту модель просто «модель OSI». + +Модель OSI имеет семь уровней. Появление именно такой структуры было обусловлено следующими соображениями: + +* Уровень должен создаваться по мере необходимости отдельного уровня абстракции; +* Каждый уровень должен выполнять строго определенную функцию; +* Выбор функций для каждого уровня должен осуществляться с учетом создания стандартизированных международных протоколов; +* Границы между уровнями должны выбираться так, чтобы поток данных между интерфейсами был минимальным; +* Количество уровней должно быть достаточно большим, чтобы различные функции не объединялись в одном уровне без необходимости, но не слишком высоким, чтобы архитектура не становилась громоздкой. + +Ниже мы обсудим каждый уровень модели, начиная с самого нижнего. Обратите внимание: модель OSI не является сетевой архитектурой, поскольку она не описывает службы и протоколы, используемые на каждом уровне. Она просто определяет, что должен делать каждый уровень. Тем не менее ISO также разработала стандарты для каждого уровня, хотя эти стандарты не входят в саму эталонную модель. Каждый из них был опубликован как отдельный международный стандарт. Эта модель (частично) широко используется, хотя связанные с ней протоколы долго были забыты. + +**Физический уровень** занимается реальной передачей необработанных битов по каналу связи. При разработке сети необходимо убедиться, что когда одна сторона передает единицу, то принимающая сторона получает также единицу, а не ноль. Принципиальными вопросами здесь являются следующие: какое напряжение должно использоваться для отображения единицы, а какое для нуля; сколько микросекунд длится бит; может ли передача производиться одновременно в двух направлениях; как устанавливается начальная связь и как она прекращается, когда обе стороны закончили свои задачи; из какого количества проводов должен состоять кабель и какова функция каждого провода. Вопросы разработки в основном связаны с механическими, электрическими и процедурными интерфейсами, а также с физическим носителем, лежащим ниже физического уровня. + +Основная задача\*\* уровня передачи данных\*\* - быть способным передавать «сырые» данные физического уровня по надежной линии связи, свободной от необнаруженных ошибок, и маскировать реальные ошибки, так что сетевой уровень их не видит. Эта задача выполняется при помощи разбиения входных данных на кадры, обычный размер которых колеблется от нескольких сот до нескольких тысяч байт. Кадры данных передаются последовательно с обработкой кадров подтверждения, отсылаемых обратно получателем. Еще одна проблема, возникающая на уровне передачи данных (а также и на большей части более высоких уровней), - как не допустить ситуации, когда быстрый передатчик заваливает приемник данными. Может быть предусмотрен некий механизм регуляции, который информировал бы передатчик о наличии свободного места в буфере приемника на текущий момент. В широковещательных сетях существует еще одна проблема уровня передачи данных: как управлять доступом к совместно используемому каналу. Эта проблема разрешается введением специального дополнительного подуровня уровня передачи данных - подуровня доступа к носителю. + +**Сетевой уровень** занимается управлением операциями подсети. Важнейшим моментом здесь является определение маршрутов пересылки пакетов от источника к пункту назначения. Маршруты могут быть жестко заданы в виде таблиц и редко меняться либо, что бывает чаще, автоматически изменяться, чтобы избегать отказавших компонентов. Кроме того, они могут задаваться в начале каждого соединения, например, терминальной сессии, такого как подключения к удаленной машине. Наконец, они могут быть в высокой степени динамическими, то есть вычисляемыми заново для каждого пакета с учетом текущей загруженности сети. Если в подсети одновременно присутствует слишком большое количество пакетов, то они могут закрыть дорогу друг другу, образуя заторы в узких местах. Недопущение подобной закупорки также является задачей сетевого уровня в соединении с более высокими уровнями, которые адаптируют загрузку. В более общем смысле, сетевой уровень занимается предоставлением определенного уровня сервиса (это касается задержек, времени передачи, вопросов синхронизации). При путешествии пакета из одной сети в другую также может возникнуть ряд проблем. Так, способ адресации, применяемый в одной сети, может отличаться от принятого в другой. Сеть может вообще отказаться принимать пакеты из-за того, что они слишком большого размера. Также могут различаться протоколы и т. д. Именно сетевой уровень должен разрешать все эти проблемы, позволяя объединять разнородные сети. В широковещательных сетях проблема маршрутизации очень проста, поэтому в них сетевой уровень очень примитивный или вообще отсутствует. + +Основная функция **транспортного уровня** - принять данные от сеансового уровня, разбить их при необходимости на небольшие части, передать их сетевому уровню и гарантировать, что эти части в правильном виде прибудут по назначению. Кроме того, все это должно быть сделано эффективно и таким образом, чтобы изолировать более высокие уровни от каких-либо изменений в аппаратной технологии с течением времени. Транспортный уровень также определяет тип сервиса, предоставляемого сеансовому уровню и, в конечном счете, пользователям сети. Наиболее популярной разновидностью транспортного соединения является защищенный от ошибок канал между двумя узлами, поставляющий сообщения или байты в том порядке, в каком они были отправлены. Однако транспортный уровень может предоставлять и другие типы сервисов, например пересылку отдельных сообщений без гарантии соблюдения порядка их доставки или одновременную отправку сообщения различным адресатам по принципу широковещания. Тип сервиса определяется при установке соединения. (Строго говоря, полностью защищенный от ошибок канал создать совершенно невозможно. Говорят лишь о таком канале, уровень ошибок в котором достаточно мал, чтобы им можно было пренебречь на практике.) Транспортный уровень является настоящим сквозным уровнем, то есть доставляющим сообщения от источника адресату. Другими словами, программа на машине-источнике поддерживает связь с подобной программой на другой машине при помощи заголовков сообщений и управляющих сообщений. На более низких уровнях для поддержки этого соединения устанавливаются соединения между всеми соседними машинами, через которые проходит маршрут сообщений. Различие между уровнями с 1-го по 3-й, действующих по принципу звеньев цепи, и уровнями с 4-го по 7-й, являющимися сквозными, проиллюстрировано на рис. 1.17. + +**Сеансовый уровень** позволяет пользователям различных компьютеров устанавливать сеансы связи друг с другом. При этом предоставляются различные типы сервисов, среди которых управление диалогом (отслеживание очередности передачи данных), управление маркерами (предотвращение одновременного выполнения критичной операции несколькими системами) и синхронизация (установка служебных меток внутри длинных сообщений, позволяющих продолжить передачу с того места, на котором она оборвалась, даже после сбоя и восстановления). + +В отличие от более низких уровней, задача которых - достоверная передача битов и байтов, **уровень представления** занимается по большей части синтаксисом и семантикой передаваемой информации. Чтобы было возможно общение компьютеров с различными внутренними представлениями данных, необходимо преобразовывать форматы данных друг в друга, передавая их по сети в неком стандартизированном виде. Уровень представления занимается этими преобразованиями, предоставляя возможность определения и изменения структур данных более высокого уровня (например, записей баз данных). + +**Прикладной уровень** содержит набор популярных протоколов, необходимых пользователям. Одним из наиболее распространенных является протокол передачи гипертекста HTTP (HyperText Transfer Protocol), который составляет основу технологии Всемирной паутины. Когда браузер запрашивает веб-страницу, он передает ее имя (адрес) и рассчитывает на то, что сервер, на котором расположена страница, будет использовать HTTP. Сервер в ответ отсылает страницу. Другие прикладные протоколы используются для передачи файлов, электронной почты, сетевых рассылок. + +**Эталонная модель TCP/IP** + +Рассмотрим теперь эталонную модель, использовавшуюся в компьютерной сети ARPANET, которая является бабушкой нынешних сетей, а также в ее наследнице, всемирной сети Интернет. ARPANET была исследовательской сетью, финансируемой Министерством обороны США. В конце концов, она объединила сотни университетов и правительственных зданий при помощи выделенных телефонных линий. Когда впоследствии появились спутниковые сети и радиосети, возникли большие проблемы при объединении с ними других сетей с помощью имеющихся протоколов. Понадобилась новая эталонная архитектура. Таким образом, возможность объединять различные сети в единое целое являлась одной из главных целей с самого начала. Позднее эта архитектура получила название эталонной модели TCP/IP, в соответствии со своими двумя основными протоколами. Первое ее описание встречается в книге Cerf и Kahn (1974), позднее превращается в стандарт (Braden, 1989). Конструктивные особенности модели обсуждаются в издании Clark, 1988. Поскольку Министерство обороны США беспокоилось, что ценные хосты, маршрутизаторы и межсетевые шлюзы могут быть мгновенно уничтожены, другая важная задача состояла в том, чтобы добиться способности сети сохранять работоспособность при возможных потерях подсетевого оборудования, так чтобы при этом связь не прерывалась. Другими словами, Министерство обороны США требовало, чтобы соединение не прерывалось, пока функционируют приемная и передающая машины, даже если некоторые промежуточные машины или линии связи внезапно вышли из строя. Кроме того, от архитектуры нужна была определенная гибкость, поскольку предполагалось использовать приложения с различными требованиями, от переноса файлов до передачи речи в реальном времени. + +**Канальный уровень** + +Все эти требования привели к выбору сети с пакетной коммутацией, основанной на уровне без установления соединения, который работает в различных сетях. Самый низкий уровень в модели, уровень канала, описывает то, как и что каналы, такие как последовательные линии и классический Ethernet, должны сделать, чтобы удовлетворить потребности этого межсетевого уровня без установления соединения. Это на самом деле не уровень вообще, в нормальном смысле слова, а скорее интерфейс между каналами передачи и узлами. В ранних материалах о модели TCP/IP мало что об этом говорится. + +**Межсетевой уровень** + +Все эти требования обусловили выбор модели сети с коммутацией пакетов, в основе которой лежал не имеющий соединений межсетевой уровень. Он соответствует сетевому уровню в OSI. Этот уровень, называемый интернет-уровнем или межсетевым уровнем, является основой всей архитектуры. Его задача заключается в обеспечении возможности каждого хоста посылать пакеты в любую сеть и независимо двигаться к пункту назначения (например, в другой сети). Они могут прибывать совершенно в другом порядке, чем были отправлены. Если требуется соблюдение порядка отправления, эту задачу выполняют более верхние уровни. Обратите внимание, что слово «интернет» здесь используется в своем первоначальном смысле, несмотря на то что этот уровень присутствует в сети Интернет. Здесь можно увидеть аналогию с почтовой системой. Человек может бросить несколько международных писем в почтовый ящик в одной стране, и, если повезет, большая часть из них будет доставлена по правильным адресам в других странах. Вероятно, письма по дороге пройдут через несколько международных почтовых шлюзов, однако это останется тайной для корреспондентов. В каждой стране (то есть в каждой сети) могут быть свои марки, свои предпочитаемые размеры конвертов и правила доставки, незаметные для пользователей почтовой службы. Межсетевой уровень определяет официальный формат пакета и протокол IP, с дополнительным протоколом ICMP (Internet Control Message Protocol, межсетевой протокол управления сообщениями). Задачей межсетевого протокола является доставка IP-пакетов к пунктам назначения. Основными аспектами здесь являются выбор маршрута пакета и недопущение закупорки транспортных артерий (хотя IP не оказался эффективным для избегания скоплений). + +**Транспортный уровень** + +Уровень, расположенный над межсетевым уровнем модели TCP/IP, как правило, называют транспортным. Он создан для того, чтобы объекты одного ранга на приемных и передающих хостах могли поддерживать связь, подобно транспортному уровню модели OSI. На этом уровне должны быть описаны два сквозных протокола. Первый, TCP (Transmission Control Protocol - протокол управления передачей), является надежным протоколом с установлением соединений, позволяющим без ошибок доставлять байтовый поток с одной машины на любую другую машину объединенной сети. Он разбивает входной поток байтов на отдельные сообщения и передает их межсетевому уровню. На пункте назначения получающий TCP-процесс собирает из полученных сообщений выходной поток. Кроме того, TCP осуществляет управление потоком, чтобы быстрый отправитель не завалил информацией медленного получателя. Второй протокол этого уровня, UDP (User Datagram Protocol - протокол пользовательских дейтаграмм), является ненадежным протоколом без установления соединения, не использующим последовательное управление потоком протокола TCP, а предоставляющим свое собственное. Он также широко используется в одноразовых клиент-серверных запросах и приложениях, в которых оперативность важнее аккуратности, например при передаче речи и видео. Со времени создания протокола IP этот протокол был реализован во многих других сетях. + +**Прикладной уровень** + +В модели TCP/IP нет сеансового уровня и уровня представления. В этих уровнях просто не было необходимости, поэтому они не были включены в модель. Вместо этого приложения просто включают все функции сеансов и представления, которые им нужны. Опыт работы с моделью OSI доказал правоту этой точки зрения: большинство приложений мало нуждаются в этих уровнях. Над транспортным уровнем располагается прикладной уровень. Он содержит все протоколы высокого уровня. К старым протоколам относятся протокол виртуального терминала (TELNET), протокол переноса файлов (FTP) и протокол электронной почты (SMTP). С годами было добавлено много других протоколов. Это DNS (Domain Name Service - служба имен доменов), позволяющая преобразовывать имена хостов в сетевые, HTTP, протокол, используемый для создания страниц на World Wide Web, а также RTP, протокол для представления мультимедиа в реальном времени, таких как звук или фильмы. + +Источники: + +* Таненбаум Э., Уэзеролл Д. - Компьютерные сети, 1.4 - 1.4.2 + +Доп. материал: + +* Таненбаум Э., Уэзеролл Д. - Компьютерные сети, 1.4.4. “Сравнение эталонных моделей OSI и TCP”, 1.4.5. “Критика модели и протоколов OSI”, 1.4.6. “Критика эталонной модели TCP/IP” +* [TCP/IP: что это и зачем это тестировщику](https://www.youtube.com/watch?v=rLUzYeLdM0k\&t=1s\&ab\_channel=HillelITSchool) +* [Модель OSI - 7 уровней за 7 минут](https://www.youtube.com/watch?v=je0QFU7p5Oo) +* [Модель и стек протоколов TCP/IP - Курс "Компьютерные сети"](https://www.youtube.com/watch?v=UZo4ffQ-aAc) +* [New IP - следующий этап развития Интернета или ужесточение контроля над пользователями](https://habr.com/ru/company/vdsina/blog/553566/) diff --git a/seti-i-okolo-nikh/http.md b/seti-i-okolo-nikh/http.md new file mode 100644 index 0000000..3594f9d --- /dev/null +++ b/seti-i-okolo-nikh/http.md @@ -0,0 +1,216 @@ +# HTTP + +HTTP (англ. HyperText Transfer Protocol - «протокол передачи гипертекста») - протокол прикладного уровня передачи данных, изначально - в виде гипертекстовых документов (то есть документов, которые могут содержать ссылки, позволяющие организовать переход к другим документам) в формате HTML, в настоящее время используется для передачи произвольных данных. + +Основой HTTP является технология «клиент-сервер», то есть предполагается существование: + +* Потребителей (клиентов), которые инициируют соединение и посылают запрос; +* Поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом. + +HTTP используется также в качестве «транспорта» для других протоколов прикладного уровня, таких как SOAP, XML-RPC, WebDAV. + +Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (Uniform Resource Identifier) в запросе клиента. Обычно такими ресурсами являются хранящиеся на сервере файлы, но ими могут быть логические объекты или что-то абстрактное. Особенностью протокола HTTP является возможность указать в запросе и ответе способ представления одного и того же ресурса по различным параметрам: формату, кодировке, языку и т. д. (в частности, для этого используется HTTP-заголовок). Именно благодаря возможности указания способа кодирования сообщения клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым. + +HTTP - протокол прикладного уровня; аналогичными ему являются FTP и SMTP. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния (stateless). Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами (например, «куки» на стороне клиента, «сессии» на стороне сервера). Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования. + +Большинство протоколов предусматривает установление TCP-сессии, в ходе которой один раз происходит авторизация, и дальнейшие действия выполняются в контексте этой авторизации. HTTP же устанавливает отдельную TCP-сессию на каждый запрос; в более поздних версиях HTTP было разрешено делать несколько запросов в ходе одной TCP-сессии, но браузеры обычно запрашивают только страницу и включенные в нее объекты (картинки, каскадные стили и т. п.), а затем сразу разрывают TCP-сессию. Для поддержки авторизованного (неанонимного) доступа в HTTP используются cookies; причем такой способ авторизации позволяет сохранить сессию даже после перезагрузки клиента и сервера. + +При доступе к данным по FTP или по файловым протоколам тип файла (точнее, тип содержащихся в нем данных) определяется по расширению имени файла, что не всегда удобно. HTTP перед тем, как передать сами данные, передаёт заголовок «Content-Type: тип/подтип», позволяющий клиенту однозначно определить, каким образом обрабатывать присланные данные. Это особенно важно при работе с CGI-скриптами, когда расширение имени файла указывает не на тип присылаемых клиенту данных, а на необходимость запуска данного файла на сервере и отправки клиенту результатов работы программы, записанной в этом файле (при этом один и тот же файл в зависимости от аргументов запроса и своих собственных соображений может порождать ответы разных типов - в простейшем случае картинки в разных форматах). + +Кроме того, HTTP позволяет клиенту прислать на сервер параметры, которые будут переданы запускаемому CGI-скрипту. Для этого же в HTML были введены формы. + +**Структура HTTP-сообщения** + +Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке: + +1. **Стартовая строка** (англ. Starting line) - определяет тип сообщения, различается для запроса и ответа; +2. **Заголовки** (англ. Headers) - характеризуют тело сообщения, параметры передачи и прочие сведения; +3. **Тело сообщения** (англ. Message Body) - непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой. + +Для версии протокола 1.1 сообщение запроса обязательно должно содержать заголовок Host. + +**1. Стартовая строка**: + +* Стартовая строка запроса выглядит так: _Метод URI HTTP/Версия_, где: + + * Метод (англ. Method) - тип запроса, одно слово заглавными буквами; + * URI определяет путь к запрашиваемому документу; + * Версия (англ. Version) - пара разделенных точкой цифр. Например: 1.1. + + Чтобы запросить страницу данной статьи, клиент должен передать строку (задан всего один заголовок): + + GET /wiki/HTTP HTTP/1.1 + + Host: ru.wikipedia.org +* Стартовая строка ответа сервера имеет следующий формат: _HTTP/Версия КодСостояния Пояснение_, где: + + * Версия - пара разделенных точкой цифр, как в запросе; + * Код состояния (англ. Status Code) - три цифры. По коду состояния определяется дальнейшее содержимое сообщения и поведение клиента; + * Пояснение (англ. Reason Phrase) - текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным. + + Например, стартовая строка ответа сервера на предыдущий запрос может выглядеть так: + + HTTP/1.0 200 OK + +**2. Заголовки:** Заголовки HTTP (англ. HTTP Headers) - это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (см. RFC 822). Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. Примеры заголовков: + +* Server: Apache/2.2.11 (Win32) PHP/5.3.0 +* Last-Modified: Sat, 16 Jan 2010 21:16:42 GMT +* Content-Type: text/plain; charset=windows-1251 +* Content-Language: ru + +В примере выше каждая строка представляет собой один заголовок. При этом то, что находится до двоеточия, называется именем (англ. name), а что после него - значением (англ. value). + +Все заголовки разделяются на четыре основных группы: + +* General Headers («Основные заголовки») - могут включаться в любое сообщение клиента и сервера; +* Request Headers («Заголовки запроса») - используются только в запросах клиента; +* Response Headers («Заголовки ответа») - только для ответов от сервера; +* Entity Headers («Заголовки сущности») - сопровождают каждую сущность сообщения. + +Именно в таком порядке рекомендуется посылать заголовки получателю. + +Все необходимые для функционирования HTTP заголовки описаны в основных RFC. Если не хватает существующих, то можно вводить свои. Традиционно к именам таких дополнительных заголовков добавляют префикс «X-» для избежания конфликта имён с возможно существующими. Например, как в заголовках X-Powered-By или X-Cache. Некоторые разработчики используют свои индивидуальные префиксы. Примерами таких заголовков могут служить Ms-Echo-Request и Ms-Echo-Reply, введённые корпорацией Microsoft для расширения WebDAV. Больше можно узнать [тут](https://developer.mozilla.org/ru/docs/Web/HTTP/Headers). + +_Какие заголовки важны тестировщику: очевидно, смотря что мы тестируем. В основном это заголовки, касающиеся авторизации, кук, кэша и юзер-агент, хотя для того же security тестера они будут иные. Больше_ [_тут_](https://habr.com/ru/post/413205/) _и_ [_тут_](https://xakep.ru/2011/05/24/55557/)_._ + +\_Как сервер узнает, с какого типа устройства/браузера/ОС/языка вы открываете веб-сайт (Например, для Adaptive design): когда вы отправляете HTTP-запрос, он содержит в себе заголовки (headers) с различной информацией. Одним из них является User-Agent. Он сообщает: браузер, его версию и язык, движок браузера, версию движка, операционную систему. \_ + +**3. Тело сообщения**: Тело HTTP-сообщения (message-body), если оно присутствует, используется для передачи тела объекта, связанного с запросом или ответом. Тело сообщения отличается от тела объекта (entity-body) только в том случае, когда применяется кодирование передачи, что указывается полем заголовка Transfer-Encoding. + +Поле Transfer-Encoding должно использоваться для указания любого кодирования передачи, примененного приложением в целях гарантирования безопасной и правильной передачи сообщения. Поле Transfer-Encoding - это свойство сообщения, а не объекта, и, таким образом, может быть добавлено или удалено любым приложением в цепочке запросов/ответов. + +Правила, устанавливающие допустимость тела сообщения в сообщении, отличны для запросов и ответов. + +Присутствие тела сообщения в запросе отмечается добавлением к заголовкам запроса поля заголовка Content-Length или Transfer-Encoding. Тело сообщения может быть добавлено в запрос, только когда метод запроса допускает тело объекта. + +Включается или не включается тело сообщения в сообщение ответа - зависит как от метода запроса, так и от кода состояния ответа. Все ответы на запрос с методом HEAD не должны включать тело сообщения, даже если присутствуют поля заголовка объекта (entity-header), заставляющие поверить в присутствие объекта. Никакие ответы с кодами состояния 1xx (Информационные), 204 (Нет содержимого, No Content), и 304 (Не модифицирован, Not Modified) не должны содержать тела сообщения. Все другие ответы содержат тело сообщения, даже если оно имеет нулевую длину. + +**Методы HTTP** + +Метод HTTP (англ. HTTP Method) - последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру. + +Сервер может использовать любые методы, не существует обязательных методов для сервера или клиента, кроме того, программист может связать метод и выполняемую функцию как угодно его фантазии. Во избежание хаоса существуют соглашения (тот же REST) и стандарты. Формально если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он неприменим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов. + +Основными и чаще всего используемыми методами являются GET, POST, PUT, DELETE которые эквивалентны базовым функциям при работе с БД или любыми хранимыми вычислительными сущностями - [CRUD](https://ru.wikipedia.org/wiki/CRUD) (create, read, update, delete). + +* **OPTIONS**: Используется для определения возможностей веб-сервера или параметров соединения для конкретного ресурса. В ответ серверу следует включить заголовок Allow со списком поддерживаемых методов. Также в заголовке ответа может включаться информация о поддерживаемых расширениях. Предполагается, что запрос клиента может содержать тело сообщения для указания интересующих его сведений. Формат тела и порядок работы с ним в настоящий момент не определен; сервер пока должен его игнорировать. Аналогичная ситуация и с телом в ответе сервера. Для того, чтобы узнать возможности всего сервера, клиент должен указать в URI звёздочку - «\*». Запросы «OPTIONS \* HTTP/1.1» могут также применяться для проверки работоспособности сервера (аналогично «пингованию») и тестирования на предмет поддержки сервером протокола HTTP версии 1.1. Результат выполнения этого метода не кэшируется; +* **GET**: Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»: GET /path/resource?param1=value1\¶m2=value2 HTTP/1.1. Согласно стандарту HTTP, запросы типа GET считаются идемпотентными. Кроме обычного метода GET, различают ещё + + * Условный GET - содержит заголовки If-Modified-Since, If-Match, If-Range и подобные; + * Частичный GET - содержит в запросе Range. + + Порядок выполнения подобных запросов определен стандартами отдельно; +* **HEAD**: Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения. Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше - копия ресурса помечается как устаревшая; +* **POST**: Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные (в примере с блогами - текст комментария) включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы на сервер. В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться очередная копия этого комментария). При результате выполнения 200 (Ok) в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 (Created) с указанием URI нового ресурса в заголовке Location. Сообщение ответа сервера на выполнение метода POST не кэшируется. Стоит отметить, что [не всегда данные могут быть лишь в теле](https://stackoverflow.com/questions/611906/http-post-with-url-query-parameters-good-idea-or-not); +* **PUT**: Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существует ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же ресурс был изменен, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-\*, передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или недопустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented). Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу. Сообщения ответов сервера на метод PUT не кэшируются; +* **PATCH**: Аналогично PUT, но применяется только к фрагменту ресурса; +* **DELETE**: Удаляет указанный ресурс; +* **TRACE**: Возвращает полученный запрос так, что клиент может увидеть, какую информацию промежуточные серверы добавляют или изменяют в запросе; +* **CONNECT**: Преобразует соединение запроса в прозрачный TCP/IP-туннель, обычно чтобы содействовать установлению защищенного SSL-соединения через нешифрованный прокси. + +**Различия методов GET и POST** + +Основное состоит в способе передачи данных веб-формы обрабатывающему скрипту, а именно: + +* Метод GET отправляет скрипту всю собранную информацию формы как часть URL: http://www.komtet.ru/script.php?login=admin\&name=komtet +* Метод POST передает данные таким образом, что пользователь сайта уже не видит передаваемые скрипту данные: http://www.komtet.ru/script.php + +Кроме того: + +* Количество информации, передаваемой методом GET через URL строку ограничено 2048 символами (минус служебная информация браузера); +* Страницу, сгенерированную методом GET, можно добавить в закладки и поделиться ссылкой; +* Sensitive data в таком открытом виде очевидно плохо влияют на безопасность; +* Метод POST в отличие от метода GET позволяет передавать запросу файлы; +* При использовании метода GET существует риск того, что поисковый робот может выполнить тот или иной открытый запрос. + +**Коды состояния** + +Код состояния является частью первой строки ответа сервера. Он представляет собой целое число из трёх цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделенная пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Примеры: + +* 201 Webpage Created; +* 403 Access allowed only for registered users; +* 507 Insufficient Storage. + +Клиент узнаёт по коду ответа о результатах его запроса и определяет, какие действия ему предпринимать дальше. Набор кодов состояния является стандартом, и они описаны в соответствующих документах RFC. Введение новых кодов должно производиться только после согласования с IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. + +В настоящее время выделено пять классов кодов состояния. + +| **Код** | **Класс** | **Назначение** | +| ----------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 100-е (1ХХ) |Информационный
(англ. informational)
|Информирование о процессе передачи.
В HTTP/1.0 - сообщения с такими кодами должны игнорироваться.
В HTTP/1.1 - клиент должен быть готов принять этот класс сообщений как обычный ответ, но ничего отправлять серверу не нужно.
Сами сообщения от сервера содержат только стартовую строку ответа и, если требуется, несколько специфичных для ответа полей заголовка. Прокси-серверы подобные сообщения должны отправлять дальше от сервера к клиенту.
| +| 200-е (2ХХ) |Успех
(англ. Success)
| Информирование о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса, сервер может ещё передать заголовки и тело сообщения. | +| 300-е (3ХХ) |Перенаправление
(англ. Redirection)
| Сообщает клиенту, что для успешного выполнения операции необходимо сделать другой запрос (как правило по другому URI). Из данного класса пять кодов 301, 302, 303, 305 и 307 относятся непосредственно к перенаправлениям (редирект). Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location. При этом допускается использование фрагментов в целевом URI. | +| 400-е (4ХХ) |Ошибка клиента
(англ. Client Error)
| Указание ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя. | +| 500-е (5ХХ) |Ошибка сервера
(англ. Server Error)
| Информирование о случаях неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю. | + +Полный перечень можно найти [тут](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA\_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2\_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F\_HTTP). Данные диапазоны определены в стандартах, однако ничего не мешает в повседневной жизни увидеть и [неофициальные](https://en.wikipedia.org/wiki/List\_of\_HTTP\_status\_codes#:\~:text=Fi%20hotspot).%5B57%5D-,Unofficial%20codes,-The%20following%20codes), [еще](https://developer.fastly.com/reference/http/http-statuses/) и [еще](https://support.cloudflare.com/hc/en-us/articles/360029779472-Troubleshooting-Cloudflare-1XXX-errors). + +**Почему ошибка 404 относится к 4** - клиентской, если по идее должна быть 5\*\*?\*\* Объясняется это тем, что сервер работает и готов вернуть страницу в ответ на запрос, однако страницы по запрашиваемому адресу у него попросту нет. Таким образом, вины сервера в этом нет и предполагается опечатка в URL, которая является виной клиента. В этом вопросе сбивает с толку то, что ошибка 404 часто возвращается, когда страница была перемещена или удалена, или не совпадает имя файла в коде и на сервере. Тогда корректнее показывать ошибки 301 Moved Permanently (перемещено), что можно настроить в конфигурации большинства серверов, либо производить перенаправление на другой URL, и возвращать код 410 Gone (удалено). Однако, так как эти два варианта требуют специальной настройки сервера, большинство веб-сайтов не используют их. + +**На какой метод не может вернуться ошибка 501?** The HTTP 501 Not Implemented серверный код ответа на ошибку указывает, что метод запроса не поддерживается сервером и не может быть обработан. Единственными методами, которые необходимы серверам для поддержки (и, следовательно, не должны возвращать этот код), являются GET и HEAD. + +**Отличия HTTP/1.1 от HTTP/2.0** + +11 февраля 2015 года опубликованы финальные версии черновика следующей версии протокола. В отличие от предыдущих версий, протокол HTTP/2 является бинарным. Среди ключевых особенностей: мультиплексирование запросов, расстановка приоритетов для запросов, сжатие заголовков, загрузка нескольких элементов параллельно посредством одного TCP-соединения, поддержка проактивных push-уведомлений со стороны сервера. Подробнее [тут](https://www.8host.com/blog/v-chem-raznica-mezhdu-http1-1-i-http2/). + +**HTTP3** + +Десятилетиями весь интернет держался на TCP, но он начал устаревать еще в конце 2000-х. Его предполагаемая замена, новый транспортный протокол под названием QUIC, настолько отличается от TCP по ключевым пунктам, что просто использовать поверх него HTTP/2 было бы очень сложно. Поэтому сам по себе HTTP/3 - это относительно незначительное изменение HTTP/2 для адаптации к новому протоколу QUIC. Вот он-то как раз и содержит те фичи, которые всех приводят в восторг. + +![https://hsto.org/r/w1560/webt/nb/71/n2/nb71n20vpyaiwsjwnafwhl1pxx4.png](https://hsto.org/r/w1560/webt/nb/71/n2/nb71n20vpyaiwsjwnafwhl1pxx4.png) + +TCP, который мы использовали с первых дней интернета, изначально был создан не на максимуме эффективности, поэтому нам и стал нужен QUIC. Например, TCP требует рукопожатие для установки нового соединения, чтобы проверить, что клиент и сервер существуют и готовы обмениваться данными. Нужно сделать полный круговой путь по сети, прежде чем можно будет делать что-то ещё. Если клиент и сервер находятся далеко, время кругового пути (round-trip time, RTT) может составить более 100 мс, что приводит к ощутимым задержкам. + +Второй пример: TCP видит все данные, которые передает, как один «файл», или поток байтов, даже если мы передаем несколько файлов одновременно (например, загружаем страницу с несколькими ресурсами). На практике это означает, что, если пакеты TCP с данными одного файла теряются, все остальные файлы будут ждать восстановления этих пакетов. Это так называемая блокировка начала очереди - head-of-line (HoL) blocking. На практике с этими недостатками можно бороться (иначе зачем бы мы мучились с TCP целых 30 с лишним лет), но они серьезно влияют на протоколы верхнего уровня, например, HTTP. + +На самом деле нам нужен был не HTTP/3, а TCP/2. Просто в процессе у нас сам собой получился HTTP/3. Всё то, чего мы с таким нетерпением ждем от HTTP/3 (быстрая установка соединения, меньше блокировок HoL, миграция соединения и т. д.), - на самом деле уже реализовано в QUIC. + +**QUIC** + +QUIC - это универсальный транспортный протокол. Как и TCP, он может и будет использоваться в разных сценариях, не только для HTTP и загрузки сайтов. Например, поверх QUIC можно пристроить DNS, SSH, SMB, RTP и так далее. Давайте узнаем о QUIC чуть больше, ведь именно с ним связаны многие заблуждения по поводу HTTP/3. + +Вы, наверное, слышали, что QUIC работает поверх еще одного протокола - UDP. Это правда, но производительность тут ни при чём. В идеале QUIC мог бы быть полностью независимым транспортным протоколом сразу над IP в стеке, как на картинке выше. + +Но тогда возникли бы те же сложности, что и при попытке развивать TCP: пришлось бы сначала обновить все устройства в интернете, чтобы они распознавали и разрешали QUIC. К счастью, мы можем разместить QUIC поверх еще одного распространенного протокола транспортного уровня: UDP. + +Многие говорят, что HTTP/3 создан поверх UDP в целях производительности. Якобы HTTP/3 работает быстрее, потому что, как и UDP, не устанавливает соединение и не ждет повторной передачи пакетов. Не верьте. Мы уже сказали, что UDP используется протоколом QUIC, а значит и HTTP/3, в надежде, что так их будет проще развернуть, ведь UDP уже знают и используют почти все устройства в интернете. + +Расположенный поверх UDP, QUIC, по сути, реализует почти все функции, которые делают TCP таким эффективным и популярным (пусть и чуть более медленным) протоколом. QUIC абсолютно надежен - он использует подтверждение полученных пакетов и повторные передачи, чтобы добрать то, что потерялось. QUIC по-прежнему устанавливает соединение и использует сложную систему рукопожатий. + +Наконец, QUIC использует механизмы flow-control и congestion-control, которые не дают отправителю перегрузить сеть или получателя, но замедляют TCP по сравнению «чистым» UDP. Правда QUIC реализует эти функции умнее и эффективнее. В нём собраны десятилетия опыта и лучших практик TCP и новые функции. + +**HTTPS** + +У HTTP есть один недостаток: данные передаются в открытом виде и никак не защищены. На пути из точки А в точку Б информация в интернете проходит через десятки промежуточных узлов, и, если хоть один из них находится под контролем злоумышленника, данные могут перехватить. То же самое может произойти, когда вы пользуетесь незащищенной сетью Wi-Fi, например, в кафе. Для установки безопасного соединения используется протокол HTTPS с поддержкой шифрования. + +HTTPS (аббр. от англ. HyperText Transfer Protocol Secure) - расширение протокола HTTP для поддержки шифрования в целях повышения безопасности. Данные в протоколе HTTPS передаются поверх криптографических протоколов TLS или устаревшего в 2015 году SSL. + +HTTPS не является отдельным протоколом. Это обычный HTTP, работающий через шифрованные транспортные механизмы SSL и TLS. Он обеспечивает защиту от атак, основанных на прослушивании сетевого соединения - от снифферских атак и атак типа man-in-the-middle, при условии, что будут использоваться шифрующие средства и сертификат сервера проверен и ему доверяют. + +По умолчанию HTTPS URL использует 443 TCP-порт (для незащищенного HTTP - 80). Чтобы подготовить веб-сервер для обработки https-соединений, администратор должен получить и установить в систему сертификат открытого и закрытого ключа для этого веб-сервера. В TLS используется как асимметричная схема шифрования (для выработки общего секретного ключа), так и симметричная (для обмена данными, зашифрованными общим ключом). Сертификат открытого ключа подтверждает принадлежность данного открытого ключа владельцу сайта. Сертификат открытого ключа и сам открытый ключ посылаются клиенту при установлении соединения; закрытый ключ используется для расшифровки сообщений от клиента. + +Существует возможность создать такой сертификат, не обращаясь в центр сертификации. Подписываются такие сертификаты этим же сертификатом и называются самоподписанными (self-signed). Без проверки сертификата каким-то другим способом (например, звонок владельцу и проверка контрольной суммы сертификата) такое использование HTTPS подвержено атаке посредника. + +Эта система также может использоваться для аутентификации клиента, чтобы обеспечить доступ к серверу только авторизованным пользователям. Для этого администратор обычно создает сертификаты для каждого пользователя и загружает их в браузер каждого пользователя. Также будут приниматься все сертификаты, подписанные организациями, которым доверяет сервер. Такой сертификат обычно содержит имя и адрес электронной почты авторизованного пользователя, которые проверяются при каждом соединении, чтобы проверить личность пользователя без ввода пароля. + +В HTTPS для шифрования используется длина ключа 40, 56, 128 или 256 бит. Некоторые старые версии браузеров используют длину ключа 40 бит (пример тому - IE версий до 4.0), что связано с экспортными ограничениями в США. Длина ключа 40 бит не является надежной. Многие современные сайты требуют использования новых версий браузеров, поддерживающих шифрование с длиной ключа 128 бит, с целью обеспечить достаточный уровень безопасности. Шифрование с длиной ключа 128 бит значительно затрудняет подбор паролей и доступ к личной информации. + +Традиционно на одном IP-адресе может работать только один HTTPS-сайт. Для работы нескольких HTTPS-сайтов с различными сертификатами применяется расширение TLS под названием Server Name Indication (SNI). + +Идентификация в HTTPS: + +* Идентификация сервера: HTTP/TLS запросы генерируются путём разыменования URI, вследствие чего имя хоста становится известно клиенту. В начале общения, сервер посылает клиенту свой сертификат, чтобы клиент идентифицировал его. Это позволяет предотвратить атаку посредника. В сертификате указывается URI сервера. Согласование имени хоста и данных, указанных в сертификате, происходит в соответствии с протоколом RFC2459. Если имя сервера не совпадает с указанным в сертификате, то пользовательские программы, например браузеры, сообщают об этом пользователю. В основном, браузеры предоставляют пользователю выбор: продолжить незащищённое соединение или прервать его. +* Идентификация клиента: Обычно сервер не располагает информацией о клиенте, достаточной для его идентификации. Однако для обеспечения повышенной защищенности соединения используется так называемая two-way authentication. При этом сервер после подтверждения его сертификата клиентом также запрашивает сертификат. Таким образом, схема подтверждения клиента аналогична идентификации сервера. + +Источники: + +* [HTTP](https://ru.wikipedia.org/wiki/HTTP) +* [HTTP/3 от А до Я: основные концепции. Часть 1](https://habr.com/ru/company/southbridge/blog/575464/) +* [HTTPS](https://ru.wikipedia.org/wiki/HTTPS) + +Доп. материал: + +* [HTTP для тестировщиков](https://www.youtube.com/watch?v=iS-D5jZ\_c24\&t=1s\&ab\_channel=HillelITSchool) +* [Идемпотентный метод](https://developer.mozilla.org/ru/docs/Glossary/Idempotent) +* [Жизненный цикл HTTP-запроса](https://www.youtube.com/watch?v=8ZKlOD4fRT0) diff --git a/seti-i-okolo-nikh/identifikaciya-resursov-v-seti-identifying-resources-on-the-web.md b/seti-i-okolo-nikh/identifikaciya-resursov-v-seti-identifying-resources-on-the-web.md new file mode 100644 index 0000000..bf533ec --- /dev/null +++ b/seti-i-okolo-nikh/identifikaciya-resursov-v-seti-identifying-resources-on-the-web.md @@ -0,0 +1,91 @@ +# Идентификация ресурсов в сети (Identifying resources on the Web) + +"Объект" (или "цель") HTTP-запроса называется "ресурс", чья природа может быть разной: фото, документ, или что-либо ещё. Каждый ресурс идентифицируется с помощью унифицированного идентификатора ресурса URI используемого повсюду в HTTP для идентификации ресурсов. + +* **URI** - Uniform Resource Identifier (унифицированный идентификатор ресурса); +* **Uniform Resource Locator** (унифицированный определитель местонахождения ресурса); +* **URN** - Uniform Resource Name (унифицированное имя ресурса). + +Твое имя, скажем, “Джон Доу” - это URN. Место, в котором вы живете, например, “Улица Вязов, 13” - это уже URL. Вы можете быть идентифицированы как уникальное лицо с вашим именем или вашим адресом. Эта уникальная личность - это уже URI. И хотя ваше имя может быть вашим уникальным идентификатором (URI), оно не может быть URL-адресом, поскольку ваше имя не помогает найти ваше местоположение. Другими словами, URI (которые являются URN) не являются URL-адресами. + +Упрощая: URL - отвечает на вопрос: «Где и как найти что-то?», URN - отвечает на вопрос: «Как это что-то идентифицировать». + +Вернемся в интернет: + +* URI - имя и адрес ресурса в сети, включает в себя URL и URN; +* URL - адрес ресурса в сети, определяет местонахождение и способ обращения к нему; +* URN - имя ресурса в сети, определяет только название ресурса, но не говорит как к нему подключиться. + +Пример: + +* URI - [https://wiki.merionet.ru/images/vse-chto-vam-nuzhno-znat-pro-devops/1.png](https://wiki.merionet.ru/images/vse-chto-vam-nuzhno-znat-pro-devops/1.png) +* URL - [https://wiki.merionet.ru](https://wiki.merionet.ru) +* URN - images/vse-chto-vam-nuzhno-znat-pro-devops/1.png + +**URI** + +URI - последовательность символов, идентифицирующая физический или абстрактный ресурс, который не обязательно должен быть доступен через сеть Интернет, причем, тип ресурса, к которому будет получен доступ, определяется контекстом и/или механизмом. **URI = URL + URN**. + +**Синтаксис URI** + +**1. Схема или протокол** + +![](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8013/1b6fa040d01616291d46728bec20217e/mdn-url-protocol%40x2.png) + +http:// это пример протокола (схемы). Тут описывается какой протокол браузер должен использовать. Обычно это HTTP протокол или его безопасная версия - HTTPS. Интернет требует один из этих двух, но браузеры также знают как работать с некоторыми другими, например mailto: (чтобы открыть почтовый клиент) или ftp: для работы с передачей файлов. Популярные схемы: + +| **Схема** | **Описание** | +| ----------- | ---------------------------------------------------------------------------------------------------------- | +| data | [Data URIs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics\_of\_HTTP/Data\_URIs) | +| file | Доступ к файлам на локальном компьютере | +| ftp | [File Transfer Protocol](https://developer.mozilla.org/en-US/docs/Glossary/FTP) (протокол передачи файлов) | +| http/https | Hyper text transfer protocol (Secure) | +| mailto | Адрес электронной почты | +| ssh | Протокол Secure shell для работы с серверами | +| tel | Телефон | +| urn | Uniform Resource Names | +| view-source | Исходный код ресурса | +| ws/wss | (Зашифрованные) соединения WebSocket | + +. + +**2. Владелец (имя хоста)** + +![https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8015/27a85bc523b43b4a95eafa507c6f4bff/mdn-url-domain%40x2.png](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8015/27a85bc523b43b4a95eafa507c6f4bff/mdn-url-domain%40x2.png) + +www.example.com - это доменное имя, идентификатор ответственного за это пространство имён. Идентифицирует, какой именно Веб-сервер получает запрос. Альтернативно, можно просто использовать IP address, но поскольку это не так удобно, то этот способ используется не часто. + +**3. Порт** + +![https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8017/7eb6b750dbbd7c3e265350db98abf26c/mdn-url-port%40x2.png](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8017/7eb6b750dbbd7c3e265350db98abf26c/mdn-url-port%40x2.png) + +:80 - это порт сервера. Он идентифицирует технические "ворота", которые нужны для доступа к ресурсу на сервере. Обычно порт не указывается, т.к. существуют общепринятые нормы о стандартных портах для HTTP (80 для HTTP и 443 для HTTPS). В других случаях обязательно нужно указывать. + +**4. Путь** + +![https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8019/63b209915f591797257e0493e3cf0e64/mdn-url-path%40x2.png](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8019/63b209915f591797257e0493e3cf0e64/mdn-url-path%40x2.png) + +/path/to/myfile.html - это путь к ресурсу на Веб-сервере. Изначально путь типа этого указывал на физическое место файла на сервере, но сейчас всё чаще это псевдоним или описание некоторого абстрактного ресурса. + +**5. Строка запроса (query string)** + +![https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8021/6d9b484f4e40296ed184336efe3ea668/mdn-url-parameters%40x2.png](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8021/6d9b484f4e40296ed184336efe3ea668/mdn-url-parameters%40x2.png) + +key1=value1\&key2=value2 - это дополнительные параметры (query parameters), предоставляемые Веб-серверу. Это список пар "ключ=значение", разделенных символом & . Веб-сервер может использовать эти параметры как дополнительные инструкции, что именно сделать с ресурсом перед отправкой его пользователю. Каждый Веб-сервер имеет свои правила насчет параметров, и единственный надежный способ узнать как конкретный Веб-сервер обрабатывает эти параметры - это спросить того, кто контролирует Веб-сервер. + +**6. Фрагмент** + +![](https://media.prod.mdn.mozit.cloud/attachments/2014/06/25/8023/dcb82b686e614cf536e8260edb2c0f8f/mdn-url-anchor%40x2.png) + +"символ решетки"SomewhereInTheDocument - это "якорь" на другую часть ресурса. Якорь представляет собой что-то вроде "закладки" внутри ресурса, давая браузеру указание показать содержимое с определённого места. В HTML-документе, к примеру, браузер будет скроллить к точке где якорь определён, а на аудио/видео-документе браузер попытается перейти на время, указанное в якоре. Важно что часть, начинающаяся с # - никогда не пересылается серверу в запросе. + +Источники: + +* [Идентификация ресурсов в Вебе](https://developer.mozilla.org/ru/docs/Web/HTTP/Basics\_of\_HTTP/Identifying\_resources\_on\_the\_Web) +* [URL И URI - в чем различие?](https://wiki.merionet.ru/servernye-resheniya/36/url-i-uri-v-chem-razlichie/#) + +Доп. материал: + +* [URI - сложно о простом (Часть 1)](https://habr.com/ru/post/232385/) +* [RFC 7230, секция 2.7: Uniform Resource Identifiers](https://datatracker.ietf.org/doc/html/rfc7230#section-2.7) +* [Список схем URI](https://translated.turbopages.org/proxy\_u/en-ru.ru.4ae8fbd1-61dffb3d-16db65b2-74722d776562/https/en.wikipedia.org/wiki/List\_of\_URI\_schemes) diff --git a/seti-i-okolo-nikh/kesh-cache.md b/seti-i-okolo-nikh/kesh-cache.md new file mode 100644 index 0000000..331f70e --- /dev/null +++ b/seti-i-okolo-nikh/kesh-cache.md @@ -0,0 +1,146 @@ +# Кэш (Cache) + +Производительность веб-сайтов и приложений можно значительно повысить за счет повторного использования ранее полученных ресурсов. + +**Кэширование (или кэш)** - это некий промежуточный буфер, в котором хранятся данные. Благодаря кэшированию страница сайта не воссоздается заново для каждого пользователя. Кэширование позволяет осуществлять работу с большим количеством данных в максимально сжатые сроки и при ограниченных ресурсах (серверных и пользовательских). + +Необходимо понимать, что работу с данными можно производить как на стороне клиента, так и на сервере. Притом, серверная обработка данных централизована и имеет ряд несомненных преимуществ (особенно для службы поддержки). + +**Категории кэшей**: + +* **Приватный** (private) кэш браузера: предназначен для отдельного пользователя. Вы, возможно, уже видели параметры кэширования в настройках своего браузера. Кеш браузера содержит все документы, загруженные пользователем по HTTP. Он используется для доступа к ранее загруженным страницам при навигации назад/вперед, позволяет сохранять страницы, или просматривать их код, не обращаясь лишний раз к серверу. Кроме того, кэш полезен при отключении от сети. +* **Общий** (shared) прокси-кэш: это кэш, который сохраняет ответы, чтобы их потом могли использовать разные пользователи. Например, в локальной сети вашего провайдера или компании, может быть установлен прокси, обслуживающий множество пользователей, чтобы можно было повторно использовать популярные ресурсы, сокращая тем самым сетевой трафик и время ожидания. + +**Виды кэширования**: + +**1. Браузерное кэширование или клиентское кэширование** + +Представляет собой составление для браузера команды использовать имеющуюся кэшированную копию. Работа такого кэширования основана на том, что при повторном посещении, браузеру отдаётся заголовок 304 Not Modified, а сама страница или картинка загружаются из локального пользовательского кэша. Получается, что вы экономите на трафике между браузером посетителя и хостингом сайта. Соответственно, страница вашего сайта начинает загружаться быстрее. + +**1.1 Кэширование файлов и картинок** + +Браузерное кэширование как нельзя лучше подходит для сайтов, содержащих большое количество изображений: картинка не скачивается каждый раз при открытии сайта, а просто загружается через кэш браузера. Это первый уровень кэширования, который состоит в отдаче заголовка «expired» и заголовка «304 Not Modified». Наиболее эффективным считается кэширование на 2 недели. Однако в данном случае есть важный нюанс: если изображение на сайте меняется, то браузер узнает об этом не сразу, а только если выждать expiry или сбросить кэш в самом браузере. Это не очень эффективно, если файл постоянно изменяется и необходимо постоянно отдавать его актуальную версию. + +**1.2 Кэширование https** + +Специальные заголовки вида strict-security. Позволяет браузеру всегда обращаться по https к выбранному домену. Сохраняет это состояние довольно жёстко и, в случае отмены этого вида кэша, браузер ещё довольно долго будет пытаться загрузить страницу по https, при этом игнорируя текущие заголовки. + +**1.3 Кэширование центра сертификации** + +Так называемый, stamp центра сертификации. + +Данный вид кэширования считается обязательным для применения, если вы не хотите, чтобы пользователи вашего сайта ждали, когда центр сертификации (а это некий сервер, который отвечает за достоверность вашего сертификата) обработает запрос от браузера пользователя и подтвердит, что ваш сайт действительно подтверждён им. + +**1.4 Кэширование страниц** + +Когда страница уже сгенерирована, нужно постоянно отслеживать ее актуальность. Для этого вы должны использовать серверный кэш с отслеживанием времени изменения отдельных частей страницы (если страница строится из множества динамически генерируемых блоков). При таком подходе в каждом ответе от сервера установлены специальные заголовки, обозначающие время изменения страницы, которые затем отправляются браузером пользователя при повторном обращении к странице сайта. Сервер при получении таких заголовков можем проанализировать текущее состояние страницы (возможно, даже отрисовать её), но вместо содержимого страницы отдать заголовок «304 Not Modified», что для пользовательского браузера будет означать, что можно показать страницу из своего (браузера пользователя) кэша. + +Конечно, можно отправлять соответствующие заголовки без использования серверного отслеживания кэша, но в таком случае большинство пользователей получат обновление контента страницы довольно поздно. При таком подходе браузер иногда опрашивает сервер для получения обновлений, но периодичность и правила для каждого браузера настраиваются его разработчиком, поэтому надеяться на то, что ваши пользователи получат обновления вовремя, не приходится. + +Как правило, кэш подразделяется по типу пользователей: + +* для авторизованных; +* для неавторизованных. + +Данное разделение обусловлено уникальностью контента, для каждого авторизованного пользователя и общностью контента для гостевых пользователей. В большинстве сайтов неавторизованный пользователь не может изменять содержимое сайта, а значит и влиять на его содержимое. + +Браузерный кэш позволяет экономить трафик и время, затрачиваемое на загрузку страниц. Но для достижения эффекта экономии, пользователь должен хотя бы один раз посетить нашу страницу, а это означает, что нагрузка на серверные ресурсы уменьшится, но не значительно. + +**2. Серверное кэширование** + +Под серверным кэшированием понимаются все виды кэширования, при котором данные хранятся на серверной стороне. Эти данные не доступны клиентским браузерам. Кэш создается и хранится по принципу «один ко многим» (многие, в данном случае, - это клиентские устройства). + +**2.1 Кэширование страницы целиком** + +Наиболее эффективный кэш. Чем он интересен? Самое большое его достоинство в том, что отдача страницы происходит практически в момент обращения, как следствие - это возможность обработки миллионов запросов даже на самом слабом сервере со скоростью работы памяти и с незначительным задействованием процессора. + +Пожалуй, любой когда-либо мечтал о сайте, работающем со скоростью «ping» или быстрее. + +Но и у этого типа кэша есть свои минусы: например, невозможность кэшировать страницы для авторизованного пользователя, либо пользователя, содержимое страницы которого зависит от текущих переменных пользователя. + +Используйте этот кэш, если серверу известны все статичные состояния внешних данных, такие как: uri, get (без дополнительных параметров), пользователь не авторизован - то есть, фактически, это идеальное состояние страницы для гостевых пользователей. Учитывайте тот факт, что при таком кэшировании архитектура сайта или приложения всегда должна однотипно обрабатывать входящие запросы и отдавать однотипные ответы. Такое состояние есть в любом приложении или сайте, его нужно лишь отследить и применить к нему кэш. + +Кэширование страниц целиком, чаще всего, применяют в каких-то экстренных случаях, при этом кэш страниц сохраняется на заранее указанное время (от 2 минут), в течение которого ответы от сервера однотипны (не позволяйте браузеру кэшировать это). + +**2.2 Кэширование результатов компиляции php-файлов** + +Различают как чистую компиляцию кода, так и его оптимизацию во время компилирования (подмена скриптов). + +**2.3 Кэширование отдельных блоков страницы** + +Это, пожалуй, самый интересный, но и сложный вид кэширования. Тем не менее, он тоже может быть эффективным, и на его примере легче всего объяснить принципы кэширования в целом. + +Необходимо отслеживать: состояние таблиц, состояние сессии пользователя, выключать ли кэширование при POST или GET запросах (http query), зависимость от текущего адреса, постоянство кэширования (при изменении предыдущих условий) или его динамическую подстройку. + +Кэширование отдельных блоков страниц лучше других типов кэширования подойдет, если вам нужно, например, уменьшить количество запросов к базе данных от реальных (авторизованных) пользователей. Кстати, при правильно заданных зависимостях, он будет работать даже эффективнее, чем все последующие виды кэширования. + +Почему этот вид кэширования настолько важен? Всё дело в том, что расширение пула серверов баз данных намного более сложная задача, чем расширение пула серверов php-части сайта. Более того, php конфликты состояния кэширования решаются гораздо легче, чем конфликты при работе с множеством баз данных. + +**2.4 Кэширование php на основе неразделяемых ресурсов** + +Лучше всего подходит при стандартизации запросов, получении данных из общих ресурсов, наличии внутренних переменных, к которым php-ресурсы обращаются несколько раз при генерации страницы. + +**2.5 Кэширование php на основе общих ресурсов** + +Такое кэширование применяйте для хранения сериализированных данных. Например: конфигурационного файла, состояния таблиц, списков файловой системы. + +**2.6 Кэширование mysql на основе query cache** + +Это довольно известная и наиболее освещенная тема. Тем не менее, хотелось бы рассмотреть специфику работы с timestamp и то, как можно избежать постоянного сброса query cache. + +Наверняка, вы регулярно сталкивались с ситуацией, когда необходимо отдать новые материалы, дата публикации которых уже разрешена текущим timestamp? Проще говоря, WHERE show\_ts<=UNIX\_TIMESTAMP() + +Если использовать постоянно меняющийся timestamp в таких запросах, то sql кэш будет не только бесполезен, но даже вреден, так как будет копиться количество кэшированных запросов, данные которых устарели в момент создания кэша. Мы предлагаем следующий выход из ситуации: + +Как правило, любой материал публикуется в определенные моменты времени. К примеру, 00:00. Всё что нужно сделать - создать запрос, который будет оценивать таблицу по максимальной дате, при этом, меньшей текущей. + +Что-то вроде: SELECT SQL\_NO\_CACHE MAX(show\_ts) … WHERE show\_ts<=UNIX\_TIMESTAMP(); + +Да, этот запрос кэшироваться не будет, но будут кэшироваться все запросы к этой таблице, если их количество больше одного. Эта простая операция существенно улучшит жизнь sql-кэширования. + +Кэшировать эти запросы имеет смысл, если чтений из таблицы немного больше чем записи. + +**2.7 Кэширование mysql результатов работы, агрегирующие таблицы** + +Существует правило: обновлений данных должно быть значительно меньше, чем чтения для их отдачи. То есть не имеет смысл агрегировать то, что изменится в тот же момент, при этом важна актуальность агрегированных данных. Что выбирать для агрегирования? Обычно это какая-то статистическая информация о числе записей, дате последнего обновления, авторе последнего обновления и тому подобное. + +Существуют также кеши шлюзов, [CDN](https://www.cloudflare.com/learning/cdn/what-is-caching/#:\~:text=What%20is%20CDN%20caching%3F), реверсные прокси кеши и балансировщики нагрузки, разворачиваемые на серверах для повышения надежности, производительности и масштабируемости веб-сайтов и веб-приложений. + +**3. Кэширование и прокси-серверы** + +В компьютерных сетях прокси-серверы могут быть представлены специальным аппаратным обеспечением или соответствующими приложениями. Они играют роль посредников между клиентами и серверами, хранящими данные, которые этим клиентам требуются. Кэширование - это одна из задач, которую они решают. Рассмотрим различные виды прокси-серверов. + +**3.1 Шлюзы** + +Шлюз (gateway) - это прокси-сервер, который перенаправляет входящие запросы или исходящие ответы, не модифицируя их. Такие прокси-серверы ещё называют туннелирующими прокси (tunneling proxy), веб-прокси (web proxy), прокси (proxy), или прокси уровня приложения (application level proxy). Эти прокси-серверы обычно совместно используются, например, всеми клиентами, находящимися за одним и тем же файрволом, что делает их хорошо подходящими для кэширования запросов. + +**3.2 Прямые прокси-серверы** + +Прямой прокси-сервер (forward proxy, часто такие серверы называют просто proxy server) обычно устанавливается на стороне клиента. Веб-браузер, который настроен на использование прямого прокси-сервера, будет отправлять исходящие запросы этому серверу. Затем эти запросы будут перенаправлены на целевой сервер, расположенный в интернете. Одно из преимуществ прямых прокси заключаются в том, что они защищают данные клиента (однако, если говорить об обеспечении анонимности в интернете, безопаснее будет пользоваться VPN). + +**3.3 Веб-ускорители** + +Веб-ускоритель (web accelerator) - это прокси-сервер, который уменьшает время доступа к сайту. Он делает это, заранее запрашивая у сервера документы, которые, вероятнее всего, понадобятся клиентам в ближайшем будущем. Подобные серверы, кроме того, могут сжимать документы, ускорять выполнение операций шифрования, уменьшать качество и размер изображений, и так далее. + +**3.4 Обратные прокси-серверы** + +Обратный прокси-сервер (reverse proxy) - это обычно сервер, расположенный там же, где и веб-сервер, с которым он взаимодействует. Обратные прокси-серверы предназначены для предотвращения прямого доступа к серверам, расположенным в частных сетях. Обратные прокси используются для балансировки нагрузки между несколькими внутренними серверами, предоставляют возможности SSL-аутентификации или кэширования запросов. Такие прокси выполняют кэширование на стороне сервера, они помогают основным серверам в обработке большого количества запросов. + +**3.5 Пограничное кэширование** + +Обратные прокси-серверы расположены близко к серверам. Существует и технология, при использовании которой кэширующие серверы располагаются как можно ближе к потребителям данных. Это - так называемое пограничное кэширование (edge caching), представленное сетями доставки контента (CDN, Content Delivery Network). Например, если вы посещаете популярный веб-сайт и загружаете какие-нибудь статические данные, они попадают в кэш. Каждый следующий пользователь, запросивший те же данные, получит их, до истечения срока их кэширования, с кэширующего сервера. Эти серверы, определяя актуальность информации, ориентируются на серверы, хранящие исходные данные. + +![](https://hsto.org/getpro/habr/post\_images/725/e92/202/725e92202e18534148c628761bf2d6a4.png) + +_Примечание. В тестировании практически во всех случаях правило - очищать кэш после каждого прохода теста (если только это не целенаправленной тестирование самого кэша или требуется наличие кэша по каким-либо причинам). Дело в том, что кэш очевидно искажает показатели performance testing, а также может быть причиной ошибочного дефект-репорта из-за устаревания и/или несогласованности актуальных и сохраненных данных. В некоторых ситуациях без очистки кеша не обойтись даже просто из-за огромного количества кэшируемых данных._ + +Источники: + +* [11 видов кэширования для современного сайта](https://habr.com/ru/company/zerotech/blog/316316/) +* [Кэширование и производительность веб-приложений](https://habr.com/ru/company/ruvds/blog/350310/) + +Доп. материал: + +* [Обзор кэширования](https://aws.amazon.com/ru/caching/) +* [RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching](https://datatracker.ietf.org/doc/html/rfc7234) +* [HTTP-кеширование](https://developer.mozilla.org/ru/docs/Web/HTTP/Caching) diff --git a/seti-i-okolo-nikh/khranilishe-na-storone-klienta-client-side-storage.md b/seti-i-okolo-nikh/khranilishe-na-storone-klienta-client-side-storage.md new file mode 100644 index 0000000..5a7f3e2 --- /dev/null +++ b/seti-i-okolo-nikh/khranilishe-na-storone-klienta-client-side-storage.md @@ -0,0 +1,150 @@ +# Хранилище на стороне клиента (Client-side storage) + +Современные веб-браузеры поддерживают несколько способов хранения данных из веб-сайтов на компьютере пользователя - с разрешения пользователя - чтобы потом получать их, когда это необходимо. Это позволяет долгосрочно хранить данные, сохранять сайты или документы для использования без подключения к сети, сохранять пользовательские настройки для вашего сайта и многое другое. + +Ранее, мы говорили о разнице между статическими и динамическими сайтами. Большинство современных веб-сайтов являются динамическими - они хранят данные на сервере, используя какую-то базу данных (серверное хранилище), а затем запускают код на стороне сервера чтобы извлечь необходимые данные, вставить их в шаблоны статических страниц и передать полученный HTML-код клиенту для отображения в браузере пользователя. + +Хранилище на стороне клиента работает по схожим принципам, но используется по-другому. Оно состоит из API-интерфейсов JavaScript, которые позволяют вам хранить данные на клиенте (то есть на компьютере пользователя), а затем извлекать их при необходимости. Это имеет много разных применений, таких как: + +* Персонализация настроек сайта (например, отображение выбранных пользователем виджетов, цветовой схемы или размера шрифта). +* Сохранение предыдущей активности на сайте (например, сохранение содержимого корзины покупок из предыдущего сеанса, запоминание, был ли пользователь ранее авторизован в системе). +* Сохранение данных и ресурсов локально, так что сайт будет быстрее (и, возможно, экономичнее) загружаться или использоваться без подключения к сети. +* Сохранение созданных веб-приложением документов локально для использования в автономном режиме. + +Часто, хранилища на сторонах клиента и сервера используются совместно. К примеру, вы должны загрузить из базы данных пакет музыкальных файлов для веб-игры, или музыкальный плеер хранит их в базе данных на стороне клиента, и воспроизводит по мере необходимости. + +Пользователь должен будет загрузить музыкальные файлы только один раз - при последующих посещениях они будут извлечены из локальной базы данных. + +**Старый подход: Cookie** (HTTP cookie, web cookie, internet cookie, browser cookie) + +**Куки** (англ. cookie, букв. - «печенье») - небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Веб-клиент (обычно веб-браузер) всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса. Применяется для сохранения данных на стороне пользователя, на практике обычно используется для: + +* аутентификации пользователя; +* хранения персональных предпочтений и настроек пользователя; +* отслеживания состояния сеанса доступа пользователя; +* сбора статистики о пользователях. + +Поддержки браузерами cookie (прием, сохранение и последующая пересылка серверу сохранённых cookie) требуют многие сайты с ограничениями доступа, большинство интернет-магазинов. Настройка оформления и поведения многих веб-сайтов по индивидуальным предпочтениям пользователя тоже основана на cookie. + +Cookie легко перехватить и подменить (например, для получения доступа к учетной записи), если пользователь использует нешифрованное соединение с сервером. В группе риска пользователи, выходящие в интернет при помощи публичных точек доступа Wi-Fi и не использующие при этом таких механизмов, как SSL и TLS. Шифрование позволяет также решить и другие проблемы, связанные с безопасностью передаваемых данных. + +Большинство современных браузеров позволяет пользователям выбрать - принимать cookie или нет, но их отключение делает невозможной работу с некоторыми сайтами. Кроме того, по законам некоторых стран (например, согласно постановлению Евросоюза от 2016 года, см. общий регламент по защите данных) сайты должны в обязательном порядке запрашивать согласие пользователя перед установкой cookie. + +**Назначение** + +Cookie используются веб-серверами для идентификации пользователей и хранения данных о них. + +К примеру, если вход на сайт осуществляется при помощи cookie, то, после ввода пользователем своих данных на странице входа, cookie позволяют серверу запомнить, что пользователь уже идентифицирован и ему разрешен доступ к соответствующим услугам и операциям. + +Многие сайты также используют cookie для сохранения настроек пользователя. Эти настройки могут использоваться для персонализации, которая включает в себя выбор оформления и функциональности. Например, Википедия позволяет авторизованным пользователям выбрать дизайн сайта. Поисковая система Google позволяет пользователям (в том числе и не зарегистрированным в ней) выбрать количество результатов поиска, отображаемых на одной странице. + +Cookie также используются для отслеживания действий пользователей на сайте. Как правило, это делается с целью сбора статистики, а рекламные компании на основе такой статистики формируют анонимные профили пользователей для более точного нацеливания рекламы + +**Типы cookie** + +* **Сессионные cookie**: Сессионные cookie, также известные как временные cookie, существуют только во временной памяти, пока пользователь находится на странице веб-сайта. Браузеры обычно удаляют сессионные cookie после того, как пользователь закрывает окно браузера. В отличие от других типов cookie, сессионные cookie не имеют истечения срока действия, и поэтому браузеры понимают их как сессионные. +* **Постоянные cookie**: Вместо того, чтобы удаляться после закрытия браузера, как это делают сессионные cookie, постоянные cookie-файлы удаляются в определенную дату или через определённый промежуток времени. Это означает, что информация о cookie будет передаваться на сервер каждый раз, когда пользователь посещает веб-сайт, которому эти cookie принадлежат. По этой причине постоянные cookie иногда называются следящие cookie, поскольку они могут использоваться рекламодателями для записи о предпочтениях пользователя в течение длительного периода времени. Однако, они также могут использоваться и в «мирных» целях, например, чтобы избежать повторного ввода данных при каждом посещении сайта. +* **Сторонние cookie**: Обычно атрибут домена cookie совпадает с доменом, который отображается в адресной строке веб-браузера. Это называется первый файл cookie. Однако сторонний файл cookie принадлежит домену, отличному от того, который указан в адресной строке. Этот тип файлов cookie обычно появляется, когда веб-страницы содержат контент с внешних веб-сайтов, например, рекламные баннеры. Это открывает возможности для отслеживания истории посещений пользователя и часто используется рекламодателями для предоставления релевантной рекламы каждому пользователю. В качестве примера предположим, что пользователь посещает www.example.org. Этот веб-сайт содержит рекламу от ad.foxytracking.com, которая при загрузке устанавливает файл cookie, принадлежащий домену рекламы (ad.foxytracking.com). Затем пользователь посещает другой веб-сайт www.foo.com, который также содержит рекламу от ad.foxytracking.com и устанавливает файл cookie, принадлежащий этому домену (ad.foxytracking.com). В конце концов, оба этих cookie будут отправлены рекламодателю при загрузке их рекламы или посещении их веб-сайта. Затем рекламодатель может использовать эти cookie для создания истории просмотров пользователя на всех веб-сайтах, на которых размещена реклама этого рекламодателя. По состоянию на 2014 год некоторые веб-сайты устанавливали cookie для чтения более чем на 100 сторонних доменах. В среднем на одном веб-сайте было установлено 10 файлов cookie, при этом максимальное количество файлов cookie (как для сторонних, так и для третьих сторон) может превышать 800. Большинство современных веб-браузеров содержит настройки конфиденциальности, которые могут блокировать сторонние cookie. +* **Супер-cookie**: Супер-cookie - это cookie-файл с источником домена верхнего уровня (например, .ru) или общедоступным суффиксом (например, .co.uk). Обычные cookie, напротив, имеют происхождение от конкретного доменного имени, например example.com. Супер-cookie могут быть потенциальной проблемой безопасности и поэтому часто блокируются веб-браузерами. Если браузер разблокирует вредоносный веб-сайт, злоумышленник может установить супер-cookie и потенциально нарушить или выдать себя за законные запросы пользователей на другой веб-сайт, который использует тот же домен верхнего уровня или общедоступный суффикс, что и вредоносный веб-сайт. Например, супер-cookie с происхождением .com может злонамеренно повлиять на запрос к example.com, даже если файл cookie не был создан с сайта example.com. Это может быть использовано для подделки логинов или изменения информации пользователя. Публичный список суффиксов помогает снизить риск, который представляют супер-cookie. Публичный список суффиксов - это инициатива кросс-вендоров, целью которого является предоставление точного и актуального списка суффиксов доменных имен. В старых версиях браузеров может отсутствовать актуальный список, и поэтому они будут уязвимы для супер-cookie из определённых доменов. Термин «supercookie» (супер-cookie) иногда используется для отслеживания технологий, которые не используют файлы cookie HTTP. В августе 2011 года на веб-сайтах Microsoft были обнаружены два таких механизма «супер-cookie»: синхронизация файлов cookie, которая порождает cookie MUID (уникальный идентификатор машины), и cookie ETag. Из-за внимания средств массовой информации Microsoft позже отключила этот код. +* **Зомби-cookie**: Поскольку cookie можно очень легко удалить из браузера, программисты ищут способы идентифицировать пользователей даже после полной очистки истории браузера. Одним из таких решений являются зомби-cookie (или evercookie, или persistent cookie) - неудаляемые или трудно удаляемые cookie, которые можно восстановить в браузере с помощью JavaScript. Это возможно потому, что для хранения куки сайт одновременно использует все доступные хранилища браузера (HTTP ETag, Session Storage, Local Storage, Indexed DB), в том числе и хранилища приложений, таких как Flash Player (Local Shared Objects), Microsoft Silverlight (Isolated Storage) и Java (Java persistence API). Когда программа обнаруживает отсутствие в браузере cookie-файла, информация о котором присутствует в других хранилищах, она тут же восстанавливает его на место и тем самым идентифицирует пользователя для сайта. + +**Работа cookie** + +Как и любой другой HTTP-заголовок, cookie должны передаваться в браузер до того, как будут переданы какие-либо другие данные, включая пустые строки и пробельные символы (это ограничение HTTP-протокола). + +Установка cookie: Запрашивая страницу, браузер отправляет веб-серверу короткий текст с HTTP-запросом. Например, для доступа к странице http://www.example.org/index.html браузер отправляет на сервер www.example.org следующий запрос: + +* GET /index.html HTTP/1.1 +* Host: www.example.org + +Сервер отвечает, отправляя запрашиваемую страницу вместе с текстом, содержащим HTTP-ответ. Там может содержаться указание браузеру сохранить cookie: + +* HTTP/1.1 200 OK +* Content-type: text/html +* Set-Cookie: name=value + +Строка Set-cookie отправляется лишь тогда, когда сервер желает, чтобы браузер сохранил cookie. В этом случае, если cookie поддерживаются браузером и их приём включен, браузер запоминает строку name=value (имя = значение) и отправляет её обратно серверу с каждым последующим запросом. Например, при запросе следующей страницы http://www.example.org/spec.html браузер пошлёт серверу www.examle.org следующий запрос: + +* GET /spec.html HTTP/1.1 +* Host: www.example.org +* Cookie: name=value +* Accept: _/_ + +Этот запрос отличается от первого запроса тем, что содержит строку, которую сервер отправил браузеру ранее. Таким образом, сервер узна́ет, что этот запрос связан с предыдущим. Сервер отвечает, отправляя запрашиваемую страницу и, возможно, добавив новые cookie. + +Значение cookie может быть изменено сервером путем отправления новых строк Set-Cookie: name=new\_value. После этого браузер заменяет старое cookie с тем же name на новую строку. + +Cookie также могут устанавливаться программами на языках типа JavaScript, встроенными в текст страниц, или аналогичными скриптами, работающими в браузере. В JavaScript для этого используется свойство cookie объекта document - document.cookie. Например, document.cookie="temperature=20" создаст cookie под именем «temperature» и значением 20. + +**Аутентификация** + +Cookie могут использоваться сервером для опознания ранее аутентифицированных пользователей. Это происходит следующим образом: + +* Пользователь вводит имя пользователя и пароль в текстовых полях страницы входа и отправляет их на сервер. +* Сервер получает имя пользователя и пароль, проверяет их и, при их правильности, отправляет страницу успешного входа, прикрепив cookie с неким идентификатором сессии. Эта cookie может быть действительна не только для текущей сессии браузера, но может быть настроена и на длительное хранение. +* Каждый раз, когда пользователь запрашивает страницу с сервера, браузер автоматически отправляет cookie с идентификатором сессии серверу. Сервер проверяет идентификатор по своей базе идентификаторов и, при наличии в базе такого идентификатора, «узнаёт» пользователя. + +Этот метод широко используется на многих сайтах, например на Yahoo!, в Википедии и в Facebook'е. + +Многие браузеры (в частности Opera, FireFox) путём редактирования свойств cookie могут управлять поведением веб-сайтов. Изменив срок истечения непостоянных (сессионных) cookie, можно, например, получить формально-неограниченную сессию после авторизации на каком-либо сайте. Возможность редактирования cookie стандартными средствами отсутствует в Internet Explorer. Но, воспользовавшись иными механизмами, например, JavaScript, пользователь может изменить cookie-файл. Более того, существует возможность заменить сессионные cookie постоянными (с указанием срока годности). + +Однако серверное программное обеспечение может отслеживать такие попытки. Для этого сервер выдаёт cookie на определенный срок и записывает дату окончания cookie у себя или, в зашифрованном виде, в самих cookie, каждый раз, когда пользователь обращается к серверу. Если cookie, присланный браузером, имеет дату годности, отличную от той, что хранится на сервере или содержатся в cookie, значит, имеет место попытка подмены даты годности cookie. Сервер может отреагировать, например, запросив у пользователя повторную авторизацию. + +**Тестирование файлов cookie** + +Тестирование файлов cookie - это процесс проверки того, работают ли файлы cookie должным образом. При тестировании файлов cookie тестировщикам необходимо проверить статус файла cookie, срок действия файла cookie, доступность файла cookie, ограничения безопасности и т. д. + +**Пример чек-листа** для Cookie testing: + +* Файлы cookie корректно создаются на диске; +* Поведение при отказе включить куки: + * Отображается ли соответствующее сообщение для Пользователей, чтобы включить файлы cookie для доступа к сайту? + * Есть ли обходной путь для доступа к сайту для браузеров с отключенными файлами cookie. +* Работоспособность после удаления файлов cookie; +* Работоспособность после повреждения (путем редактирования) файлов cookie и невозможность входа в систему после редактирования данных для входа; +* Личные или конфиденциальные данные, хранящиеся в файле cookie, находятся в зашифрованном формате; +* Кросс-браузерное тестирование файлов cookie; +* Не должно быть чрезмерного использования файлов cookie. + +**Недостатки куки** + +Концепция хранения на стороне клиента существует уже давно. С первых дней Интернета, использовали cookies для хранения информации, чтобы персонализировать пользовательский опыт на веб-сайтах. Это самая ранняя форма хранилища на стороне клиента, обычно используемая в Интернете. + +Из-за этого возраста существует ряд проблем - как технических, так и с точки зрения пользовательского опыта - связанных с файлами cookie. Эти проблемы настолько значительны, что при первом посещении сайта людям, живущим в Европе, показываются сообщения, информирующие их о том, будут ли они использовать файлы cookie для хранения данных о них. Это связано с частью законодательства Европейского Союза, известного как EU Cookie directive. + +Они устарели, у них множество проблем с безопасностью, и они не способны хранить сложные данные. При этом существуют лучшие, более современные, способы хранения более широкого спектра данных на компьютере пользователя. + +Единственным преимуществом файлов cookie является то, что они поддерживаются очень старыми браузерами, поэтому, если ваш проект требует, чтобы вы поддерживали устаревшие браузеры (например, Internet Explorer 8 или более ранние версии), файлы cookie могут по-прежнему быть полезными, но для большинства проектов вы не нужно больше прибегать к ним. + +Почему по-прежнему создаются новые сайты с использованием файлов cookie? Это происходит главным образом из-за привычек разработчиков, использования старых библиотек, которые всё ещё используют куки-файлы, и наличия множества веб-сайтов, предоставляющих устаревшие справочные и учебные материалы для обучения хранению данных. + +**Новый подход: Web Storage и IndexedDB** + +Современные браузеры имеют гораздо более простые и эффективные API для хранения данных на стороне клиента, чем при использовании файлов cookie. + +* [**The Web Storage API**](https://developer.mozilla.org/ru/docs/Web/API/Web\_Storage\_API) обеспечивает очень простой синтаксис для хранения и извлечения данных, состоящих из пар 'ключ' : 'значение'. Это полезно, когда вам просто нужно сохранить некоторые простые данные, такие как имя пользователя, вошли ли они в систему, какой цвет использовать для фона экрана и т. д. +* [**The IndexedDB API**](https://developer.mozilla.org/ru/docs/Web/API/IndexedDB\_API) обеспечивает браузер полной базой данных для хранения сложных данных. Это может быть использовано для хранения полных наборов записей клиентов и даже до сложных типов данных, таких как аудио или видео файлы. + +Интернет-хранилище упрощенно можно рассматривать как усовершенствование куки. Тем не менее, оно отличается от куки в некоторых ключевых направлениях: + +* Размер хранилища: интернет-хранилище поддерживает гораздо больше места на диске в сравнении с куки, которому доступно всего 4 Кбайта, что примерно в 1000 раз меньше чем у веб-хранилища (5 Мбайт на домен в Mozilla Firefox, Google Chrome, и Opera, и 10 Мбайт в Internet Explorer); +* Интерфейс на стороне клиента: в отличие от куки, которые могут быть доступны как на сервере, так и на стороне клиента, веб-хранилище попадает исключительно под компетенцию сценариев (скриптов) на стороне клиента. Данные интернет-хранилища не передаются на сервер при каждом запросе HTTP, и веб-сервер не может напрямую записать в интернет-хранилище; +* Локальное хранилище и Сессионное хранилище: интернет-хранилище предлагает две различных области: локальное хранилище и сессионное хранилище, которые различаются по своим объемам и времени жизни. Данные размещаются в отдельное для каждого домена локальное хранилище (оно доступно для всех скриптов из домена, который первоначально добавил данные) и сохраняются после закрытия браузера. Сессия сохраняется по принципу одна страница - одно окно и ограничивается жизнью данного окна, то есть для каждого открытого окна создается новая сессия, которая прекращает свое существование при закрытии окна и не зависит от домена, открывшего её. Сохранение сессии предназначено для предоставления отдельных экземпляров одного и того же веб-приложения для работы в разных окнах, не мешая друг другу. В случае с куки подобное становится крайне затруднительно или даже невозможно; +* Интерфейс и модель данных: интернет-хранилище в настоящее время предоставляет программный интерфейс лучше, чем куки. Интерфейс представляет собой ассоциативный массив модели данных, где ключи и значения являются строками. Дополнительный API для доступа к структурированным данным на основе SQL находится на рассмотрении рабочей группы W3C. + +**Что нас ждёт в будущем: Cache API** + +Некоторые современные браузеры поддерживают новое [Cache API](https://developer.mozilla.org/ru/docs/Web/API/Cache). Этот API предназначен для хранения HTTP-ответов на конкретные запросы и очень полезен для таких вещей, как хранение ресурсов сайта в автономном режиме, чтобы впоследствии сайт можно было использовать без сетевого подключения. Cache обычно используется в сочетании с [Service Worker API](https://developer.mozilla.org/ru/docs/Web/API/Service\_Worker\_API), однако это не обязательно. + +Источники: + +* [Cookie](https://ru.wikipedia.org/wiki/Cookie) +* [Learn Website Cookie Testing - Complete Guide](https://www.softwaretestingmaterial.com/website-cookie-testing/) +* [Client-side storage](https://developer.mozilla.org/ru/docs/Learn/JavaScript/Client-side\_web\_APIs/Client-side\_storage) +* [Web Storage](https://ru.wikipedia.org/wiki/Web\_Storage) + +Доп. материал: + +* [Плагины для тестирования файлов cookie](https://www.softwaretestingmaterial.com/website-cookie-testing/#:\~:text=the%20comments%20below.-,Plugins%20To%20Test%20Cookies,-%3A) +* [«Осторожно, печеньки!»: советы начинающим тестировщикам в сфере безопасности](https://habr.com/ru/company/redmadrobot/blog/544198/) +* [Cookies уходят. Да здравствует FLoC?](https://www.it-world.ru/it-news/tech/170330.html) diff --git a/seti-i-okolo-nikh/klient-servernaya-arkhitektura-client-server-architecture.md b/seti-i-okolo-nikh/klient-servernaya-arkhitektura-client-server-architecture.md new file mode 100644 index 0000000..ffd432a --- /dev/null +++ b/seti-i-okolo-nikh/klient-servernaya-arkhitektura-client-server-architecture.md @@ -0,0 +1,132 @@ +# Клиент - серверная архитектура (Client-Server Architecture) + +**Клиент - сервер** - вычислительная или сетевая архитектура, в которой задания или сетевая нагрузка распределены между поставщиками услуг, называемыми серверами, и заказчиками услуг, называемыми клиентами. Фактически клиент и сервер - это программное обеспечение. Обычно эти программы расположены на разных вычислительных машинах и взаимодействуют между собой через вычислительную сеть посредством сетевых протоколов, но они могут быть расположены также и на одной машине. Программы-серверы ожидают от клиентских программ запросы и предоставляют им свои ресурсы в виде: + +* данных (например, загрузка файлов посредством HTTP, FTP, BitTorrent, потоковое мультимедиа или работа с базами данных); +* сервисных функций (например, работа с электронной почтой, общение посредством систем мгновенного обмена сообщениями или просмотр web-страниц во всемирной паутине). + +Поскольку одна программа-сервер может выполнять запросы от множества программ-клиентов, ее размещают на специально выделенной вычислительной машине, настроенной особым образом, как правило, совместно с другими программами-серверами, поэтому производительность этой машины должна быть высокой. Из-за особой роли такой машины в сети, специфики ее оборудования и программного обеспечения, её также называют сервером, а машины, выполняющие клиентские программы, соответственно, клиентами. + +Архитектуру «клиент-сервер» принято разделять на три класса: одно-, двух- и трехуровневую. Однако, нельзя сказать, что в вопросе о таком разделении в сообществе ИТ-специалистов существует полный консенсус. Многие называют одноуровневую архитектуру двухуровневой и наоборот, то же можно сказать о соотношении двух- и трёхуровневой архитектур. + +**Одноуровневая архитектура (1-Tier)** + +Одноуровневая архитектура «клиент-сервер» (1-Tier) - такая, где все прикладные программы рассредоточены по рабочим станциям, которые обращаются к общему серверу баз данных или к общему файловому серверу. Никаких прикладных программ сервер при этом не исполняет, только предоставляет данные. + +В целом, такая архитектура очень надежна, однако, ей сложно управлять, поскольку в каждой рабочей станции данные будут присутствовать в разных вариантах. Поэтому возникает проблема их синхронизации на отдельных машинах. В общем, как можно видеть из рисунка, в этой архитектуре просматривается еще один уровень - базы данных, что дает повод во многих случаях называть её двухуровневой. + +**Двухуровневая архитектура (2-Tier)** + +К двухуровневой архитектуре «клиент-сервер» следует относить такую, в которой прикладные программы сосредоточены на сервере приложений (Application Server), например, сервере 1С или сервере CRM, а в рабочих станциях находятся программы-клиенты, которые предоставляют для пользователей интерфейс для работы с приложениями на общем сервере. + +Такая архитектура представляется наиболее логичной для архитектуры «клиент-сервер». В ней, однако, можно выделить два варианта. Когда общие данные хранятся на сервере, а логика их обработки и бизнес-данные хранятся на клиентской машине, то такая архитектура носит название “fat client thin server” (толстый клиент, тонкий сервер). Когда не только данные, но и логика их обработки и бизнес-данные хранятся на сервере, то это называется “thin client fat server” (тонкий клиент, толстый сервер). Такая архитектура послужила прообразом облачных вычислений (Cloud Computing). + +**Трехуровневая архитектура (3-Tier)** + +В трехуровневой архитектуре сервер баз данных, файловый сервер и другие представляют собой отдельный уровень, результаты работы которого использует сервер приложений. Логика данных и бизнес-логика находятся в сервере приложений. Все обращения клиентов к базе данных происходят через промежуточное программное обеспечение (middleware), которое находится на сервере приложений. Вследствие этого, повышается гибкость работы и производительность. + +![](https://lh4.googleusercontent.com/7XPZfb-FP-EZRjWxvoEzjufyC41R9DIAWjBpgrAwL7G1ZqJLozBK2TD8FACZGYgDRia1nkcwbethz2H2gtQ\_sbJ8XKKPbraPLRBTV-mp92RbQNrK1biSctjP53HT0KPBZ9ObBgCz) + +**Многоуровневая архитектура (N-Tier)** + +В отдельный класс архитектуры «клиент-сервер» можно вынести многоуровневую архитектуру, в которой несколько серверов приложений используют результаты работы друг друга, а также данные от различных серверов баз данных, файловых серверов и других видов серверов. + +По сути, предыдущий вариант, трехуровневая архитектура - не более, чем частный случай многоуровневой архитектуры. + +Преимуществом многоуровневой архитектуры является гибкость предоставления услуг, которые могут являться комбинацией работы различных приложений серверов разных уровней и элементов этих приложений. + +Очевидным недостатком является сложность, многокомпонентность такой архитектуры. + +**Характеристики архитектуры «клиент-сервер»** + +* Асимметричность протоколов. Между клиентами и сервером существуют отношения «один ко многим». Инициатором диалога с сервером обычно является клиент. +* Инкапсуляция услуг. После получения запроса на услугу от клиента, сервер решает, как должна быть выполнена данная услуга. Модификация («апгрейд») сервера может производиться без влияния на работу клиентов, поскольку это не влияет на опубликованный интерфейс взаимодействия между ними. Иными словами, максимум, что может при этом почувствовать пользователь - незначительная задержка отклика сервера в течение небольшого времени апгрейда. +* Целостность. Программы и общие данные для сервера управляются централизованно, что снижает стоимость обслуживания и защищает целостность данных. В то же время, данные клиентов остаются персонифицированными и независимыми. +* Местная прозрачность. Сервер - это программный процесс, который может исполняться на той же машине, что и клиент, либо на другой машине, подключенной по сети. Программное обеспечение «клиент-сервер» обычно скрывает местоположение сервера от клиентов, перенаправляя запрос на услуги через сеть. +* Обмен на основе сообщений. Клиенты и сервер являются нежёстко связанными («loosely-coupled») процессами, которые обмениваются сообщениями: запросами на услуги и ответами на них. +* Модульный дизайн, способный к расширению. Модульный дизайн программной платформы «клиент-сервер» придаёт ей устойчивость к отказам, то есть, отказ в каком-то модуле не вызывает отказа всего приложения. В такой системе, один или больше серверов могут отказать без остановки всей системы в целом, до тех пор, пока услуги отказавшего сервера могут быть предоставлены с резервного сервера. Другое преимущество модульности в том, что приложение «клиент-сервер» может автоматически реагировать на повышение или понижение нагрузки на систему, путем добавления или отключения услуг или серверов. +* Независимость от платформы. Идеальное приложение «клиент-сервер» не зависит от платформ оборудования или операционной системы. Клиенты и серверы могут развертываться на различных аппаратных платформах и разных операционных системах. +* Масштабируемость. Системы «клиент-сервер» могут масштабироваться как горизонтально (по числу серверов и клиентов), так и вертикально (по производительности и спектру услуг). +* Разделение функционала. Система «клиент-сервер» - это соотношение между процессами, работающими на одной или на разных машинах. Сервер - это процесс предоставления услуг. Клиент - это потребитель услуг. +* Общее использование ресурсов. Один сервер может предоставлять услуги множеству клиентов одновременно, и регулировать их доступ к совместно используемым ресурсам. + +**Практические применения архитектуры «клиент-сервер»** + +Архитектура «клиент-сервер» - один из основных принципов работы сети Интернет. Любой веб-сайт, или приложение в Интернет работает на сервере, а его пользователи являются клиентами. Социальные сети (Фейсбук, ВК и пр.), сайты электронной коммерции (Amazon, Озон и др.) , мобильные приложения (Instagram и т.д.), устройства Интернета вещей (умные колонки или смарт-часы) работают на основе клиент-серверной архитектуры. + +Хорошим примером работы системы «клиент-сервер» является автомобильный навигатор. Приложение навигации на сервере собирает данные с многих смартфонов пользователей, на которых установлены клиенты приложения. Кроме того, приложение навигации использует ещё и данные с сервера базы данных - геоинформационной системы, который предоставляет данные, например, о текущих ремонтах дорог, о появлении новых дорог и пр. Данные со многих клиентов (местоположение, скорость) обрабатывается сервером навигации и выдаётся на смартфоны пользователей в виде информации о средней скорости движения по тому или иному участку маршрута. + +Практически любая корпоративная сеть или ИТ-система предприятия, как правило, строится по архитектуре «клиент-сервер». В небольших сетях (3-5 компьютеров в компании) функции сервера может выполнять один из рабочих компьютеров. Если число машин в организации более 10, то лучше сделать выделенный сервер (почтовый сервер, приложений, баз данных и пр.), который будет заниматься обслуживанием клиентов - компьютеров и телефонов сотрудников организации. + +В домашних сетях архитектура «клиент-сервер» тоже используется довольно часто. Например, в домашнюю сеть могут быть объединены компьютеры членов семьи, один из которых выполняет функции сервера. В домашнюю сеть также могут быть включены такие устройства, как умные колонки, умные домашние устройства (пылесосы-роботы, фотоаппараты, DVD-плееры и пр.), а также «умные» счётчики (вода, электричество) и т.д. Тогда в системе управления сервера, будут видны все параметры, данные и медиа файлы (музыка, видео, фото), а также «умные устройства». + +В настоящее время можно встретить термин Serverless Architecture, т.н. «бессерверная архитектура». Однако, по сути, она представляет собой процесс получения функций сервера в виде облачной услуги. То есть, серверы в облаке тоже есть, но для конечного пользователя они не видны, и он получает их сервисы в виде абстрактной «функции как услуги» FaaS (Function as a Service). + +Архитектура «клиент-сервер» является основой большинства корпоративных сетей и берет свое начало от самых первых вычислительных машин, т.н. «мэйнфреймов». + +_Примечание. Можно встретить такие понятия:_ + +* _“Толстый” клиент: на сервере реализованы главным образом функции доступа к базам данных, а основные прикладные вычисления выполняются на стороне клиента;_ +* _“Тонкий клиент”: на сервере выполняется основная часть прикладной обработки данных, а на клиентские рабочие станции передаются уже результаты обработки данных для просмотра и анализа пользователем с возможностью их последующей обработки (в минимальном объеме)._ +* _“Горячий/теплый” клиент: с кэшем и куками;_ +* _“Холодный” клиент: чистый, без или очищеный от кук и кэша._ + +**Статические и динамические сайты** + +**Статический сайт** - это тот, который возвращает тот же жёсткий кодированный контент с сервера всякий раз, когда запрашивается конкретный ресурс. Например, если у вас есть страница о товаре в /static/myproduct1.html, эта же страница будет возвращена каждому пользователю. Если вы добавите еще один подобный товар на свой сайт, вам нужно будет добавить ещё одну страницу (например, myproduct2.html) и так далее. Это может стать действительно неэффективным - что происходит, когда вы попадаете на тысячи страниц товаров? Вы повторяли бы много кода на каждой странице (основной шаблон страницы, структуру и т. д.), И если бы вы захотели изменить что-либо в структуре страницы - например, добавить новый раздел «связанные товары» - тогда вам придётся менять каждую страницу отдельно. + +На заметку: Статические сайты превосходны, когда у вас небольшое количество страниц и вы хотите отправить один и тот же контент каждому пользователю. Однако их обслуживание может потребовать значительных затрат по мере увеличения количества страниц. + +![https://media.prod.mdn.mozit.cloud/attachments/2016/09/04/13841/3320b8e8984e7ab1fa72124df678693c/Basic%20Static%20App%20Server.png](https://media.prod.mdn.mozit.cloud/attachments/2016/09/04/13841/3320b8e8984e7ab1fa72124df678693c/Basic%20Static%20App%20Server.png) + +Когда пользователь хочет перейти на страницу, браузер отправляет HTTP-запрос GET с указанием URL-адреса его HTML-страницы. Сервер извлекает запрошенный документ из своей файловой системы и возвращает HTTP-ответ, содержащий документ и код состояния HTTP Response status code 200 OK (успех). Сервер может вернуть другой код состояния, например, «404 Not Found», если файл отсутствует на сервере или «301 Moved Permanently», если файл существует, но был перемещён в другое место. + +Серверу для статического сайта нужно будет только обрабатывать GET-запросы, потому что сервер не сохраняет никаких модифицируемых данных. Он также не изменяет свои ответы на основе данных HTTP-запроса (например, URL-параметров или файлов cookie). + +Понимание того, как работают статические сайты, тем не менее полезно при изучении программирования на стороне сервера, поскольку динамические сайты точно так же обрабатывают запросы для статических файлов (CSS, JavaScript, статические изображения и т. д.). + +**Динамический сайт** - это тот, который может генерировать и возвращать контент на основе конкретного URL-адреса запроса и данных (а не всегда возвращать один и тот же жёсткий код для определенного URL-адреса). Используя пример сайта товара, сервер будет хранить «данные» товара в базе данных, а не отдельные HTML-файлы. При получении GET-запроса для товара сервер определяет идентификатор товара, извлекает данные из базы данных и затем создает HTML-страницу для ответа, вставляя данные в HTML-шаблон. Это имеет большие преимущества перед статическим сайтом: + +* Использование базы данных позволяет эффективно хранить информацию о товаре с помощью легко расширяемого, изменяемого и доступного для поиска способа. +* Использование HTML-шаблонов позволяет очень легко изменить структуру HTML, потому что это нужно делать только в одном месте, в одном шаблоне, а не через потенциально тысячи статических страниц. + +**Анатомия динамического запроса**: чтобы не отдаляться от практики, мы будем использовать контекст веб-сайта менеджера спортивной команды, где тренер может выбрать имя своей команды и размер команды в HTML-форме и вернуться к предлагаемому «лучшему составу» для своей следующей игры. + +На приведённой ниже диаграмме показаны основные элементы веб-сайта «team coach», а также пронумерованные ярлыки для последовательности операций, когда тренер обращается к списку «лучших команд». Частями сайта, которые делают его динамичным, являются веб-приложение (так мы будем ссылаться на серверный код, обрабатывающий HTTP-запросы и возвращающие HTTP-ответы), база данных, которая содержит информацию об игроках, командах, тренерах и их отношениях, и HTML-шаблоны. + +![https://media.prod.mdn.mozit.cloud/attachments/2016/08/31/13829/3bdb0c966814fc9395d23828a919391a/Web%20Application%20with%20HTML%20and%20Steps.png](https://media.prod.mdn.mozit.cloud/attachments/2016/08/31/13829/3bdb0c966814fc9395d23828a919391a/Web%20Application%20with%20HTML%20and%20Steps.png) + +После того, как тренер отправит форму с именем команды и количеством игроков, последовательность операций будет следующей: + +1. Веб-браузер отправит HTTP-запрос GET на сервер с использованием базового URL-адреса ресурса (/best) и кодирования номера команды и игрока в форме URL-параметров (например, /best?team=my\_team\_name\&show=11) или как часть URL-адреса (например, /best/my\_team\_name/11/). Запрос GET используется, потому что речь идёт только о запросе выборки данных (а не об их изменении). +2. Веб-сервер определяет, что запрос является «динамическим» и пересылает его в веб-приложение для обработки (веб-сервер определяет, как обрабатывать разные URL-адреса на основе правил сопоставления шаблонов, определённых в его конфигурации). +3. Веб-приложение определяет, что цель запроса состоит в том, чтобы получить «лучший список команд» на основе URL (/best/) и узнать имя команды и количество игроков из URL-адреса. Затем веб-приложение получает требуемую информацию из базы данных (используя дополнительные «внутренние» параметры, чтобы определить, какие игроки являются «лучшими», и, возможно, определяя личность зарегистрированного тренера из файла cookie на стороне клиента). +4. Веб-приложение динамически создаёт HTML-страницу, помещая данные (из базы данных) в заполнители внутри HTML-шаблона. +5. Веб-приложение возвращает сгенерированный HTML в веб-браузер (через веб-сервер) вместе с кодом состояния HTTP 200 («успех»). Если что-либо препятствует возврату HTML, веб-приложение вернёт другой код, например, «404», чтобы указать, что команда не существует. +6. Затем веб-браузер начнёт обрабатывать возвращённый HTML, отправив отдельные запросы, чтобы получить любые другие файлы CSS или JavaScript, на которые он ссылается (см. шаг 7). +7. Веб-сервер загружает статические файлы из файловой системы и возвращает их непосредственно в браузер (опять же, правильная обработка файлов основана на правилах конфигурации и сопоставлении шаблонов URL). + +Операция по обновлению записи в базе данных будет обрабатываться аналогичным образом, за исключением того, что, как и любое обновление базы данных, HTTP-запрос из браузера должен быть закодирован как запрос POST. + +**Выполнение другой работы**: задача веб-приложения - получать HTTP-запросы и возвращать HTTP-ответы. Хотя взаимодействие с базой данных для получения или обновления информации является очень распространённой задачей, код может делать другие вещи одновременно или вообще не взаимодействовать с базой данных. + +Хорошим примером дополнительной задачи, которую может выполнять веб-приложение, является отправка электронной почты пользователям для подтверждения их регистрации на сайте. Сайт также может выполнять протоколирование или другие операции. + +**Возвращение чего-то другого, кроме HTML**: серверный код сайта может возвращать не только HTML-фрагменты и файлы в ответе. Он может динамически создавать и возвращать другие типы файлов (текст, PDF, CSV и т. д.) или даже данные (JSON, XML и т. д.). + +Идея вернуть данные в веб-браузер, чтобы он мог динамически обновлять свой собственный контент (AJAX) существует довольно давно. Совсем недавно «Одностраничные приложения» стали популярными, где весь сайт написан с одним HTML-файлом, который динамически обновляется по мере необходимости. Веб-сайты, созданные с использованием приложений такого рода, переносят большие вычислительные затраты с сервера на веб-браузер и приводят к тому, что веб-сайты, ведут себя больше как нативные приложения (очень отзывчивые и т. д.). + +Источники: + +* [Клиент - сервер](https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B8%D0%B5%D0%BD%D1%82\_%E2%80%94\_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80) +* [Архитектура «Клиент-Сервер»](https://itelon.ru/blog/arkhitektura-klient-server/) +* [Клиент-сервер](https://developer.mozilla.org/ru/docs/Learn/Server-side/First\_steps/Client-Server\_overview) + +Доп. материал: + +* [Computer Networking Tutorial: The Ultimate Guide](https://www.softwaretestinghelp.com/computer-networking-basics/) +* [Web Server vs. Application Server](https://www.ibm.com/cloud/learn/web-server-vs-application-server) +* [Что такое сервер приложения](https://www.software-testing.ru/library/testing/testing-for-beginners/3771-what-is-an-application-server) +* [Клиент-серверная архитектура в картинках](https://www.youtube.com/watch?v=wLHuviTWnuY\&t=873s) +* [Тестировщик с нуля / Урок 11. Клиент-серверная архитектура. Веб-сайт, веб-приложение и веб-сервис](https://www.youtube.com/watch?v=00z-6hyIvG0\&t=743s) +* [Клиент-серверная архитектура](https://www.youtube.com/watch?v=RBml4tRP500\&t=1370s) diff --git a/seti-i-okolo-nikh/mikroservisnaya-arkhitektura-microservice-architecture.md b/seti-i-okolo-nikh/mikroservisnaya-arkhitektura-microservice-architecture.md new file mode 100644 index 0000000..7d071b9 --- /dev/null +++ b/seti-i-okolo-nikh/mikroservisnaya-arkhitektura-microservice-architecture.md @@ -0,0 +1,37 @@ +# Микросервисная архитектура (Microservice Architecture) + +Микросервисная архитектура или просто микросервисы - это особый метод разработки программных систем, который пытается сосредоточиться на создании однофункциональных модулей с четко определенными интерфейсами и операциями. Эта тенденция стала популярной в последние годы, поскольку предприятия стремятся стать более гибкими и перейти к DevOps и непрерывному тестированию. + +![https://d2m6ke2px6quvq.cloudfront.net/uploads/2020/09/11/3f3de3fc-f3a8-4cd1-81cd-518496f59141.jpg](https://d2m6ke2px6quvq.cloudfront.net/uploads/2020/09/11/3f3de3fc-f3a8-4cd1-81cd-518496f59141.jpg) + +![https://d2m6ke2px6quvq.cloudfront.net/uploads/2020/09/11/2381c271-4fde-4cc1-94d9-a2e2d72a81c0.jpg](https://d2m6ke2px6quvq.cloudfront.net/uploads/2020/09/11/2381c271-4fde-4cc1-94d9-a2e2d72a81c0.jpg) + +Микросервисы имеют множество преимуществ для Agile- и DevOps-команд - как отмечает Мартин Фаулер, Netflix, eBay, Amazon, Twitter, PayPal и другие звезды технологий перешли от монолитной к микросервисной архитектуре. В отличие от микросервисов монолитное приложение строится как единая автономная единица. Это замедляет внесение изменений в приложение, поскольку влияет на всю систему. Модификация, внесенная в небольшой участок кода, может потребовать создания и развертывания совершенно новой версии программного обеспечения. Масштабирование определенных функций приложения также означает, что вам необходимо масштабировать все приложение. Микросервисы решают эти проблемы монолитных систем, будучи максимально модульными. В простейшей форме они помогают создать приложение в виде набора небольших служб, каждая из которых работает в своем собственном процессе и развертывается независимо. Эти сервисы могут быть написаны на разных языках программирования и могут использовать разные методы хранения данных. Хотя это приводит к разработке систем, которые являются масштабируемыми и гибкими, они нуждаются в динамическом преобразовании. Микросервисы часто подключаются через API и могут использовать многие из тех же инструментов и решений, которые выросли в экосистеме RESTful и веб-сервисов. Тестирование этих API может помочь проверить поток данных и информации во время развертывания микросервиса. + +Точно так же, как не существует формального определения термина «микросервисы», нет и стандартной модели, которую вы увидите представленной в каждой системе, основанной на этом архитектурном стиле. Но вы можете ожидать, что большинство микросервисных систем будут иметь несколько примечательных характеристик: + +1. **Мультикомпонентные**: Программное обеспечение, созданное как микрослужбы, по определению может быть разбито на несколько составных служб. Почему? Таким образом каждую из этих служб можно развертывать, настраивать, а затем повторно развертывать независимо друг от друга без ущерба для целостности приложения. В результате вам может потребоваться изменить только одну или несколько отдельных служб вместо повторного развертывания целых приложений. Но у этого подхода есть свои недостатки, в том числе дорогостоящие удаленные вызовы (вместо вызовов внутри процесса), более грубые удаленные API и повышенная сложность при перераспределении обязанностей между компонентами; +2. **Созданы для бизнеса**: Стиль микросервисов обычно организован вокруг бизнес-возможностей и приоритетов. В отличие от традиционного монолитного подхода к разработке, когда разные команды уделяют особое внимание, скажем, пользовательскому интерфейсу, базам данных, технологическим уровням или логике на стороне сервера, в микросервисной архитектуре используются кроссфункциональные команды. В обязанности каждой команды входит создание конкретных продуктов на основе одного или нескольких отдельных сервисов, взаимодействующих через шину сообщений. В микросервисах команда владеет продуктом всю жизнь, как в часто цитируемой максиме Amazon: “[Вы создаете это, вы это запускаете](https://www.strehle.de/tim/weblog/archives/2010/11/09/1320)”; +3. **Простая маршрутизация**: Микросервисы действуют примерно так же, как классическая система UNIX: они получают запросы, обрабатывают их и генерируют соответствующий ответ. Это противоположно тому, как работают многие другие продукты, такие как ESB (Enterprise Service Buses), где используются высокотехнологичные системы для маршрутизации сообщений, хореографии и применения бизнес-правил. Можно сказать, что у микросервисов есть интеллектуальные конечные точки (endpoints), которые обрабатывают информацию и применяют логику, и тупые каналы (?dumb pipes), по которым информация течет; +4. **Децентрализованные**: Поскольку микросервисы включают множество технологий и платформ, старые методы централизованного управления не являются оптимальными. Сообщество микросервисов предпочитает децентрализованное управление, потому что его разработчики стремятся создавать полезные инструменты, которые затем могут использоваться другими для решения тех же проблем. Как и децентрализованное управление, микросервисная архитектура также способствует децентрализованному управлению данными. Монолитные системы используют одну логическую базу данных для разных приложений. В микросервисном приложении каждая служба обычно управляет своей уникальной базой данных; +5. **Отказоустойчивость**: Как всесторонне развитый ребенок, микросервисы созданы, чтобы справляться с ошибками. Поскольку несколько уникальных и разнообразных сервисов взаимодействуют друг с другом, вполне возможно, что сервис может выйти из строя по той или иной причине (например, когда поставщик недоступен). В этих случаях клиент должен позволить своим соседним службам работать, пока он отключается. Однако мониторинг микросервисов может помочь предотвратить риск сбоя. По понятным причинам это требование делает микросервисы более сложными по сравнению с архитектурой монолитных систем; +6. **Эволюционные**: Архитектура микросервисов представляет собой эволюционный дизайн и, опять же, идеально подходит для эволюционирующих систем, в которых вы не можете полностью предвидеть типы устройств, которые однажды могут получить доступ к вашему приложению. , можно постепенно преобразовать в микросервисы, взаимодействующие с более старой монолитной архитектурой через API. + +**Примеры** + +Netflix имеет широко распространенную архитектуру, которая превратилась из монолитной в SOA. Каждый день он получает более одного миллиарда вызовов с более чем 800 различных типов устройств на свой API потокового видео. Затем каждый вызов API запрашивает около пяти дополнительных вызовов серверной службы. Amazon также перешел на микросервисы. Они получают бесчисленное количество вызовов из различных приложений, включая приложения, которые управляют API веб-службы, а также самим веб-сайтом, которые были бы просто невозможны для их старой двухуровневой архитектуры. Аукционный сайт eBay - еще один пример, прошедший тот же переход. Их основное приложение состоит из нескольких автономных приложений, каждое из которых выполняет бизнес-логику для различных функциональных областей. + +**SOA vs. Microservices** + +«Погодите-ка, - могут бормотать некоторые из вас за утренним кофе, - разве это не просто другое название SOA?» Сервис-ориентированная архитектура (SOA), возникшая в первые несколько лет этого века, и микросервисная архитектура (сокращенно MSA) имеют ряд общих черт. Однако традиционная SOA представляет собой более широкую структуру и может означать самые разные вещи. Некоторые сторонники микросервисов вообще отвергают тег SOA, в то время как другие считают микросервисы просто идеальной, усовершенствованной формой SOA. В любом случае, мы считаем, что существует достаточно четких различий, чтобы оправдать отдельную концепцию «микросервиса» (по крайней мере, как особую форму SOA, как мы проиллюстрируем позже). Типичная модель SOA, например, обычно имеет более зависимые ESB, а микросервисы используют более быстрые механизмы обмена сообщениями. SOA также ориентирована на императивное программирование, тогда как архитектура микросервисов ориентирована на стиль программирования с гибким субъектом. Кроме того, модели SOA, как правило, имеют реляционную базу данных слишком большого размера, в то время как микросервисы часто используют базы данных NoSQL или micro-SQL (которые могут быть подключены к обычным базам данных). Но реальная разница в первую очередь связана с методами архитектуры, используемыми для получения интегрированного набора сервисов. Поскольку в цифровом мире все меняется, гибкие методы разработки, которые могут идти в ногу с требованиями эволюции программного обеспечения, бесценны. Большинство методов, используемых в архитектуре микросервисов, исходят от разработчиков, которые создавали программные приложения для крупных корпоративных организаций и знают, что сегодняшние конечные пользователи ожидают динамичного, но согласованного взаимодействия на самых разных устройствах. Масштабируемые, адаптируемые, модульные и быстродоступные облачные приложения пользуются большим спросом. И это заставило многих разработчиков изменить свой подход. + +Источники: + +* [What is Microservices?](https://smartbear.com/solutions/microservices/) + +Доп. материал: + +* [Современная Микросервисная архитектура в банковской сфере](https://www.youtube.com/watch?v=xEsLHjAPtok) +* [Microservices](https://martinfowler.com/articles/microservices.html) +* [Pattern: Microservice Architecture](https://microservices.io/patterns/microservices.html) +* [Microservices vs Monolith](https://www.n-ix.com/microservices-vs-monolith-which-architecture-best-choice-your-business/) diff --git a/seti-i-okolo-nikh/rendering-v-internete-rendering-on-the-web.md b/seti-i-okolo-nikh/rendering-v-internete-rendering-on-the-web.md new file mode 100644 index 0000000..a5e33b9 --- /dev/null +++ b/seti-i-okolo-nikh/rendering-v-internete-rendering-on-the-web.md @@ -0,0 +1,165 @@ +# Рендеринг в интернете (Rendering on the Web) + +Одно из основных решений, которые должны принять веб-разработчики, - это где реализовать логику и рендеринг в своих приложениях. Это может быть сложно, так как существует несколько разных способов создания сайта. + +**Терминология** + +* **SSR**: рендеринг на стороне сервера - рендеринг клиентского или универсального приложения в HTML на сервере; +* **CSR**: рендеринг на стороне клиента - рендеринг приложения в браузере, обычно с использованием DOM; +* Регидратация (**Rehydration**): «загрузка» представлений JavaScript на клиенте так, чтобы они повторно использовали дерево DOM и данные HTML, представленные сервером; +* Предварительный рендеринг (**Prerendering**): запуск приложения на стороне клиента во время сборки для захвата его исходного состояния в виде статического HTML; +* **TTFB**: время до первого байта - рассматривается как время между нажатием на ссылку и первым поступающим контентом; +* **FP**: First Paint - первый раз, когда любой пиксель становится видимым для пользователя; +* **FCP**: First Contentful Paint - время, когда запрашиваемый контент (тело статьи и т. д.) Становится видимым; +* **TTI**: Time To Interactive - время, когда страница становится интерактивной (события подключены и т. д.). + +**Серверный рендеринг** + +Серверный рендеринг генерирует полный HTML для страницы на сервере в ответ на навигацию. Это позволяет избежать дополнительных циклов обработки данных и шаблонов на клиенте, поскольку они обрабатываются до того, как браузер получает ответ. + +Серверный рендеринг обычно производит быструю First Paint и First Contentful Paint. Выполнение логики страницы и рендеринга на сервере позволяет избежать отправки большого количества JavaScript клиенту, что помогает быстро достичь Time to Interactive. Это имеет смысл, поскольку при серверном рендеринге вы просто отправляете текст и ссылки в браузер пользователя. Этот подход может хорошо работать для широкого спектра устройств и условий сети, и открывает интересные оптимизации браузера, такие как потоковый анализ документов. + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/server-rendering-tti.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/server-rendering-tti.png?hl=ru) + +При использовании серверного рендеринга пользователи вряд ли будут ждать, пока обработается привязанный к процессору JavaScript, прежде чем они смогут использовать ваш сайт. Даже когда нельзя избежать стороннего JS, использование серверного рендеринга для сокращения собственных затрат на JS может дать вам больше « бюджета » на все остальное. Однако у этого подхода есть один главный недостаток: генерация страниц на сервере требует времени, что часто может привести к более долгому времени до первого байта. + +Достаточно ли серверного рендеринга для вашего приложения, во многом зависит от него самого. Существует давняя дискуссия о правильном применении серверного рендеринга по сравнению с рендерингом на стороне клиента, но важно помнить, что вы можете использовать серверный рендеринг для одних страниц, а не для других нет. Некоторые сайты успешно применяют гибридные методы рендеринга. Сервер Netflix отображает свои относительно статичные целевые страницы, предварительно выбирая JS для страниц с интенсивным взаимодействием, предоставляя этим более тяжелым страницам, отображаемым клиентом, более высокую вероятность быстрой загрузки. + +Многие современные фреймворки, библиотеки и архитектуры позволяют отображать одно и то же приложение как на клиенте, так и на сервере. Эти методы могут использоваться для серверного рендеринга, однако важно отметить, что архитектуры, в которых рендеринг происходит как на сервере, так и на клиенте, представляют собой собственный класс решений с очень разными характеристиками производительности и компромиссами. Пользователи React могут использовать renderToString() или решения, построенные на его основе, такие как Next.js, для серверного рендеринга. Пользователи Vue могут взглянуть на руководство по серверному рендерингу Vue или Nuxt. Angular имеет Universal. В большинстве популярных решений используется некоторая форма гидратации, поэтому перед выбором инструмента ознакомьтесь с подходом, который используется. + +**Статический рендеринг** + +Статический рендеринг происходит во время сборки и предлагает быстрые First Paint, First Contentful Paint и Time To Interactive - при условии, что количество JS на стороне клиента ограничено. В отличие от серверного рендеринга, ему также удается достичь стабильно быстрого времени до первого байта, поскольку HTML-код для страницы не нужно генерировать на лету. Как правило, статический рендеринг означает создание отдельного HTML-файла для каждого URL-адреса заранее. Поскольку HTML-ответы генерируются заранее, статические рендеры могут быть развернуты на нескольких CDN, чтобы воспользоваться преимуществом пограничного кэширования (edge-caching). + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/static-rendering-tti.png](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/static-rendering-tti.png) + +Решения для статического рендеринга бывают всех форм и размеров. Такие инструменты как Gatsby спроектированы так, чтобы разработчики почувствовали что их приложения рендерятся динамически быстрее чем генерируются на этапе сборки. Другие, как Jekyll и Metalsmith принимают их статическую природу, обеспечивая более шаблонный подход. + +Одним из недостатков статического рендеринга является то, что отдельные HTML-файлы должны создаваться для каждого возможного URL. Это может быть сложно или даже невозможно, если вы не можете предсказать, какие будут эти URL-адреса раньше времени, или для сайтов с большим количеством уникальных страниц. + +Пользователи React могут быть знакомы с Gatsby , статическим экспортом Next.js или Navi - все это делает его удобным для автора с использованием компонентов. Тем не менее, важно понимать разницу между статическим рендерингом и предварительным рендерингом: статические рендеринг страниц являются интерактивными без необходимости выполнения большого количества JS на стороне клиента, тогда как предварительный рендеринг улучшает First Paint или First Contentful Paint одностраничного приложения (SPA), которое необходимо загрузить клиент для того, чтобы страницы были по-настоящему интерактивными. + +Если вы не уверены, является ли данное решение статическим или предварительным рендерингом, попробуйте этот тест: отключите JavaScript и загрузите созданные веб-страницы. Для статически визуализированных страниц большая часть функциональности будет по-прежнему существовать без включенного JavaScript. Для предварительно обработанных страниц могут существовать некоторые базовые функции, такие как ссылки, но большая часть страницы будет инертной. + +Еще один полезный тест - замедление работы сети с помощью Chrome DevTools и наблюдение за загрузкой JavaScript до того, как страница станет интерактивной. Для предварительного рендеринга обычно требуется больше JavaScript, чтобы стать интерактивным, и этот JavaScript имеет тенденцию быть более сложным, чем подход прогрессивного улучшения, используемый при статическом рендеринге. + +**Серверный Рендеринг против Статического Рендеринга** + +Серверный Рендеринг не является серебряной пулей - его динамическая природа может сопровождаться значительными вычислительными накладными расходами. Многие решения для рендеринга серверов не сбрасываются рано, могут задержать TTFB или удвоить отправку данных (например, встроенное состояние, используемое JS на клиенте). В React, функция renderToString() может быть медленной, поскольку она является синхронной и однопоточной. Получение серверным рендерингом «права» может включать в себя нахождение или создание решения для компонентов кэширования , управление потреблением памяти, применение техник мемоизации, и многие другие проблемы. Обычно вы обрабатываете / перестраиваете одно и то же приложение несколько раз - один раз на клиенте и один раз на сервере. Тот факт, что при рендеринге с сервера может появиться что-то раньше, не означает, что у вас меньше работы. + +Серверный рендеринг генерирует HTML по требованию для каждого URL, но может быть медленнее, чем просто обслуживание статического рендеринга контента. Если вы можете добавить дополнительную работу, серверный рендеринг + кэширование HTML может значительно сократить время серверного рендеринга. Преимуществом рендеринга на сервере является возможность извлекать больше «живых» данных и отвечать на более полный набор запросов, чем это возможно при статическом рендеринге. Страницы, требующие персонализации, являются конкретным примером типа запроса, который не будет хорошо работать при статическом рендеринге. + +Серверный рендеринг также может представлять интересные решения при построении [PWA](https://web.dev/progressive-web-apps/). Лучше использовать полностраничное сервис-воркер ([service-worker](https://developers.google.com/web/fundamentals/primers/service-workers/?hl=ru)) кэширование или просто рендерить отдельные части контента на сервере? + +**Рендеринг на стороне клиента (CSR)** + +Рендеринг на стороне клиента (CSR) означает рендеринг страниц непосредственно в браузере с использованием JavaScript. Вся логика, выборка данных, шаблоны и маршрутизация обрабатываются на клиенте, а не на сервере. + +Рендеринг на стороне клиента может быть трудно получить и быстро сохранить для мобильных устройств. Он может приблизиться к производительности чисто серверного рендеринга, если выполняет минимальную работу, сохраняя жесткий бюджет JavaScript и предоставляя ценность в минимально возможном количестве RTTs. Критические сценарии и данные могут быть доставлены быстрее, используя HTTP/2 Server Push или \, что заставляет парсер работать на вас быстрее. Шаблоны, такие как PRPL, стоит оценить, чтобы обеспечить мгновенную начальную и последующую навигацию. + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/client-rendering-tti.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/client-rendering-tti.png?hl=ru) + +Основным недостатком рендеринга на стороне клиента является то, что количество требуемого JavaScript имеет тенденцию к росту по мере роста приложения. Это становится особенно трудным с добавлением новых библиотек JavaScript, полифилов и стороннего кода, которые конкурируют за вычислительную мощность и часто должны обрабатываться до того, как содержимое страницы может быть отображено. Опыт работы с CSR, основанный на больших пакетах JavaScript, должен учитывать агрессивное разделение кода и обязательно загружать JavaScript - «обслуживайте только то, что вам нужно, когда вам это нужно». Для случаев, когда интерактивность незначительна или отсутствует, рендеринг сервера может представлять собой более масштабируемое решение этих проблем. + +Для людей, создающих одностраничное приложение, идентификация основных частей пользовательского интерфейса, используемых большинством страниц, означает, что вы можете применить технику кэширования Application Shell . В сочетании с сервис-воркерами это может значительно улучшить воспринимаемую производительность при повторных посещениях. + +**Объединение серверного рендеринга и CSR через регидратацию** + +Этот подход, часто называемый универсальным рендерингом или просто «SSR». Этот подход пытается сгладить углы между рендерингом на стороне клиента и рендерингом сервера, выполняя оба действия. Запросы навигации, такие как полная загрузка или перезагрузка страницы, обрабатываются сервером, который отображает приложение в HTML, затем JavaScript и данные, используемые для визуализации, встраиваются в итоговый документ. При аккуратной реализации это обеспечивает быструю First Contentful Paint точно так же, как серверный рендеринг, а затем «подхватывает», снова выполняя рендеринг на клиенте, используя технику, называемую (ре)гидратация. Это новое решение, но оно может иметь некоторые существенные недостатки производительности. + +Основным недостатком SSR с регидратацией является то, что он может оказать существенное негативное влияние на Time To Interactive, даже если он улучшит First Paint. Страницы SSR часто выглядят обманчиво загруженными и интерактивными, но на самом деле не могут реагировать на ввод, пока JS на стороне клиента не будет выполнен и обработчики событий не присоединены. Это может занять несколько секунд или даже минут на мобильном телефоне. + +Возможно, вы испытали это сами - в течение некоторого времени после того, как страница, которая выглядит полностью загруженной не реагирует на клики или нажатия. Это быстро расстраивает ... «Почему ничего не происходит? Почему я не могу прокрутить? + +**Проблема регидратации: одно приложение по цене двух** + +Проблемы регидратации часто могут быть хуже, чем замедленная интерактивность из-за JS. Чтобы клиентский JavaScript мог точно «подхватить», где сервер остановился, без необходимости повторного запроса всех данных, которые сервер использовал для визуализации своего HTML, текущие SSR решения обычно сериализуют ответ от пользовательского интерфейса. зависимости данных в документе в виде тегов скрипта. Полученный HTML-документ содержит высокий уровень дублирования: + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/html.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/html.png?hl=ru) + +Как вы можете видеть, сервер возвращает описание пользовательского интерфейса приложения в ответ на запрос навигации, но он также возвращает исходные данные, использованные для создания этого пользовательского интерфейса, и полную копию реализации пользовательского интерфейса, которая затем загружается на клиенте. Только после завершения загрузки и выполнения bundle.js этот интерфейс становится интерактивным. + +Метрики производительности, собранные с реальных веб-сайтов с использованием регидратации SSR, указывают на то, что его использование не рекомендуется. В конечном счете, причина кроется в пользовательском опыте: в конечном итоге крайне просто оставить пользователей в «странной долине». + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/rehydration-tti.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/rehydration-tti.png?hl=ru) + +Хотя есть надежда на SSR с регидратацией. В краткосрочной перспективе только использование SSR для контента с высокой степенью кэширования может уменьшить задержку TTFB, что дает результаты, аналогичные предварительному рендерингу. Регидратация постепенно, постепенно или частично может стать ключом к повышению эффективности этого метода в будущем. + +\*\*Рендеринг потокового сервера и прогрессивная регидратация \*\*(Streaming server rendering and Progressive Rehydration) + +За последние несколько лет серверный рендеринг получил ряд разработок. + +Рендеринг потокового сервера позволяет отправлять HTML порциями, которые браузер может визуализировать по мере получения. Это может обеспечить быструю First Paint и First Contentful Paint, поскольку разметка поступает к пользователям быстрее. В React потоки, являющиеся асинхронными в renderToNodeStream() - по сравнению с синхронным renderToString - означают, что обратное давление хорошо обрабатывается. + +Прогрессивная регидратация также стоит того, чтобы за ней следить, и кое-что, что изучал React. При таком подходе отдельные части приложения, отображаемого на сервере, «загружаются» с течением времени, а не по общему текущему подходу - инициализации всего приложения сразу. Это может помочь уменьшить объем JavaScript, необходимый для того, чтобы сделать страницы интерактивными, поскольку обновление на стороне клиента низкоприоритетных частей страницы может быть отложено для предотвращения блокировки основного потока. Это также может помочь избежать одной из самых распространенных ошибок регидратации в SSR, когда дерево DOM, отображаемое сервером, разрушается, а затем немедленно перестраивается - чаще всего потому, что при первоначальной синхронной визуализации на стороне клиента требуются не совсем готовые данные, возможно, ожидающие разрешения Promise. + +**Частичная регидратация** + +Частичная регидратация оказалась трудно осуществимой. Этот подход является продолжением идеи прогрессивной регидратации, где анализируются отдельные части (компоненты/виды/деревья), которые должны быть постепенно регидратированы, и идентифицируются те, у которых мало интерактивности или нет реактивности. Для каждой из этих в основном статических частей соответствующий код JavaScript затем преобразуется в инертные ссылки и декоративную функциональность, сокращая их площадь на стороне клиента почти до нуля. Подход частичной гидратации имеет свои проблемы и недостатки. Это создает некоторые интересные проблемы для кэширования, и навигация на стороне клиента означает, что мы не можем предполагать, что серверный HTML-код для инертных частей приложения будет доступен без полной загрузки страницы. + +**Трисоморфный рендеринг** (Trisomorphic Rendering) + +Если сервис-воркеры являются подходящим вариантом для вас, «трисоморфный» рендеринг также может представлять интерес. Это метод, при котором вы можете использовать потоковый рендеринг сервера для начальной/не-JS-навигации, а затем попросить сервис-воркер на себя рендеринг HTML для навигации после его установки. Это может поддерживать кэшированные компоненты и шаблоны в актуальном состоянии и обеспечивает навигацию в стиле SPA для отображения новых представлений в одном сеансе. Этот подход работает лучше всего, когда вы можете совместно использовать один и тот же код шаблонов и маршрутизации между сервером, клиентской страницей и сервис-воркером. + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/trisomorphic.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/trisomorphic.png?hl=ru) + +**SEO соображения** + +Команды часто учитывают влияние SEO при выборе стратегии рендеринга в сети. Рендеринг сервера часто выбирается для обеспечения «полного вида», который сканеры могут легко интерпретировать. Сканеры могут понимать JavaScript, но часто есть ограничения, о которых стоит знать, как они рендерится. Рендеринг на стороне клиента может работать, но часто не без дополнительного тестирования и работы. В последнее время динамический рендеринг также стал вариантом, заслуживающим внимания, если ваша архитектура сильно зависит от клиентского JavaScript. + +В случае сомнений инструмент Mobile Friendly Test неоценим для проверки того, что выбранный вами подход делает то, на что вы надеетесь. Он показывает визуальный предварительный просмотр того, как какая-либо страница отображается сканеру Google, найденный сериализованный контент HTML (после выполнения JavaScript) и любые ошибки, обнаруженные во время рендеринга. + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/mobile-friendly-test.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/mobile-friendly-test.png?hl=ru) + +[Вот удобная инфографика](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/infographic.png?hl=ru), показывающая спектр сервер-клиент: + +![https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/infographic.png?hl=ru](https://developers.google.com/web/updates/images/2019/02/rendering-on-the-web/infographic.png?hl=ru) + +**Как работает рендеринг в браузере** + +* Из полученного от сервера HTML-документа формируется DOM (Document Object Model). +* Загружаются и распознаются стили, формируется CSSOM (CSS Object Model). +* На основе DOM и CSSOM формируется дерево рендеринга, или render tree - набор объектов рендеринга (Webkit использует термин «renderer», или «render object», а Gecko - «frame»). Render tree дублирует структуру DOM, но сюда не попадают невидимые элементы (например - \, или элементы со стилем display:none;). Также, каждая строка текста представлена в дереве рендеринга как отдельный renderer. Каждый объект рендеринга содержит соответствующий ему объект DOM (или блок текста), и рассчитанный для этого объекта стиль. Проще говоря, render tree описывает визуальное представление DOM. +* Для каждого элемента render tree рассчитывается положение на странице - происходит layout. Браузеры используют поточный метод (flow), при котором в большинстве случаев достаточно одного прохода для размещения всех элементов (для таблиц проходов требуется больше). +* Наконец, происходит отрисовка всего этого добра в браузере - painting. + +В процессе взаимодействия пользователя со страницей, а также выполнения скриптов, она меняется, что требует повторного выполнения некоторых из вышеперечисленных операций. + +**Адаптивный и отзывчивый веб-дизайн (Adaptive vs. Responsive)** + +Чтобы онлайн ресурс корректно отображался на компьютере и мобильных устройствах, при создании сайта или интернет-магазина рекомендуется использовать адаптивный дизайн. Такой тип верстки позволяет варьировать размеры и отображение интерфейса ресурса в зависимости от типа устройства, с помощью которого пользователь зашел в Интернет. + +![](https://lh6.googleusercontent.com/fRFnPvlX-jzw2qOdOsmPfu2om3vH\_Uz19o8XwB8LB9vMCdHWRFogQnAHZ8iniIVJdulStiL4CcXe-GSrhtfBPHWQ34RQKo7e5JEeMO3cTOFNYh31XCKVpFdsZyKH\_K3xfjSTrf9u) + +**Responsive Design (RWD)** - отзывчивый дизайн - проектирование сайта с определенными значениями свойств, например, гибкая сетка макета, которые позволяют одному макету работать на разных устройствах; + +Помимо своей изменяющейся структуры, у респонсив дизайна есть несколько других преимуществ: + +* Одинаковый внешний вид ресурса в разных браузерах и на различных платформах\ + Наличие у сайта одинакового URL, что способствует SEO-оптимизации\ + Разработчикам необходимо обслуживать лишь один сайт, что позволяет сократить время, затрачиваемое на дизайн и контент + +И хотя положительные стороны респонсивного дизайна очевидны, у этого метода существует ряд недостатков. Самым большим из них является скорость загрузки, которая значительно снижается из-за высокого разрешения изображений и других визуальных элементов, необходимых для оформления внешнего вида ресурса. + +**Adaptive Design (AWD)** - адаптивный дизайн, или динамический показ - проектирование сайта с условиями, которые изменяются в зависимости от устройства, базируясь на нескольких макетах фиксированной ширины. + +Для создания отзывчивых макетов используются медиазапросы и относительные размеры элементов сетки, заданные с помощью %. В адаптивном дизайне серверные скрипты сначала определяют тип устройства, с помощью которого пользователь пытается получить доступ к сайту (настольный ПК, телефон или планшет), затем загружает именно ту версию страницы, которая наиболее оптимизирована для него. Для элементов сетки задаются фиксированные в пикселях (px) размеры. + +Источники: + +* [Рендеринг в Интернете](https://developers.google.com/web/updates/2019/02/rendering-on-the-web?hl=ru) + [оригинал](https://developers.google.com/web/updates/2019/02/rendering-on-the-web?hl=en) +* [Как браузер рендерит веб-страницу](https://webdevblog.ru/kak-brauzer-renderit-veb-stranicu/) +* [Отзывчивый и адаптивный дизайн сайта](https://html5book.ru/otzyvchivyj-dizayn-saita/) + +Доп. материал: + +* [Что происходит, когда вводишь url, или как работает интернет](https://habr.com/ru/company/karuna/blog/568702/) +* [Что на самом деле происходит, когда пользователь вбивает в браузер адрес google.com](https://m.habr.com/en/company/htmlacademy/blog/254825/) +* [Что происходит, когда пользователь набирает в браузере адрес сайта](https://vc.ru/selectel/76371-chto-proishodit-kogda-polzovatel-nabiraet-v-brauzere-adres-sayta) +* [What happens when you type a URL in the browser and press enter?](https://medium.com/@maneesha.wijesinghe1/what-happens-when-you-type-an-url-in-the-browser-and-press-enter-bb0aa2449c1a) +* [В виде картинки](https://www.programando.org/blog/2020/09/05/el-camino-del-backend-developer-dns/que-pasa-al-tipear-una-url-big.jpeg) +* [Critical rendering path](https://developer.mozilla.org/en-US/docs/Web/Performance/Critical\_rendering\_path) +* [Что такое адаптивный дизайн сайта](https://webgain.ru/osobennosti-i-plyusy-razrabotki-adaptivnogo-dizajna-sajta/) +* [Новый адаптивный дизайн](https://www.youtube.com/watch?v=dhrX\_biPH8c) +* [Responsive design](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS\_layout/Responsive\_Design) + diff --git a/seti-i-okolo-nikh/rest-soap-grpc.md b/seti-i-okolo-nikh/rest-soap-grpc.md new file mode 100644 index 0000000..886c140 --- /dev/null +++ b/seti-i-okolo-nikh/rest-soap-grpc.md @@ -0,0 +1,85 @@ +# REST/SOAP/gRPC + +**REST** (от англ. Representational State Transfer - “передача репрезентативного состояния” или “передача “самоописываемого”состояния”) - архитектурный стиль взаимодействия компонентов распределенного приложения в сети. Другими словами, REST - это набор правил того, как программисту организовать написание кода серверного приложения, чтобы все системы легко обменивались данными и приложение можно было масштабировать. REST представляет собой согласованный набор ограничений, учитываемых при проектировании распределенной гипермедиа-системы. В определенных случаях (интернет-магазины, поисковые системы, прочие системы, основанные на данных) это приводит к повышению производительности и упрощению архитектуры. В широком смысле компоненты в REST взаимодействуют наподобие взаимодействия клиентов и серверов во Всемирной паутине. REST является альтернативой RPC. + +В сети Интернет вызов удаленной процедуры может представлять собой обычный HTTP-запрос (обычно GET или POST; такой запрос называют «REST-запрос»), а необходимые данные передаются в качестве параметров запроса. Для веб-служб, построенных с учетом REST (то есть не нарушающих накладываемых им ограничений), применяют термин «RESTful». + +В отличие от веб-сервисов (веб-служб) на основе SOAP, не существует «официального» стандарта для RESTful веб-API. Дело в том, что REST является архитектурным стилем, в то время как SOAP является протоколом. Несмотря на то, что REST не является стандартом сам по себе, большинство RESTful-реализаций используют такие стандарты, как HTTP, URL, [JSON](https://habr.com/ru/post/554274/) и, реже, XML. + +**Требования к архитектуре REST** + +Существует шесть обязательных ограничений для построения распределенных REST-приложений по Филдингу. + +Выполнение этих ограничений обязательно для REST-систем. Накладываемые ограничения определяют работу сервера в том, как он может обрабатывать и отвечать на запросы клиентов. Действуя в рамках этих ограничений, система приобретает такие желательные свойства как производительность, масштабируемость, простота, способность к изменениям, переносимость, отслеживаемость и надёжность. Если сервис-приложение нарушает любое из этих ограничительных условий, данную систему нельзя считать REST-системой. + +Обязательными условиями-ограничениями являются: + +* **Модель клиент-сервер**: Первым ограничением, применимым к гибридной модели, является приведение архитектуры к модели клиент-сервер. Разграничение потребностей является принципом, лежащим в основе данного накладываемого ограничения. Отделение потребности интерфейса клиента от потребностей сервера, хранящего данные, повышает переносимость кода клиентского интерфейса на другие платформы, а упрощение серверной части улучшает масштабируемость. Наибольшее же влияние на всемирную паутину, пожалуй, имеет само разграничение, которое позволяет отдельным частям развиваться независимо друг от друга, поддерживая потребности в развитии интернета со стороны различных организаций. +* **Отсутствие состояния**: Протокол взаимодействия между клиентом и сервером требует соблюдения следующего условия: в период между запросами клиента никакая информация о состоянии клиента на сервере не хранится (Stateless protocol или «протокол без сохранения состояния»). Все запросы от клиента должны быть составлены так, чтобы сервер получил всю необходимую информацию для выполнения запроса. Состояние сессии при этом сохраняется на стороне клиента. Информация о состоянии сессии может быть передана сервером какому-либо другому сервису (например, в службу базы данных) для поддержания устойчивого состояния, например, на период установления аутентификации. Клиент инициирует отправку запросов, когда он готов (возникает необходимость) перейти в новое состояние. Во время обработки клиентских запросов считается, что клиент находится в переходном состоянии. Каждое отдельное состояние приложения представлено связями, которые могут быть задействованы при следующем обращении клиента. +* **Кэширование**: Информация должна быть проверяема, иначе она может быть удалена. Вы можете отредактировать статью, добавив ссылки на авторитетные источники. Эта отметка установлена 16 марта 2017 года. Как и во Всемирной паутине, клиенты, а также промежуточные узлы, могут выполнять кэширование ответов сервера. Ответы сервера, в свою очередь, должны иметь явное или неявное обозначение как кэшируемые или некэшируемые с целью предотвращения получения клиентами устаревших или неверных данных в ответ на последующие запросы. Правильное использование кэширования способно частично или полностью устранить некоторые клиент-серверные взаимодействия, еще больше повышая производительность и масштабируемость системы. +* **Единообразие интерфейса**: Наличие унифицированного интерфейса является фундаментальным требованием дизайна REST-сервисов. Унифицированные интерфейсы позволяют каждому из сервисов развиваться независимо. К унифицированным интерфейсам предъявляются следующие четыре ограничительных условия: + * Идентификация ресурсов: Все ресурсы идентифицируются в запросах, например, с использованием URI в интернет-системах. Ресурсы концептуально отделены от представлений, которые возвращаются клиентам. Например, сервер может отсылать данные из базы данных в виде HTML, XML или JSON, ни один из которых не является типом хранения внутри сервера. + * Манипуляция ресурсами через представление: Если клиент хранит представление ресурса, включая метаданные - он обладает достаточной информацией для модификации или удаления ресурса. + * «Самоописываемые» сообщения: Каждое сообщение содержит достаточно информации, чтобы понять, каким образом его обрабатывать. К примеру, обработчик сообщения (parser), необходимый для извлечения данных, может быть указан в списке MIME-типов. + * Гипермедиа как средство изменения состояния приложения (HATEOAS): Клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервере (к примеру, гиперссылки в гипертексте). Исключая простые точки входа в приложение, клиент не может предположить, что доступна какая-то операция над каким-то ресурсом, если не получил информацию об этом в предыдущих запросах к серверу. Не существует универсального формата для предоставления ссылок между ресурсами, Web Linking (RFC 5988 -> RFC 8288) и JSON Hypermedia API Language являются двумя популярными форматами предоставления ссылок в REST HYPERMEDIA сервисах. +* **Слои**: Клиент обычно не способен точно определить, взаимодействует он напрямую с сервером или же с промежуточным узлом, в связи с иерархической структурой сетей (подразумевая, что такая структура образует слои). Применение промежуточных серверов способно повысить масштабируемость за счет балансировки нагрузки и распределенного кэширования. Промежуточные узлы также могут подчиняться политике безопасности с целью обеспечения конфиденциальности информации. +* **Код по требованию** (необязательное ограничение): Информация должна быть проверяема, иначе она может быть удалена. Вы можете отредактировать статью, добавив ссылки на авторитетные источники. Эта отметка установлена 16 марта 2017 года. REST может позволить расширить функциональность клиента за счёт загрузки кода с сервера в виде апплетов или скриптов. Филдинг утверждает, что дополнительное ограничение позволяет проектировать архитектуру, поддерживающую желаемую функциональность в общем случае, но, возможно, за исключением некоторых контекстов. + +Просто посмотреть как выглядят запросы-ответы можно во вкладке Network в DevTools. Попробовать отправить запрос и посмотреть ответ можно с помощью [этой статьи](https://www.software-testing.ru/library/testing/testing-automation/2958-testing-get-requests). + +**SOAP** + +SOAP (от англ. Simple Object Access Protocol - простой протокол доступа к объектам) - протокол обмена структурированными сообщениями в распределенной вычислительной среде. Первоначально SOAP предназначался в основном для реализации удаленного вызова процедур (RPC). Сейчас протокол используется для обмена произвольными сообщениями в формате [**XML**](https://habr.com/ru/post/524288/), а не только для вызова процедур. Официальная спецификация последней версии 1.2 протокола никак не расшифровывает название SOAP. + +SOAP является расширением протокола XML-RPC. SOAP может использоваться с любым протоколом прикладного уровня: SMTP, FTP, HTTP, HTTPS и др. Однако его взаимодействие с каждым из этих протоколов имеет свои особенности, которые должны быть определены отдельно. Чаще всего SOAP используется поверх HTTP. SOAP является одним из стандартов, на которых базируются технологии веб-служб. + +[Структура](https://www.w3schools.com/xml/xml\_soap.asp) протокола: + +* Envelope - корневой элемент, который определяет сообщение и пространство имен, использованное в документе; +* Header - содержит атрибуты сообщения, например: информация о безопасности или о сетевой маршрутизации; +* Body - содержит сообщение, которым обмениваются приложения; +* Fault - необязательный элемент, который предоставляет информацию об ошибках, которые произошли при обработке сообщений. + +[Пример SOAP-запроса на сервер интернет-магазина](https://ru.wikipedia.org/wiki/SOAP#:\~:text=%D0%BF%D1%80%D0%B8%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9.-,%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80,-%5B%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%7C%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BA%D0%BE%D0%B4) + +[**WSDL**](https://www.w3.org/TR/wsdl.html) - это описательный язык, основанный на языке разметки XML, и именно в wsdl описан веб-сервис, который вам придется тестировать. WSDL включает в себя информацию о местоположении сервиса, часто включает в себя XSD. Именно из WSDL SOAPUI генерирует проверяемые классы. + +[**XSD**](https://en.wikipedia.org/wiki/XML\_Schema\_\(W3C\)) - это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных. + +Если Вы направите в веб-сервис нестандартный запрос, он ответит на это ошибкой. WSDL - это свод правил общения с вашим сервисом, соблюдая которые вы сможете с этим сервисом коммуницировать. Собственно WSDL и XSD подробно описывают что и в каком виде слать на сервер, чтобы получить хороший ответ. + +Что тестируется в SOAP? Бизнес-логика и то, что схема валидируется сервером (а также, что она принимает на вход параметры правильного формата). Собственно все, что касается схемы, проверяется на этапе разработки, а после, только бизнес-логика (до того момента, пока опять не начнутся изменения в схеме). + +**Отличия REST и SOAP** + +SOAP и REST нельзя сравнивать напрямую, поскольку первый - это протокол (или, по крайней мере, пытается им быть), а второй - архитектурный стиль. + +Основное различие между SOAP и REST заключается в степени связи между реализациями клиента и сервера. Клиент SOAP работает как пользовательское настольное приложение, тесно связанное с сервером. Между клиентом и сервером существует жесткое соглашение, и ожидается, что все сломается, если какая-либо из сторон что-то изменит. Вам нужно постоянное обновление после любого изменения, но легче определить, выполняется ли контракт. + +SOAP более применим в сложных архитектурах, где взаимодействие с объектами выходит за рамки теории CRUD, а вот в тех приложениях, которые не покидают рамки данной теории, вполне применимым может оказаться именно REST ввиду своей простоты и прозрачности. Действительно, если любым объектам вашего сервиса не нужны более сложные взаимоотношения, кроме: «Создать», «Прочитать», «Изменить», «Удалить» (как правило - в 99% случаев этого достаточно), возможно, именно REST станет правильным выбором. Кроме того, REST по сравнению с SOAP, может оказаться и более производительным, так как не требует затрат на разбор сложных XML команд на сервере (выполняются обычные HTTP запросы - PUT, GET, POST, DELETE). Хотя SOAP, в свою очередь, более надежен и безопасен. + +**gRPC** + +Для тех, кто еще не слышал о gRPC, gRPC - это не зависящий от языка фреймворк для удаленного вызова процедур (RPC, remote procedure calls), разработанный Google, которая серьезно вкладывается в производительность и масштабирование. Он появился довольно давно, но многие (а, может быть, только я) отложили его на второй план из-за затрат на написание IDL и дополнительного кода стабов (stub), который тоже необходимо поддерживать. В то же время REST очень легко реализуется с помощью ASP.NET Core WebAPI. + +Аналогично использованию JSON для REST, для gRPC используется [Protocol Buffers](https://developers.google.com/protocol-buffers) - не зависящий от языка формат для сериализации структурированных данных. Этим gRPC отличается от REST. Поддержка Protocol Buffers есть для всех основных языков благодаря компилятору protoc, который генерирует необходимый исходный код классов из определений в proto-файле. Еще важный момент состоит в том, что для связи gRPC использует HTTP/2, а это приносит дополнительные преимущества, такие как сжатие HTTP-заголовков и мультиплексирование запросов. + +Источники: + +* [REST](https://ru.wikipedia.org/wiki/REST) +* [SOAP](https://ru.wikipedia.org/wiki/SOAP) +* [Веб-сервисы в теории и на практике для начинающих](https://habr.com/ru/post/46374/) +* [Что такое SOAP API](https://qahacking.ru/lessons/chto-takoe-soap-api) +* [Сравниваем производительность REST и gRPC](https://habr.com/ru/company/otus/blog/545688/) + +Доп. материал: + +* [w3.org SOAP Версия 1.2 Часть 0: Учебник для начинающих](https://www.w3.org/2002/07/soap-translation/russian/part0.html) +* [REST vs. SOAP (Making the Right Architectural Decision) - 1st International SOA Symposium, Amsterdam, October 2008](https://www.slideshare.net/cesare.pautasso/rest-vs-soap-making-the-right-architectural-decision-1st-international-soa-symposium-amsterdam-october-2008-presentation) +* [Тестировщик с нуля / Урок 17. Тестирование веб-сервисов. SOAP и XML, REST и JSON для тестировщика](https://www.youtube.com/watch?v=\_cfmDnIIQTU\&t=1009s) +* [Модель зрелости REST-сервисов](https://habr.com/ru/post/590679/#:\~:text=%D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20SOAP.-,%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%20%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8%20REST%2D%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2,-%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%20%D0%B7%D1%80%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%B8%20REST) +* [JSON Validator](https://jsonlint.com) +* [XML Validator](https://xmllint.com) +* [Семантика REST: Это смешное слово «идемпотентный»](https://qsusha.wordpress.com/2017/10/29/%D1%8D%D1%82%D0%BE-%D1%81%D0%BC%D0%B5%D1%88%D0%BD%D0%BE%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%BE-%D0%B8%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9/) +* [Soap VS Rest запросы на примерах](https://www.youtube.com/watch?v=C2TMZeRdLKw) +* [Введение в SOAP и REST: что это и с чем едят](https://www.youtube.com/watch?v=2YWfJHDNQy0) diff --git a/seti-i-okolo-nikh/soket-veb-soket-socket-websocket.md b/seti-i-okolo-nikh/soket-veb-soket-socket-websocket.md new file mode 100644 index 0000000..13f4156 --- /dev/null +++ b/seti-i-okolo-nikh/soket-veb-soket-socket-websocket.md @@ -0,0 +1,83 @@ +# Сокет/веб-сокет (socket/websocket) + +**Со́кет** (англ. socket - разъем) - название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет - абстрактный объект, представляющий конечную точку соединения. + +Следует различать клиентские и серверные сокеты. Клиентские сокеты грубо можно сравнить с конечными аппаратами телефонной сети, а серверные - с коммутаторами. Клиентское приложение (например, браузер) использует только клиентские сокеты, а серверное (например, веб-сервер, которому браузер посылает запросы) - как клиентские, так и серверные сокеты. + +**Принципы сокетов** + +Для взаимодействия между машинами с помощью стека протоколов TCP/IP используются адреса и порты. Адрес представляет собой 32-битную структуру для протокола IPv4, 128-битную для IPv6. Номер порта - целое число в диапазоне от 0 до 65535 (для протокола TCP). + +Эта пара определяет сокет («гнездо», соответствующее адресу и порту). + +В процессе обмена, как правило, используется два сокета - сокет отправителя и сокет получателя. Например, при обращении к серверу на HTTP-порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq:xxxxx. + +Каждый процесс может создать «слушающий» сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). + +Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т. д. + +Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. сокет домена Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта. + +Обычно клиент явно «подсоединяется» к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером. + +**WebSocket** + +WebSocket - протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени. + +В настоящее время в W3C осуществляется стандартизация API Web Sockets. Черновой вариант стандарта этого протокола утверждён IETF. + +WebSocket разработан для воплощения в веб-браузерах и веб-серверах, но он может быть использован для любого клиентского или серверного приложения. Протокол WebSocket - это независимый протокол, основанный на протоколе TCP. Он делает возможным более тесное взаимодействие между браузером и веб-сайтом, способствуя распространению интерактивного содержимого и созданию приложений реального времени. + +**Разница Socket и WebSocket** + +Socket и WebSocket - это разные понятия в принципе. При работе по протоколу WebSocket вы будете использовать обычные сокеты для соединения. Так же как и при работе с другими протоколами будут использованы сокеты (и для работы с http, с ftp и др.). + +Например, рассмотрим строку вида - ws://127.0.0.1:15000. В ней ws - это именно указание на то, что при обмене данными будет использован протокол WebSocket. 127.0.0.1 - ip адрес компьютера, 15000 - порт, на который производится подключение. Так вот 127.0.0.1:15000 - эта пара, если можно так выразится, и является сокетом. + +Протокол WebSocket создавался для того, чтобы можно было поддерживать длительные неразрывные соединения между браузером (который является клиентом) и веб-сайтом (который является сервером). + +Протокол WebSocket не похож на HTTP. Единственное, чем он напоминает HTTP - только одним самым первым запросом на подключение (так называемым рукопожатием/handshake). Это было сделано, потому что изначально протокол рассчитан на работу в браузере и необходимо было определение возможности поддержки его. После того, как соединение установлено, ничего похожего на протокол HTTP в протоколе WebSocket даже близко нет. Именно отсутствие каких-либо наворотов в протоколе WebSocket и дает ему возможность быстрой работы. + +**Разница WebSocket и Socket.IO** + +Говоря о веб-сокетах, мы имеем ввиду протокол веб-коммуникации, представляющий полнодуплексный канал коммуникации поверх простого TCP-соединения. Проще говоря, эта технология позволяет установить связь между клиентом и сервером с минимальными затратами, позволяя создавать приложения, использующие все преимущества живого общения. Например, представьте, что вы создаете чат: вам необходимо получать и отправлять данные как можно быстрее, верно? С этим прекрасно справляются веб-сокеты! Вы можете открыть TCP-соединение и держать его открытым сколько потребуется. Веб-сокеты используются в следующих случаях: + +* Чаты; +* Многопользовательские игры; +* Совместное редактирование; +* Социальные (новостные) ленты; +* Приложения, работающие на основе местоположения. + +Socket.IO - библиотека JavaScript, основанная (написанная поверх) на веб-сокетах… и других технологиях. Она использует веб-сокеты, когда они доступны, или такие технологии, как Flash Socket, AJAX Long Polling, AJAX Multipart Stream, когда веб-сокеты недоступны. + +**AJAX** + +Ajax ( Asynchronous Javascript and XML - «асинхронный JavaScript и XML») - подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее. По-русски иногда произносится транслитом как «аякс». У аббревиатуры AJAX нет устоявшегося аналога на кириллице. + +В классической модели веб-приложения: + +* Пользователь заходит на веб-страницу и нажимает на какой-нибудь ее элемент; +* Браузер формирует и отправляет запрос серверу; +* В ответ сервер генерирует совершенно новую веб-страницу и отправляет ее браузеру и т. д. , после чего браузер полностью перезагружает всю страницу. + +При использовании AJAX: + +* Пользователь заходит на веб-страницу и нажимает на какой-нибудь ее элемент; +* JavaScript определяет, какая информация необходима для обновления страницы; +* Браузер отправляет соответствующий запрос на сервер; +* Сервер возвращает только ту часть документа, на которую пришел запрос; +* Скрипт вносит изменения с учетом полученной информации (без полной перезагрузки страницы). + +Источники: + +* [Сокет (программный интерфейс)](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BA%D0%B5%D1%82\_\(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D0%B9\_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81\)) +* [WebSocket](https://ru.wikipedia.org/wiki/WebSocket) +* [В чем разница между socket'ом и websocket'ом?](https://ru.stackoverflow.com/questions/507746/%D0%92-%D1%87%D0%B5%D0%BC-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-socket%D0%BE%D0%BC-%D0%B8-websocket%D0%BE%D0%BC) +* [Разница WebSocket и Socket.IO](https://habr.com/ru/post/498996/) +* [AJAX](https://ru.wikipedia.org/wiki/AJAX) + +Доп. материал: + +* [WebSockets vs HTTP](https://webformyself.com/websockets-vs-http/) +* [RFC 6455 - The WebSocket Protocol](https://datatracker.ietf.org/doc/html/rfc6455) +* [The WebSocket API (WebSockets)](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets\_API) diff --git a/seti-i-okolo-nikh/veb-servis-ws-web-service.md b/seti-i-okolo-nikh/veb-servis-ws-web-service.md new file mode 100644 index 0000000..f8a276f --- /dev/null +++ b/seti-i-okolo-nikh/veb-servis-ws-web-service.md @@ -0,0 +1,50 @@ +# Веб-сервис (WS - Web service) + +Веб-служба, веб-сервис (англ. web service) - идентифицируемая уникальным веб-адресом (URL-адресом) программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (SOAP, XML-RPC и т. д.) и соглашениях (REST). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения (SOA). + +В обиходе веб-сервисами называют услуги, оказываемые в Интернете. В этом употреблении термин требует уточнения, идет ли речь о поиске, веб-почте, хранении документов, файлов, закладок и т. п. Такими веб-сервисами можно пользоваться независимо от компьютера, браузера или места доступа в Интернет/ + +Если посмотреть на веб-сервисы в разрезе стека сетевых протоколов, мы увидим, что это, в классическом случае, не что иное, как еще одна надстройка поверх протокола HTTP. С другой стороны, если гипотетически разделить Интернет на несколько слоев, мы сможем выделить, как минимум, два концептуальных типа приложений - вычислительные узлы, которые реализуют нетривиальные функции и прикладные веб-ресурсы. При этом вторые, зачастую заинтересованы в услугах первых. Но и сам Интернет - разнороден, т. е. различные приложения на различных узлах сети функционируют на разных аппаратно-программных платформах, и используют различные технологии и языки. Чтобы связать все это и предоставить возможность одним приложениям обмениваться данными с другими, и были придуманы веб-сервисы. + +По сути, веб-сервисы - это реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети. + +**Архитектура** + +![https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Webservices-ru.svg/1416px-Webservices-ru.svg.png](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Webservices-ru.svg/1416px-Webservices-ru.svg.png) + +Как показано на рисунке, можно выделить три инстанции, взаимодействующие в рамках веб-службы. Переведем их названия как: + +* заказчик (service requester); +* исполнитель (service provider); +* каталог (service broker). + +Когда служба разработана, исполнитель регистрирует ее в каталоге, где её могут найти потенциальные заказчики. Заказчик, найдя в каталоге подходящую службу, импортирует оттуда её WSDL-спецификацию и разрабатывает в соответствии с ней своё программное обеспечение. WSDL описывает формат запросов и ответов, которыми обмениваются заказчик и исполнитель в процессе работы. + +Для обеспечения взаимодействия используются следующие стандарты/протоколы: + +* SOAP (Simple Object Access Protocol) - по сути это тройка стандартов SOAP/WSDL/UDDI; +* REST (Representational State Transfer) - архитектурный стиль взаимодействия компьютерных систем в сети основанный на методах протокола HTTP; +* UDDI - устарел; +* XML-RPC (XML Remote Procedure Call) - устарел; +* JSON-RPC (JSON Remote Procedure Call) - более современный аналог XML-RPC. Основное отличие - данные передаются в формате JSON; +* Специализированные протоколы для конкретного вида задач, такие как GraphQL; +* Менее распространенный, но более эффективный gRPC, передающий данные в бинарном виде и использующий HTTP/2 в качестве транспорта. + +На самом деле, SOAP произошел от XML-RPC и является следующей ступенью его развития. В то время как REST - это концепция, в основе которой лежит скорее архитектурный стиль, нежели новая технология, основанный на теории манипуляции объектами CRUD (Create Read Update Delete) в контексте концепций WWW. + +**Отличие сервиса от сервера** + +Сервис (микросервис) - это программа, размещаемая на сервере, которая предоставляет определенную функцию, находясь по определенному адресу и используя четко определенные интерфейсы и логику. Сегодня это чаще всего интерфейсы API. + +Сервер может хостить в себе тысячи сервисов. Впрочем, и один сервис может быть размещен на нескольких серверах. В более широком плане - сервер - это виртуальная машина, которая хостит в себе Apache, IIS и много-много web-сервисов. Еще в более широком плане - это железяка, которая хостит в себе множество виртуалок. + +Источники: + +* [Веб-служба](https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B1-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0) + +Доп. материал: + +* [Веб-сервисы](https://gist.github.com/vchernogorov/81da656048875132d6963304d449f770) +* [W3C Web Services](http://www.w3.org/2002/ws/) +* [Тестировщик с нуля / Урок 17. Тестирование веб-сервисов. SOAP и XML, REST и JSON для тестировщика](https://www.youtube.com/watch?v=\_cfmDnIIQTU) +* [Message broker](https://en.wikipedia.org/wiki/Message\_broker) diff --git a/test-dizain/README.md b/test-dizain/README.md new file mode 100644 index 0000000..92eca8c --- /dev/null +++ b/test-dizain/README.md @@ -0,0 +1,2 @@ +# Тест дизайн + diff --git a/test-dizain/dynamic-black-box.md b/test-dizain/dynamic-black-box.md new file mode 100644 index 0000000..8c8c471 --- /dev/null +++ b/test-dizain/dynamic-black-box.md @@ -0,0 +1,378 @@ +# Dynamic - Black box + +_Разработка тестов методом черного ящика (black box test design technique): Процедура создания и/или выбора тестовых сценариев, основанная на анализе функциональной или нефункциональной спецификации компонента или системы без знания внутренней структуры. (ISTQB)_ + +_Основанные на спецификации методы проектирования тестирования используются для получения контрольных примеров из базиса тестирования, определяющего ожидаемое поведение элемента тестирования. При использовании этих методов входные данные для тестирования контрольного примера и ожидаемый результат получаются из базиса тестирования. Выбор, какие из основанных на спецификации методов проектирования тестирования использовать в каждой конкретной ситуации, зависит от природы базиса тестирования и/или элемента тестирования, и от присущих рисков. (ГОСТ 56920)_ + +Все specification-based или Black Box testing techniques могут быть удобно описаны и систематизированы с помощью следующей таблицы: + +| **Группа** | **Техника** | **Когда используется** | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|Элементарные техники:
Комбинаторные стратегии:
Продвинутые техники:
Пример: изменение цвета кнопки покупки.
Версия A: цвет по умолчанию
Версия B: красный цвет
|Пример: изменение основных элементов целевой страницы.
Версия A: Headline_3, Img_2, CTA_1
Версия B: Заголовок_1, Img_3, CTA_2
Версия C: Headline_2, Img_4, CTA_1
Версия D: Headline_4, Img_1, CTA_3
| + +**Тестирование разделением URL** (Split URL Testing): вы создаете два или более вариантов для своей веб-страницы. Затем протестируйте эти несколько версий вашего веб-сайта по разным URL-адресам. Здесь варианты представляют собой полностью разработанные веб-страницы и хранятся на сервере, доступ к которому осуществляется через разные URL-адреса; + +| A/B Testing | Split URL Testing | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Это маркетинговый инструмент, позволяющий выяснить, что лучше всего работает для повышения конверсии, путем разделения трафика между контрольным и вариантом. | Это маркетинговый инструмент, позволяющий выяснить, что лучше всего работает для повышения конверсии, путем разделения трафика по разным URL-адресам. | +| Для создания вариантов будут внесены лишь незначительные изменения в элементы в HTML. | Здесь варианты обычно представляют собой полностью разработанную веб-страницу, которая хранится на сервере и к которой можно получить доступ через другой URL-адрес. | +| Лучше всего использовать при оптимизации отдельных веб-страниц и часто используется для проведения быстрых тестов. | Можно использовать для больших изменений, например, для новых редизайнов | + +**Мультистраничное тестирование** (Multi-Page Testing): При многостраничном тестировании мы экспериментируем, изменяя определенный элемент на нескольких страницах. Здесь вы должны показывать пользователям сочетание и совпадение вариантов вместо того, чтобы показывать согласованные варианты по набору страниц. Таким образом, мы можем тщательно протестировать один вариант против другого; + +Источник: + +[A/B Testing Guide: How To Perform AB Testing](https://www.softwaretestingmaterial.com/ab-testing/) + +Доп. материал: + +* [A/B тестирование как механизм улучшения продукта](https://www.youtube.com/watch?v=weHBjjlSBss) +* [How to Do A/B Testing: A Checklist You’ll Want to Bookmark](https://medium.com/elfsight-blog/how-to-run-a-b-testing-a-checklist-youll-want-to-bookmark-99c75aa9860b) +* [Ошибки в дизайне A/B тестов, которые я думала, что никогда не совершу](https://habr.com/ru/company/skyeng/blog/518164/) +* [A/B Тестирование: Основы](https://habr.com/ru/company/otus/blog/546168/) +* [Как выбрать уровень статистической значимости для AB-теста и как интерпретировать результат](https://habr.com/ru/post/554194/) +* [Время - деньги: анализируй А/В-тесты разумно](https://habr.com/ru/company/mailru/blog/557308/) +* [Взгляд на A/B-тестирование со стороны тестировщика](https://t.me/qa\_chillout/96) diff --git a/vidy-metody-urovni-testirovaniya/destruktivnoe-i-nedestruktivnoe-testirovanie-dt-destructive-testing-and-ndt-non-destructive-tes.md b/vidy-metody-urovni-testirovaniya/destruktivnoe-i-nedestruktivnoe-testirovanie-dt-destructive-testing-and-ndt-non-destructive-tes.md new file mode 100644 index 0000000..968d556 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/destruktivnoe-i-nedestruktivnoe-testirovanie-dt-destructive-testing-and-ndt-non-destructive-tes.md @@ -0,0 +1,27 @@ +# Деструктивное и недеструктивное тестирование (DT - Destructive testing and NDT - Non Destructive tes + +_Негативное тестирование (negative testing): Тестирование, нацеленное на демонстрацию того, что система или компонент не работают. Негативное тестирование относится в большей степени к позиции тестировщика, нежели к определенному подходу к тестированию или метод проектирования тестов, например - тестирование с некорректными входными значениями или тестирование обработки исключений. (ISTQB)_ + +**Destructive testing (негативное, Rainy day, Apocalypses day)** - тип тестирования ПО для поиска точек отказа в ПО, который проверяет систему на обработку исключительных ситуаций (срабатывание валидаторов на некорректные данные), а также проверяет, что вызываемая приложением функция не выполняется при срабатывании валидатора. Неожиданные условия могут быть чем угодно, от неправильного типа данных до хакерской атаки. Целью Destructive testing является предотвращение сбоя приложений из-за некорректных входных данных. Просто проводя положительное тестирование, мы можем только убедиться, что наша система работает в нормальных условиях, но помимо этого мы должны убедиться, что наша система может справиться и с непредвиденными условиями. Типичные примеры: ввести неправильно составленный e-mail и номер телефона, загрузить файл не предусмотренного расширения или размера. + +Для деструктивного тестирования существует множество способов его проведения: + +* Метод анализа точек отказа: это пошаговое прохождение системы, проводящее оценку того, что может пойти не так в разных точках. Для этой стратегии может быть использована помощь BA (Business Analyst); +* Экспертная проверка тестировщика: проанализируйте или дайте на ревью ваши Test cases коллеге-тестировщику, который менее знаком с системой/функцией ; +* Бизнес-анализ тест-кейсов: конечные пользователи или эксперты могут подумать о многих допустимых сценариях, которые иногда тестировщики могут их не учитывать или упустить, так как все их внимание будет сосредоточено на тестировании требований; +* Проведение предварительного тестирование с использованием контрольных таблиц (run sheets): исследовательское тестирование с использованием контрольных таблиц поможет определить, что было проверено, повторить тесты и позволит вам контролировать охват тестами; +* Используйте другой источник: вы можете попросить кого-нибудь сломать программный продукт и проанализировать различные сценарии; + +**Non Destructive testing (позитивное, Happy path, Sunny Day)** - это тип тестирования программного обеспечения, который включает в себя правильное взаимодействие с ПО. Оно дает ожидаемые результаты и доказывает, что программное обеспечение ведет себя так, как ожидалось. Пример: - Ввод правильных данных в модуль входа в систему и проверка, принимает ли он учетные данные и переходит на следующую страницу + +Источник: + +[What is Destructive Testing? Methods, Techniques and Examples](https://www.guru99.com/destructive-testing.html) + +Доп. материал: + +* [Destructive Testing And Non Destructive Testing Tutorial](https://www.softwaretestinghelp.com/destructive-non-destructive-testing/) +* [Топ 10 негативных кейсов](https://testmatick.com/ru/top-10-negativnyh-test-kejsov-ispolzuemyh-vo-vremya-testirovaniya-po/) +* [Частное мнение: Sunny day / Rainy day / Apocalypses day testing scenarios](https://qsusha.wordpress.com/2018/04/25/%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%BE%D0%B5-%D0%BC%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-sunny-day-rainy-day-apocalypses-day-testing-scenarios/) +* [Где граница «позитив-негатив»?](https://okiseleva.blogspot.com/2018/12/blog-post\_24.html) +* [Негативное тестирование: что это](https://testengineer.ru/negativnoe-testirovanie-chto-ehto/) diff --git a/vidy-metody-urovni-testirovaniya/etalonnoe-i-bazovoe-testirovanie-benchmark-and-baseline-testing.md b/vidy-metody-urovni-testirovaniya/etalonnoe-i-bazovoe-testirovanie-benchmark-and-baseline-testing.md new file mode 100644 index 0000000..744ed35 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/etalonnoe-i-bazovoe-testirovanie-benchmark-and-baseline-testing.md @@ -0,0 +1,35 @@ +# Эталонное и базовое тестирование (Benchmark and Baseline Testing) + +_Эталонный тест (benchmark test):_ + +_(1) стандарт, согласно которому может производиться измерение или сравнение._ + +_(2) тест, который может использоваться для сравнения компонентов или систем друг с другом_ + +_или на соответствие стандарту, указанному в (1). (IEEE 610)_ + +_Базовая версия (baseline): Спецификация или программный продукт, который был формально отрецензирован или согласован, впоследствии используется как базовая версия для дальнейшей разработки, и который может быть изменен только в процессе формального контроля процесса изменений. (IEEE 610)_ + +**Эталонное тестирование** (Benchmark Testing) - это набор стандартов, метрик или контрольных точек (reference point), по которым оценивается (assessed or evaluated) качество работы продукта или услуги, через нагрузочное тестирование модуля или всей комплексной программной системы для определения ее производительности. Оно определяет повторяемый набор экспериментальных результатов, которые помогают определить функциональные возможности как для текущих, так и для будущих выпусков программного обеспечения. + +**Тестирование базовой версии** (Baseline Testing) - это подход к тестированию, в котором за точку отсчета берется базовая линия - это показатель конкретного ориентира, который служит основой для нового тестирования. В Baseline Testing тесты прогоняют, сохраняют все результаты и сравнивают с базовым уровнем. Этот базовый уровень относится к последним принятым результатам испытаний. Если в исходном коде есть новые изменения, то для повторного выполнения тестов необходимо сформировать текущий базовый уровень. Если последние результаты будут приняты, то текущая базовая линия станет базовой. + +Самым первым этапом жизненного цикла разработки программного обеспечения является сбор и анализ требований. Этот тест играет важную роль, так как в случае, если начальная фаза не протестирована должным образом, в дальнейшем могут возникнуть серьезные проблемы. Это также может повлиять на стоимость, сроки, бюджет и репутацию клиента. После того, как требование собрано бизнес-аналитиком, он обсуждает то же самое с менеджером проекта для тестирования требования и его осуществимости. В случае неясности прототип требования создается разработчиком и представляется клиенту. Если это соответствует ожиданиям клиента и одобрено, командам предоставляется документ с требованиями для начала дальнейшего процесса. На основе этого документа с требованиями создаются другие документы для разработки и тестирования программного обеспечения, такие как план проекта, проектный документ, план тестирования, тестовые примеры и т. д. Поэтому очень важно правильно выполнить базовый тест. Если документ с требованиями не подтвержден должным образом, дальнейшие документы и процессы не пройдут. После завершения тестирования начинается процесс разработки и тестирования. + +**Разница между Baseline и Benchmark testing**: + +| Benchmark testing | Baseline Testing | +| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| Метрики уже созданы для оценки производительности приложения. Оно сравнивает характеристики продукта с отраслевыми стандартами; | Метрики создаются после завершения тестирования производительности. Набор тест-кейсов запускается для сбора информации о производительности; | +| Проводится с точки зрения бизнеса. SLA создаются на основе того же; | Выполняется на самом начальном этапе, с которого начинаются разработка, внедрение, тестирование и сравнение; | +| Можно пользоваться для всех продуктов / программного обеспечения в организации; | Проводится для конкретных продуктов / программного обеспечения; | +| Это состояние, в котором вы хотите достичь или превзойти то, чего вы уже достигли; | Выполняется на самом начальном этапе, с которого начинаются разработка, внедрение, тестирование и сравнение; | +| Предназначено для измерения производительности приложения вместе с другим приложением, имеющим аналогичные функции; | Определяет производительность приложения для сравнения в будущем; | + +**Пороговый тест (Threshold Test)** - это тест, вставленный в Deployment Pipeline, который отслеживает некоторое измеримое явление, сравнивая значение в текущей сборке с пороговым значением. Если значение текущей сборки превышает пороговое значение, тест завершается неудачно, и сборка не выполняется. Типичный пример использования пороговых тестов - производительность. Команда берет репрезентативный набор операций и засекает их. Затем они устанавливают пороговый тест и если эти операции занимают значительное количество времени, превышающее текущее значение, тест завершается неудачей. + +Источники: + +* [What Is Benchmark Testing In Performance Testing](https://www.softwaretestinghelp.com/benchmark-testing-tutorial/) +* [What Is Baseline Testing And Its Benefits For Software Quality](https://www.softwaretestinghelp.com/what-is-baseline-testing/#Baseline\_Vs\_Benchmark\_Testing) +* [Threshold Test](https://martinfowler.com/bliki/ThresholdTest.html) diff --git a/vidy-metody-urovni-testirovaniya/fazzing-testirovanie-fuzz-testing.md b/vidy-metody-urovni-testirovaniya/fazzing-testirovanie-fuzz-testing.md new file mode 100644 index 0000000..ce504b6 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/fazzing-testirovanie-fuzz-testing.md @@ -0,0 +1,24 @@ +# Фаззинг-тестирование (Fuzz testing) + +FUZZ testing (fuzzing) - это тип тестирования безопасности, который обнаруживает ошибки кодирования и лазейки в программном обеспечении, операционных системах или сетях. Фаззинг включает в себя ввод огромного количества случайных данных, называемых fuzz, в тестируемое программное обеспечение, чтобы заставить его дать сбой или прорвать его защиту. Фаззинг часто выявляет уязвимости, которые могут быть использованы с помощью SQL-инъекции, переполнения буфера, отказа в обслуживании (DOS) и XSS. Fuzz-тестирование выполняется с помощью фаззера - программы, которая автоматически вводит полуслучайные данные в программу и обнаруживает ошибки. Fuzz-тестирование обычно выполняется автоматически. + +Обычно fuzzing обнаруживает наиболее серьезные ошибки или дефекты безопасности. Это очень экономически эффективный метод тестирования. Fuzzing - один из самых распространенных методов хакеров, используемых для обнаружения уязвимости системы (сюда относятся популярные SQL- или скриптовые инъекции). Примеры фаззеров: + +* Mutation-Based Fuzzers: Этот тип фаззера проще всего создать, поскольку он изменяет существующие образцы данных для создания новых тестовых данных. Это относится к тупому фаззеру, но его можно использовать с более интеллектуальными фаззерами. Мы можем сделать это, выполнив некоторый уровень анализа образцов, чтобы гарантировать, что он изменяет только определенные части или не нарушает общую структуру ввода; +* Generation-Based Fuzzers: Этот тип фаззера требует большего интеллекта для создания тестовых данных с нуля, т.е. новые тестовые данные создаются на основе входной модели. Обычно он разбивает протокол или формат файла на фрагменты, которые затем выстраиваются в допустимом порядке, и эти фрагменты случайным образом распределяются независимо друг от друга; +* PROTOCOL-BASED-fuzzer: самый успешный фаззер - это детальное знание тестируемого формата протокола. Понимание зависит от спецификации. Это включает в себя запись массива спецификации в инструмент, а затем с помощью метода генерации тестов на основе модели проходится спецификация и добавляется неравномерность в содержимое данных, последовательность и т. д. Это также известно как синтаксическое тестирование, грамматическое тестирование, тестирование надежности, и т. д. Fuzzer может генерировать Test case из существующего или использовать допустимые или недействительные входные данные; + +Типы ошибок, обнаруживаемых Fuzz testing: + +* Сбои ассертов и утечки памяти (Assertion failures and memory leaks). Эта методология широко используется для больших приложений, где ошибки влияют на безопасность памяти, что является серьезной уязвимостью; +* Некорректный ввод (Invalid input). Фаззеры используются для генерирования неверного ввода, который используется для тестирования процедур обработки ошибок, и это важно для программного обеспечения, которое не контролирует его ввод. Простой фаззинг может быть способом автоматизации отрицательного тестирования; +* Исправление ошибок (Correctness bugs). Fuzzing также может использоваться для обнаружения некоторых типов ошибок «правильности». Например, поврежденная база данных, плохие результаты поиска и т. д.; + +Источники: + +* [Fuzz Testing Guide](https://www.softwaretestingmaterial.com/fuzz-testing/) +* [Fuzz Testing(Fuzzing) Tutorial: What is, Types, Tools & Example](https://www.guru99.com/fuzz-testing.html) + +Доп. материал: + +[Фаззинг тестирование веб-интерфейса. Расшифровка доклада](https://habr.com/ru/company/tensor/blog/527304/) diff --git a/vidy-metody-urovni-testirovaniya/funkcionalnoe-testirovanie-functional-behavioral-testing.md b/vidy-metody-urovni-testirovaniya/funkcionalnoe-testirovanie-functional-behavioral-testing.md new file mode 100644 index 0000000..cb36001 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/funkcionalnoe-testirovanie-functional-behavioral-testing.md @@ -0,0 +1,48 @@ +# Функциональное тестирование (Functional/Behavioral testing) + +_Функциональное тестирование (functional testing): Тестирование, основанное на анализе спецификации функциональности компонента или системы. См. также тестирование методом черного ящика. (ISTQB)_ + +Функциональное тестирование выполняется чтобы убедиться, что каждая функция программного приложения ведет себя так, как указано в документе с требованиями. В большинстве случаев это выполняется методом black box testing. + +**Для функционального тестирования принято использовать две техники**: + +* Тестирование на основе требований: содержит все функциональные спецификации, которые составляют основу для всех тестов, которые будут проводиться; +* Тестирование на основе бизнес-сценариев: содержит информацию о том, как система будет восприниматься с точки зрения бизнес-процесса; + +**Основные виды функционального тестирования**: + +* Unit Testing: модульное тестирование обычно выполняется разработчиком и влечет за собой написание тестов, которые будут вызывать методы в каждом модуле и проверять их, передавая требуемые параметры и проверяя соответствие возвращаемого значения ожидаемому. Покрытие кода - важная часть модульного тестирования, где должны существовать test cases, охватывающие: + * Line coverage; + * Code path coverage; + * Method coverage; +* Smoke Testing: тестирование, которое проводится после выпуска каждой сборки. Это также называется build verification testing; +* Sanity Testing: тестирование, которое проводится для того, чтобы убедиться, что все основные и жизненно важные функции приложения / системы работают правильно. Обычно это делается после Smoke Testing; +* Regression Tests: тестирование проводится для того, чтобы убедиться, что добавление нового кода, улучшений, исправление ошибок не нарушает существующую функциональность или не вызывает нестабильности и ПО все еще работает в соответствии со спецификациями. Регрессионные тесты не должны быть такими обширными, как фактические функциональные тесты, но должны гарантировать объем покрытия, подтверждающий стабильность функциональности; +* Integration Tests: когда система полагается на несколько функциональных модулей, которые работают по отдельности, но должны работать согласованно когда объединены вместе, чтобы достичь сквозного сценария, проверка таких сценариев называется интеграционным тестированием; +* Beta/Usability Testing: продукт демонстрируется реальному пользователю в среде, приближенной к проду, и они тестируют продукт. Это похоже на User Acceptance testing; +* System testing: тестирование, которое выполняется для всей системы, чтобы проверить, работает ли она должным образом после интеграции всех модулей или компонентов; +* End to end testing: проводится для проверки функциональности продукта. Это тестирование выполняется только после завершения тестирования системной интеграции, включая функциональные и нефункциональные требования; + +**Критерии начала функционального тестирования**: + +* Requirement Specification document определен и утвержден; +* Подготовлены тест-кейсы; +* Созданы тестовые данные; +* Среда для тестирования готова, все необходимые инструменты доступны и готовы; +* Всё или часть приложения разработано, модульно протестировано и готово к тестированию; + +**Критерии окончания функционального тестирования**: + +* Выполнение всех функциональных тестов завершено; +* Нет критических или открытых ошибок P1, P2; +* Сообщенные ошибки были подтверждены; + +**Этапы функционального тестирования**: + +* Самый первый шаг заключается в определении функциональности продукта, который необходимо протестировать, и он включает в себя тестирование основных функций, условий ошибок и сообщений, тестирование удобства использования, то есть, является ли продукт удобным для пользователя или нет, и т. д. +* Следующим шагом является создание входных данных для проверяемой функциональности в соответствии со спецификацией требований. +* Позже, из спецификации требований, определяется результат для тестируемой функциональности. +* Подготовленные тест-кейсы исполняются. +* Фактический результат, то есть результат после выполнения тест-кейса, и ожидаемый результат (определенный из спецификации требований) сравниваются, чтобы определить, работает ли функциональность должным образом или нет. + +Источник: [Complete Functional Testing Guide With Its Types And Example](https://www.softwaretestinghelp.com/guide-to-functional-testing/) diff --git a/vidy-metody-urovni-testirovaniya/installyacionnoe-testirovanie-installation-testing.md b/vidy-metody-urovni-testirovaniya/installyacionnoe-testirovanie-installation-testing.md new file mode 100644 index 0000000..74efee7 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/installyacionnoe-testirovanie-installation-testing.md @@ -0,0 +1,56 @@ +# Инсталляционное тестирование (Installation Testing) + +_Тестирование устанавливаемости (installability testing): Тип тестирования переносимости для оценки того, могут ли должным образом элемент тестирования или совокупность элементов тестирования быть установлены во всех указанных средах. (ГОСТ 56920)_ + +Тестирование инсталляции (установки) направлено на проверку успешной установки, настройки, обновления и удаления ПО, как десктопного, так и мобильного. + +**Примеры кейсов**: + +**Установка**. + +* Установка должна начаться при клике по кнопке, подтверждающей данное действие; +* Установки во всех поддерживаемых окружениях и на всех поддерживаемых платформах; +* Установки в неподдерживаемых окружениях, а также в нужных окружениях с некорректными настройками; +* Права, которые требует инсталляция (чаще всего они должны быть админскими), проверить установить приложение как гость; +* Установки в clean state (при отсутствии любых возможных связанных файлов и предыдущих версий); +* Подсчитывается ли при установке количество свободного места на диске и выдается ли предупреждение если места недостаточно; +* Установки загруженного ранее приложения, а также прямая установка с использованием сети/беспроводного соединения; +* Восстановится ли процесс установки при внезапном его прерывании (отключение устройства, отказ сети, отключение беспроводного соединения); +* Установка приложения, его запуск, удаление приложения должны возвращать систему в исходное состояние; +* Распознается ли наличие в системе приложений/программ, необходимых для корректной работы устанавливаемого приложения; +* Повторный запуск установки приложения при уже текущем должен выдавать корректное сообщение, двойная установка должна быть исключена; +* Процесс установки может быть настраиваемый/дефолтный. Убедиться, что оба корректно работают +* Наличие кнопки, которая предложит сохранить приложение в определенную папку, а также указывает дефолтное местоположение (“C:/programs/.”); +* Правильно ли установлены, сохранены ли в корректных папках файлы приложения; +* Наличие созданных ярлыков, корректно ли они расположены; +* После установки в системной вкладке “ Программы и компоненты” должны быть доступны: название приложения, иконка, имя издателя, размер приложения, дата установки и номер версии; +* Настройки переменных сред PATH; +* Убедиться, что лицензионный ключ сохраняется в Windows Registry library; +* Поддерживает ли приложение функции ‘UnInstall’, ‘Modify’, ‘ReInstall’ и корректно ли они работают; +* Работа приложения с уже существующими DLL-файлами, с DLL-файлами приложений, которые необходимы для корректной работы устанавливаемого приложения; +* Наличие информации/сообщение о том, когда истекает срок действия установленной пробной версии приложения; + +**Обновление**: + +* Поддерживает ли приложение функцию обновления/автообновления; +* При попытке установить ранее установленную версию приложения система должна ее распознать и выдать корректное сообщение; +* Сохраняются ли пользовательские настройки при попытке загрузить новую версию/обновить старую версию; +* При попытке обновить версию должны быть доступны функции удалить приложение и восстановить приложение; +* Стандартные проверки как при первичной установке приложения; +* Убедиться, что номер версии приложения сменился новым; +* Запустить приложение и убедиться, что оно работает корректно; + +**Откат до предыдущей версии**: + +* Попробовать установить старую версию на более новую; +* Наличие корректного сообщения при попытке отката; +* Убедиться, что приложение работает корректно; + +**Удаление приложения**: + +* Не остается ли в системе никаких папок/файлов/ярлыков/ключей реестра после полного удаления приложения; +* Корректно ли работает система после установки и последующего удаления приложения; + +Источник: + +[Тестирование инсталляции](https://qaevolution.ru/testirovanie-installyacii/) diff --git a/vidy-metody-urovni-testirovaniya/integracionnoe-testirovanie-integration-testing.md b/vidy-metody-urovni-testirovaniya/integracionnoe-testirovanie-integration-testing.md new file mode 100644 index 0000000..02a004e --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/integracionnoe-testirovanie-integration-testing.md @@ -0,0 +1,110 @@ +# Интеграционное тестирование (Integration testing) + +_Интеграционное тестирование (integration testing): Тестирование, выполняемое для обнаружения дефектов в интерфейсах и во взаимодействии между интегрированными компонентами или системами. См. также тестирование интеграции компонентов, системное интеграционное тестирование. (ISTQB)_ + +_Системное интеграционное тестирование (system integration testing): Тестирование интеграции систем и пакетов программ, тестирование интерфейсов связи с внешними системами (интернет и т.д.). (ISTQB)_ + +_Интеграционное тестирование в малом (integration testing in the small): См. тестирование интеграции компонентов. (ISTQB)_ + +_Интеграционное тестирование в целом (integration testing in the large): См. системное интеграционное тестирование. (ISTQB)_ + +_Изоляционное тестирование (isolation testing): Тестирование отдельных компонентов в изоляции от окружающих компонентов в окружении компонентов, которые при необходимости эмулируются заглушками и драйверами. (ISTQB)_ + +_Попарное интеграционное тестирование (pairwise integration testing): Вид интеграционного тестирования, нацеленного на пары компонентов, работающих совместно соответственно графу вызовов. (ISTQB)_ + +Интеграционное тестирование предназначено для проверки насколько хорошо два или более компонента ПО взаимодействуют друг с другом, а также взаимодействия с различными частями системы (операционной системой, оборудованием либо связи между различными системами). С технологической точки зрения интеграционное тестирование является количественным развитием компонентного, поскольку также оперирует интерфейсами модулей и подсистем и требует создания тестового окружения, включая заглушки (Stub) на месте отсутствующих модулей. Основная разница между компонентным и интеграционным тестированием состоит в целях, то есть в типах обнаруживаемых дефектов, которые, в свою очередь, определяют стратегию выбора входных данных и методов анализа. В частности, на уровне интеграционного тестирования часто применяются методы, связанные с покрытием интерфейсов, например, вызовов функций или методов, или анализ использования интерфейсных объектов, таких как глобальные ресурсы, средства коммуникаций, предоставляемых операционной системой. + +**Уровни интеграционного тестирования**: + +* **Компонентный интеграционный уровень** (CIT - [Component Integration testing](https://www.testing.guru/what-is-component-integration-testing/)): Проверяется взаимодействие между компонентами одной системы после проведения компонентного тестирования. Программные компоненты или модули могут быть определены в разное время совершенно разными группами спецификаций, component integration testing выполняется чтобы убедиться, что даже после различий в разработке модулей интеграция всего работает вместе. В этом случае также важно учесть отрицательные случаи, так как компоненты могут делать предположения относительно данных; +* **Системный интеграционный уровень** (SIT - [System Integration testing](https://www.softwaretestinghelp.com/system-integration-testing/)): - это полное тестирование всей системы, состоящей из множества подсистем. Основная цель SIT - обеспечить правильное функционирование всех зависимостей программных модулей и сохранение целостности данных между отдельными модулями всей системы. SUT ([System Under Test](https://www.tutorialspoint.com/software\_testing\_dictionary/system\_under\_test.htm)) может состоять из аппаратного обеспечения, базы данных, программного обеспечения, комбинации аппаратного и программного обеспечения или системы, требующей взаимодействия с человеком (HITL - [Human in the Loop](https://en.wikipedia.org/wiki/Human-in-the-loop) Testing). SIT имеет предварительное условие, при котором несколько базовых интегрированных систем уже прошли системное тестирование. Затем SIT проверяет необходимые взаимодействия между этими системами в целом. Результаты SIT передаются в UAT (пользовательское приемочное тестирование); + +**Интеграция может быть как программной, так и софт-железо**: + +* **HSIT** - Hardware Software Integration Testing: представляет собой процесс тестирования компонентов компьютерного программного обеспечения (CSC - Computer Software Components) на предмет функциональности высокого уровня в целевой аппаратной среде. Тестирование черного ящика - это основной тип тестирования, используемый на этом уровне тестирования. Целью тестирования интеграции аппаратного / программного обеспечения является проверка поведения разработанного программного обеспечения, интегрированного в аппаратный компонент. Цель тестирования интеграции аппаратного и программного обеспечения на основе требований (Requirement based Hardware-Software Integration Testing) - убедиться, что программное обеспечение на целевом компьютере удовлетворяет высокоуровневым требованиям (high-level requirements); +* **SSIT** - Software Software Integration Testing: это Computer Software Component Testing, работающего в среде целевого компьютера при моделировании всей системы (других CSC), и на функциональности высокого уровня. Оно фокусируется на поведении CSC в смоделированной среде хоста / цели. Для проверки интеграции программного обеспечения используются разные подходы; + +**Подходы к интеграционному тестированию**: + +* **Подход Большого взрыва (Big Bang Approach)**: _“Вид подхода к интеграционному тестированию, при котором элементы программного или аппаратного обеспечения, или и то и другое, собираются в компонент или в целую систему сразу, а не по этапам.” ( IEEE 610)_. Все или практически все разработанные модули собираются вместе в виде законченной системы или ее основной части, и затем проводится интеграционное тестирование. Такой подход очень хорош для сохранения времени. Однако если Test case и их результаты записаны неверно, то сам процесс интеграции сильно осложнится, что станет преградой для команды тестирования при достижении основной цели интеграционного тестирования; +* **Инкрементальный подход (Incremental Approach)**: при таком подходе тестирование выполняется путем объединения двух или более логически связанных модулей. Затем другие связанные модули поэтапно добавляются и тестируются для правильного функционирования. Процесс продолжается до тех пор, пока все модули не будут соединены и успешно протестированы. Осуществляется разными методами: + * **Нисходящий подход (Top-Down Approach)**: Вначале тестируются все высокоуровневые модули, и постепенно один за другим добавляются низкоуровневые. Все модули более низкого уровня симулируются заглушками с аналогичной функциональностью, затем по мере готовности они заменяются реальными активными компонентами. Преимущества: Локализация неисправностей проще. Возможность получить ранний прототип. Основные недостатки дизайна могут быть найдены и исправлены в первую очередь. Недостатки: Нужно много заглушек. Модули на более низком уровне тестируются недостаточно; + * **Восходящий подход (Bottom-Up Approach)**: В восходящей стратегии каждый модуль на более низких уровнях последовательно тестируется с более высокоуровневыми модулями, пока не будут протестированы все модули. Требуется помощь драйверов для тестирования. Данный подход считается полезным, если все или практически все модули, разрабатываемого уровня, готовы. Также данный подход помогает определить по результатам тестирования уровень готовности приложения. Пример низкоуровневого модуля - модуль, который заведует хранением токенов авторизации. Высокоуровневый - модуль авторизации, в состав которого помимо прочего входит модуль токенов. Преимущества: Локализация ошибок проще. Не тратится время на ожидание разработки всех модулей, в отличие от подхода Большого взрыва. Недостатки: Критические модули (на верхнем уровне архитектуры ПО), которые контролируют поток приложения, тестируются последними и могут быть подвержены дефектам. Ранний прототип невозможен; + * [**Гибридный/сэндвич-подход**](https://www.ques10.com/p/38806/describe-bi-directionalsandwitch-integration-testi/) **(Sandwich/Hybrid/Bi-Directional Approach)**: Представляет собой комбинацию восходящего и нисходящего подходов. Здесь целью является средний слой, в то время как драйверы заменяют верхний слой, а заглушки нижний пока компоненты этих слоев не будут разработаны; + +**Критерии начала и окончания Integration Testing**: + +Обычно при выполнении интеграционного тестирования используется стратегия [ETVX](https://vijaybn.wordpress.com/2012/09/06/etvx-entry-task-validation-exit/) (Entry Criteria, Task, Validation, Exit Criteria). + +* Критерии начала: + * завершено модульное тестирование; +* На входе: + * Software Requirements Data; + * Software Design Document; + * Software Verification Plan; + * Software Integration Documents; +* Действия: + * На основе требований высокого и низкого уровня (High and Low-level requirements) создайте test cases and procedures; + * Комбинируйте сборки низкоуровневых модулей, которые реализуют общую функциональность; + * Разработайте тестовую обвязку (test harness); + * Протестируйте сборку; + * После прохождения теста сборка объединяется с другими сборками и тестируется до тех пор, пока система не будет интегрирована как единое целое; + * Повторите все тесты на целевой processor-based platform и получите результаты; +* Критерии выхода: + * Успешное завершение интеграции Программного модуля на целевое Hardware; + * Правильная работа программного обеспечения в соответствии с указанными требованиями; +* На выходе: + * Integration test reports; + * SVCP - Software Test Cases and Procedures; + +[_Test Harness_](https://www.softwaretestinghelp.com/what-is-test-harness/)_- (тестовая обвязка): Тестовое окружение, включающее в себя заглушки и драйверы, необходимые для проведения теста. (ISTQB)_ + +[Test Driver и Test Stub](https://www.geeksforgeeks.org/difference-between-stubs-and-drivers/) являются искусственными заменами компонентов программы на время тестов по аналогии с моками в тестировании API. Тестовый драйвер - то, что вызывает тестируемый компонент. Тестовая заглушка - то, что возвращает тестируемому компоненту фиктивный ответ. Т.е. заглушки и драйверы не реализуют всю логику программного модуля, а только моделируют обмен данными с тестируемым модулем. + +[**Тестирование интерфейса**](https://www.softwaretestinghelp.com/what-is-interface-testing/) - это тип интеграционного теста, который проверяет, правильно ли установлена связь между двумя различными программными системами или их частями (модулями). Соединение, которое объединяет два компонента, называется интерфейсом. Этот интерфейс в компьютерном мире может быть чем угодно, как API, так и веб-сервисами и т. д. Тестирование интерфейса включает в себя тестирование двух основных сегментов: + +* Интерфейс веб-сервера и сервера приложений +* Интерфейс сервера приложений и базы данных + +**Тестирование потоков (Thread testing)** - это вид тестирования программного обеспечения, который проверяет основные функциональные возможности конкретной задачи (потока). Обычно проводится на ранней стадии фазы интеграционного тестирования. Тестирование на основе потоков является одной из дополнительных стратегий, принятых в ходе System Integration Testing. Поэтому его, вероятно, следует более правильно назвать «тестом взаимодействия потоков» (thread interaction test). + +Thread Testing подразделяется на две категории: + +* Однопоточное тестирование (Single thread testing) включает одну транзакцию приложения за раз; +* Многопоточное тестирование (Multi-thread testing) включает одновременно несколько активных транзакций; + +Как проводить Thread Testing: + +* Тестирование на основе потоков является обобщенной формой тестирования на основе сеансов (session-based testing), в котором сеансы являются формой потока, но поток не обязательно является сеансом; +* Для тестирования потока, поток или программа (небольшая функциональность) интегрируются и тестируются постепенно как подсистема, а затем выполняются для всей системы; +* На самом низком уровне оно предоставляет интеграторам лучшее представление о том, что тестировать; +* Вместо непосредственного тестирования программных компонентов требуется, чтобы интеграторы сосредоточились на тестировании логических путей выполнения в контексте всей системы; + +Советы: + +* Протестируйте свою многопоточную программу, многократно выполняя ее с другим набором запущенных приложений; +* Протестируйте свою многопоточную программу, активировав одновременно несколько экземпляров программы; +* Выполняйте многопоточную программу на разных моделях оборудования с различными уровнями нагрузки и рабочими нагрузками; +* Инспекция кода; +* Собирайте только ошибки и сбои, которые произошли в потоках, отличных от основного; + +Источники: + +* [Integration Testing](https://www.guru99.com/system-integration-testing.html) +* [Лекция 5: Модульное и интеграционное тестирование](https://intuit.ru/studies/courses/48/48/lecture/1432) +* [What is Thread Testing in Software Testing?](https://www.guru99.com/thread-testing.html) + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.4 Подпроцесс интеграционного тестирования” +* [Ручное интеграционное тестирование в банковском секторе. Что внутри?](https://habr.com/ru/post/595379/) +* [Интеграционные тесты в микросервисах](https://tproger.ru/articles/integracionnye-testy-v-mikroservisah/) +* [Лекция 6: Интеграционное тестирование и его особенности для объектно-ориентированного программирования](https://intuit.ru/studies/courses/48/48/lecture/1434) +* [Для чего нужно интеграционное тестирование?](https://habr.com/ru/post/556002/) +* [Component / System integration testing examples](https://www.scnsoft.com/software-testing/integration-testing-example) +* [#11 Артем и Сева. Моки(Mocks) и стабы(Stubs)](https://www.youtube.com/watch?v=VbVcGpS8HV4\&ab\_channel=Heisenbug) +* [Mocks Aren't Stubs](https://martinfowler.com/articles/mocksArentStubs.html) +* [Почему мы решили создать отдел кросс-системного тестирования](https://habr.com/ru/company/mvideo/blog/559542/) +* [Кто такой кросс-системный тестировщик и почему он не должен быть «agile»?](https://habr.com/ru/company/mvideo/blog/560030/) +* [What Is Thread Testing In Software Testing](https://www.softwaretestinghelp.com/what-is-thread-testing/) +* [Юнит-тесты vs интеграционные тесты](https://testengineer.ru/unit-testy-vs-integracionnye-testy/) diff --git a/vidy-metody-urovni-testirovaniya/issledovatelskoe-testirovanie-exploratory-testing.md b/vidy-metody-urovni-testirovaniya/issledovatelskoe-testirovanie-exploratory-testing.md new file mode 100644 index 0000000..d938c69 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/issledovatelskoe-testirovanie-exploratory-testing.md @@ -0,0 +1,53 @@ +# Исследовательское тестирование (Exploratory testing) + +_Исследовательское тестирование (exploratory testing): Неформальный метод проектирования тестов, при котором тестировщик активно контролирует проектирование тестов в то время, как эти тесты выполняются, и использует полученную во время тестирования информацию для проектирования новых и улучшенных тестов. (Bach)_ + +_Исследовательское тестирование (exploratory testing): Тестирование, основанное на опыте, при котором тестер спонтанно разрабатывает и выполняет тестирования на основе существующих соответствующих знаний тестера, предшествующих исследований элемента тестирования (включая и результаты предыдущих тестирований) и эвристических "эмпирических правил" для общего поведения программного обеспечения и типов отказа. Примечание - Исследовательское тестирование направлено на выявление скрытых свойств (включая и скрытое поведение), которые сами по себе, с одной стороны, вполне возможно, безобидны, но, с другой стороны, могут повлиять на другие свойства тестируемого программного обеспечения и тем увеличить риск того, что программное обеспечение перестанет работать. (ГОСТ 56920)_ + +Исследовательское Тестирование - одновременно является и техникой, и видом тестирования. В общем виде мы так или иначе всегда используем комбинацию сценарного и исследовательского подходов. Exploratory testing подразумевает под собой одновременно изучение проекта, функционала, тест-дизайн в уме и тут же исполнение тестов, после чего данный цикл может повторяться необходимое количество раз, каждый раз улучшая создаваемые кейсы и документируя пройденные сессии. + +Джеймс Бах указал на важную характеристику исследовательского тестирования - тестировщик участвует когнитивно. Он активно, целенаправленно, с любопытством исследует тестируемое программное обеспечение, всегда принимая на себя ответственность каждую минуту решать, какой путь к тому, что он выбрала для исследования, является наиболее многообещающим. Нет никаких искусственных ограничений на разведку. Тестировщик может свободно использовать любые доступные источники информации, включая спецификации, записи службы технической поддержки, реализации сопоставимого программного обеспечения конкурентами и (конечно) эксперименты (тесты), которые эмпирически раскрывают информацию. Нет никаких ограничений на методы тестирования, которые могут использовать исследователи - например, любая степень автоматизации подойдет. Однако исследователь не просто перезапускает старые тесты, а тестирует чтобы учиться. Вероятно, он будет внимательно изучать поведение программы во время ее тестирования, ища новые идеи о том, как она может выйти из строя, как ее можно было бы в дальнейшем протестировать или измерить, и насколько полезны эти тесты на данном этапе разработки. Выполнение тестов можно автоматизировать, а мышление - нет. Антитезой исследования является тестирование по сценарию, в котором тестировщик (или машина) следует набору процедур, изложенных давно, сравнивая наблюдаемое поведение с любыми результатами, которые разработчик тестов считал актуальными или интересными в то время. Познание произошло тогда, а не сейчас. Объем исследования такой же, как и объем самого тестирования. Разница в том, что исследователь выполняет их в любой полезной последовательности, смешивая исследование, дизайн, выполнение, интерпретацию и общение, чтобы постоянно открывать новую информацию и идти в ногу с текущими изменениями на рынке, платформе, дизайне и реализации тестируемого программного обеспечения. + +**Подход к тестированию**: + +* Используйте эвристики для управления тестированием; +* Выполнение и создание тест-кейсов идут рука об руку; +* Тест-кейсы продолжают развиваться на основе наблюдений и обучения тестировщиков; +* К ET могут применяться различные методы тестирования, такие как анализ граничных значений, классы эквивалентности и т. д.; +* ET можно использовать сессионно , чтобы сделать его более структурированным и сфокусированным; +* Тестировщики могут развивать свои идеи, но никогда не отклоняться от своей миссии; +* Тестирование ET не использует сценарии, а зависит от интуиции, навыков и опыта тестировщика; + +**Туры в исследовательском тестировании**: Чтобы систематизировать исследовательское тестирование можно использовать идею туров. Туры - это идеи и инструкции по исследованию программного продукта, объединенные определенной общей темой или целью. Туры, как правило, ограничены по времени - длительность тестовой сессии не должна превышать 4 часа. Идею туров развивали в своих работах Канер, Бах, Хендриксон, Болтон, Кохл и другие. Джеймс Виттакер (James A. Whittaker), хоть и не придумал саму идею туров, но предложил свой подход к исследовательскому тестированию с использованием туров и в своей книге “Exploratory Software Testing” в доступной форме озвучил идею туров и описал сами туры. + +Тур - это своего рода план тестирования, он отражает основные цели и задачи, на которых будет сконцентрировано внимание тестировщика во время сессии исследовательского тестирования. При этом Виттакер использует метафору, что тестировщик - это турист, а тестируемое приложение - это город. Обычно у туриста (тестировщика) мало времени, поэтому он выполняет конкретную задачу в рамках выбранного тура, ни на что другое не отвлекаясь. Город (ПО) разбит на районы: деловой центр, исторический район, район развлечений, туристический район, район отелей, неблагополучный район. + +![https://www.software-testing.by/wp-content/uploads/2015/09/328.png](https://www.software-testing.by/wp-content/uploads/2015/09/328.png) + +Источники: + +* [What Is Exploratory Testing In Software Testing (A Complete Guide)](https://www.softwaretestinghelp.com/what-is-exploratory-testing/) +* [BBST - Exploratory Testing](http://www.testingeducation.org/BBST/exploratory/) +* [Исследовательское тестирование и исследовательские туры Виттакера](https://www.software-testing.by/blog/exploratory-testing-exploratory-tours/) + +Доп. материал: + +* [Rapid Software Testing Methodology](https://www.satisfice.com/rapid-testing-methodology) +* [Exploratory Testing](https://www.satisfice.com/exploratory-testing) +* [Sample test cases of Exploratory Testing of the IRCTC website](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2019/12/IRCTC-Exploratory-Testing.xlsx) +* [Exploratory Testing an Indispensable Nonsystematic Software Testing Technique](https://www.softwaretestinggenius.com/exploratory-testing-an-indispensable-nonsystematic-software-testing-technique/) +* [Исследовательское тестирование: пустая трата времени или мощный инструмент?](https://habr.com/ru/post/535094/) +* [Исследовательское тестирование - полезно или вредно для проекта?](https://www.youtube.com/watch?v=wNOGbU5bcvI) +* [Exploratory Testing](http://www.testingeducation.org/BBST/exploratory/BBSTExploring.pdf) +* [Exploratory Testing Dynamics](https://silo.tips/download/exploratory-testing-dynamics) +* [A Tutorial in Exploratory Testing](https://www.kaner.com/pdfs/QAIExploring.pdf) +* [Plan your next exploratory testing session](https://medium.com/@cristina.mtys/tips-for-your-next-exploratory-testing-session-22b4421b9620) +* [Исследовательское тестирование - обезьянья работа?](https://telegra.ph/Issledovatelskoe-testirovanie--obezyanya-rabota-04-22-2) +* [Exploratory Testing](https://martinfowler.com/bliki/ExploratoryTesting.html) +* [How To Use Tours To Ensure Complete And Thorough Exploratory Testing](https://www.softwaretestinghelp.com/exploratory-testing-tours/) +* [Туры в исследовательском тестировании. Личный перевод из книги Д. Виттакера «Исследовательское тестирование ПО»](https://habr.com/ru/post/328990/) +* [Переводы туров для исследовательского тестирования](https://www.software-testing.ru/library/testing/testing-for-beginners/2965-exploratory-software-testing) +* [Туры в исследовательском тестировании](https://telegra.ph/Tury-v-issledovatelskom-testirovanii-07-23) +* [Множество способов поговорить об исследовательском тестировании](https://software-testing.ru/library/testing/other-testing/3717-there-are-plenty-of-ways-to-talk-about) +* [Исследовательские сценарии как метод раскрытия преступления](https://www.youtube.com/watch?v=S1VNifFxYy4) +* [Вспомнить всё... о контекстном тестировании](https://www.youtube.com/watch?v=JSSnOvNFDLU) diff --git a/vidy-metody-urovni-testirovaniya/kak-protestirovat-produkt-bez-trebovanii.md b/vidy-metody-urovni-testirovaniya/kak-protestirovat-produkt-bez-trebovanii.md new file mode 100644 index 0000000..73861f4 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/kak-protestirovat-produkt-bez-trebovanii.md @@ -0,0 +1,8 @@ +# Как протестировать продукт без требований? + +Продукта без требований не существует, просто они могут быть не формализованы и не записаны. Если вам дали протестировать какое-то готовое решение, к которому нет документации, то нужно попытаться восстановить все явные и неявные требования: изучив функционал (какую проблему решает продукт? для чего его создали?), целевую аудиторию (для кого его создали?), попытаться найти тех, кто мог знать что-то и уже не в команде; список источников получения неявных требований вообще огромен. На основе всего этого уже как минимум можно составить user stories для покрытия основными тестами. + +Доп. материал: + +* [Тестирование без требований. Где искать требования к продукту, если отсутствует ТЗ?](https://telegra.ph/Testirovanie-bez-trebovanij-Gde-iskat-trebovaniya-k-produktu-esli-otsutstvuet-TZ-04-13) +* [Testing without requirements](https://testzius.wordpress.com/2016/12/13/testing-without-requirements/) diff --git a/vidy-metody-urovni-testirovaniya/konfiguracionnoe-testirovanie-configuration-testing.md b/vidy-metody-urovni-testirovaniya/konfiguracionnoe-testirovanie-configuration-testing.md new file mode 100644 index 0000000..fbcdfbb --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/konfiguracionnoe-testirovanie-configuration-testing.md @@ -0,0 +1,43 @@ +# Конфигурационное тестирование (Configuration testing) + +Конфигурационное тестирование (Configuration testing) - специальный вид тестирования, направленный на проверку работы ПО при различных аппаратных и программных конфигурациях системы (заявленных платформах, поддерживаемых драйверах, при различных конфигурациях компьютеров и т. д.). + +**Configuration =** performance + compatibility: + +* performance аспект: определить оптимальную конфигурацию оборудования, обеспечивающую требуемые характеристики производительности и времени реакции тестируемой системы; +* compatibility аспект: проверить объект тестирования на совместимость с объявленным в спецификации оборудованием, операционными системами и программными продуктами третьих фирм; + +**Уровни конфигурационного тестирования** для клиент-серверных приложений (для некоторых типов приложений может быть актуален только один): + +* Серверный: Основной упор здесь делается на тестирование с целью определения оптимальной конфигурации оборудования, удовлетворяющего требуемым характеристикам качества (эффективность, портативность, удобство сопровождения, надежность). Тестируется взаимодействие выпускаемого ПО с окружением, в которое оно будет установлено: + * Аппаратные средства (тип и количество процессоров, объем памяти, характеристики сети / сетевых адаптеров и т. д.); + * Программные средства (ОС, драйвера и библиотеки, стороннее ПО, влияющее на работу приложения и т. д.); +* Клиентский: ПО тестируется с позиции его конечного пользователя и конфигурации его рабочей станции. На этом этапе будут протестированы следующие характеристики: удобство использования, функциональность. Для этого необходимо будет провести ряд тестов с различными конфигурациями рабочих станций: + * Тип, версия и битность операционной системы (подобный вид тестирования называется кроссплатформенное тестирование); + * Тип и версия Web браузера, в случае если тестируется Web приложение (подобный вид тестирования называется кросс-браузерное тестирование); + * Тип и модель видеоадаптера (при тестировании игр это очень важно); + * Работа приложения при различных разрешениях экрана; + * Версии драйверов, библиотек и т. д. (для JAVA приложений версия JAVA машины очень важна, тоже можно сказать и для .NET приложений касательно версии .NET библиотеки); + +**Prerequisites**: + +* создать матрицу покрытия (Coverage Matrix, BCM - Basic Configuration Matrix - это таблица, в которую заносят все возможные конфигурации); +* провести приоритезацию конфигураций (на практике, скорее всего, все желаемые конфигурации проверить не получится); +* шаг за шагом, в соответствии с расставленными приоритетами, проверять каждую конфигурацию; + +Уже на начальном этапе становится очевидно, что чем больше требований к работе приложения при различных конфигурациях рабочих станций, тем больше тестов нам необходимо будет провести. В связи с этим, рекомендуем, по возможности, автоматизировать этот процесс, так как именно при конфигурационном тестировании автоматизация реально помогает сэкономить время и ресурсы. Конечно же автоматизированное тестирование не является панацеей, но в данном случае оно окажется очень эффективным помощником. + +**Примечание**: в ISTQB вообще не говорится о таком виде тестирования как конфигурационное:\ +“configuration testing: See portability testing.”\ +**Тестирование переносимости** (Portability testing) - _тип тестирования, проводимого для оценки простоты переноса элемента тестирования из одних аппаратных средств или программной среды в другие, включая уровень его изменений, необходимых для выполнения в средах различных типов. (ГОСТ 56920)._ Результаты тестирования, полученные в результате тестирования переносимости, помогают выяснить, насколько легко программный компонент из одной среды можно использовать в другой среде. Термин «среда» относится к переходу от одной операционной системы к другой, от одного браузера к другому или от одной версии базы данных к другой версии базы данных. Измерение переносимости - это усилия, необходимые для перемещения программного компонента из одной среды в другую. Одна единица измерения переносимости - это стоимость адаптации программного обеспечения к новой среде по сравнению со стоимостью повторной разработки программного обеспечения. Переносимость может включать в себя Installability, Adaptability, Replaceability, Compatibility or Coexistence, Interoperability, Localization. + +**Portability vs. Compatibility**: + +* Совместимость касается того, могут ли два или более компонента работать в одной и той же среде одновременно, не влияя отрицательно на поведение друг друга. Пример: можно сказать, что текстовый процессор и калькулятор, работающие в одной ОС, такой как Windows 10, совместимы друг с другом, поскольку запуск одного приложения не повлияет на поведение другого приложения; +* Переносимость касается перемещения компонента из одной среды в другую. Пример: игра, работающая в Windows XP, считается переносимой, если та же игра может быть запущена в Windows 7 без каких-либо изменений в ее поведении; +* Проще говоря, тестирование переносимости касается программного компонента в разных средах, в то время как тестирование совместимости касается тестирования разных приложений в одной среде; + +Источники: + +* [Configuration Testing Tutorial With Examples](https://www.softwaretestinghelp.com/what-is-configuration-testing/) +* [Portability Testing Guide With Practical Examples](https://www.softwaretestinghelp.com/what-is-portability-testing/) diff --git a/vidy-metody-urovni-testirovaniya/krossbrauzernoe-testirovanie-cross-browser-testing.md b/vidy-metody-urovni-testirovaniya/krossbrauzernoe-testirovanie-cross-browser-testing.md new file mode 100644 index 0000000..757262c --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/krossbrauzernoe-testirovanie-cross-browser-testing.md @@ -0,0 +1,41 @@ +# Кроссбраузерное тестирование (Cross-browser testing) + +Кроссбраузерное тестирование - вид тестирования, направленный на поддержку и правильное полное отображение программного продукта в разных браузерах, мобильных устройствах, планшетах, экранах различного размера. Это нормально, если сайт выглядит немного по-разному в разных браузерах, главное он должен обеспечивать полную функциональность и доступность (accessibility). Приложения и сайты в разных браузерах могут вести себя по-разному. Это связано с тем, что любой из браузеров имеет собственные движки, надстройки, плагины, а также различия в десктопной и мобильной версиях. + +Приступать к тестированию сайта в популярных браузерах следует уже после того как он проверен на дефекты другими видами тестирования. Только в этом случае можно будет сказать, что выявленные некорректные сценарии имеют отношение именно к особенностям браузера, а не были пропущены на других стадиях. Разумеется, при этом ошибка должна проявляться не во всех браузерах. + +После этого нужно приоритезировать список необходимых браузеров, ОС и платформ исходя из статистики пользователей текущей версии сайта или статистики по целевым регионам. + +Вы должны попытаться протестировать его на реальных физических устройствах, где это возможно. Если у вас нет средств для тестирования всех этих различных комбинаций браузеров, операционных систем и устройств на физическом оборудовании, вы также можете использовать эмуляторы (эмулировать устройство с помощью программного обеспечения на вашем настольном компьютере) и виртуальные машины (программное обеспечение, которое позволяет вам эмулировать несколько комбинаций операционной системы/программного обеспечения на вашем настольном компьютере). Это очень популярный выбор, особенно в некоторых случаях - например, Windows не позволяет одновременно устанавливать несколько версий Windows на одну машину, поэтому использование нескольких виртуальных машин часто является единственным вариантом. Наконец, вы можете стать умнее при тестировании, используя инструменты аудита или автоматизации; это разумный выбор по мере того, как ваши проекты становятся больше, поскольку выполнение всего этого тестирования вручную может занять очень много времени. Вы можете настроить собственную систему автоматизации тестирования (популярным приложением является Selenium), которая может, например, загружать ваш сайт в различных браузерах. Вы также можете пойти дальше, если хотите. Существуют коммерческие инструменты, такие как Sauce Labs, Browserstack, LambdaTest, TestingBot и CrossBrowserTesting, которые делают это за вас, не беспокоясь о настройке, если вы хотите вложить деньги в тестирование. + +Также часто бывает полезно протестировать предварительные версии браузеров. + +**Cross-browser Testing Checklist** + +* Функциональное тестирование; +* Специальные возможности (accessibility); +* Проверка CSS; +* Проверка HTML или XHTML; +* Проверка страницы с включенным JavaScript и без него; +* Функциональность Ajax и JQuery; +* Проверка размера шрифта; +* Макет страницы в разных разрешениях; +* Все изображения и выравнивание; +* Разделы верхнего и нижнего колонтитула; +* Выравнивание содержимого страницы по центру, по левому или правому краю; +* Стили страницы; +* Форматы даты; +* Специальные символы с кодировкой HTML; +* Функция увеличения и уменьшения масштаба страницы. + +Источники: + +* [Кроссбраузерное тестирование: цели и задачи](https://luxhard.com/krossbrauzernoe-testirovanie-tseli-i.html) +* [Top 10 Cross Browser Testing Tools In 2022 (Latest Ranking)](https://www.softwaretestinghelp.com/best-cross-browser-testing-tools-to-ease-your-browser-compatibility-testing-efforts/) + +Доп. материал: + +* [Why Cross Browser Testing is Important](https://www.mindfulqa.com/cross-browser-testing/) +* [Ликбез по браузерам для Windows в 2020](https://habr.com/ru/post/518834/) +* [Comparison of web browsers](https://en.wikipedia.org/wiki/Comparison\_of\_web\_browsers) +* [Live cross browser testing. Running Microsoft Edge and Android with Selenoid](https://www.youtube.com/watch?v=ZwnbuLCZYU4) diff --git a/vidy-metody-urovni-testirovaniya/metody-testirovaniya-white-black-grey-box.md b/vidy-metody-urovni-testirovaniya/metody-testirovaniya-white-black-grey-box.md new file mode 100644 index 0000000..e94c688 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/metody-testirovaniya-white-black-grey-box.md @@ -0,0 +1,8 @@ +# Методы тестирования (White/Black/Grey Box) + +Самым высоким уровнем в иерархии подходов к тестированию будет понятие метода. Некоторые виды тестирования могут выполняться методом как черного ящика, так и белого. Если упростить, то отличаются они знанием внутреннего устройства объекта тестирования. + +Доп. материал: + +* [Черный, белый, серый ящик. Методы тестирования / Урок 11 / Тестировщик с нуля](https://www.youtube.com/watch?v=AqoMSfErDSE) +* [What is red box, yellow box and green box testing?](https://stackoverflow.com/questions/3620990/what-is-red-box-yellow-box-and-green-box-testing) diff --git a/vidy-metody-urovni-testirovaniya/modulnoe-yunit-komponentnoe-testirovanie-module-unit-component-testing.md b/vidy-metody-urovni-testirovaniya/modulnoe-yunit-komponentnoe-testirovanie-module-unit-component-testing.md new file mode 100644 index 0000000..67a3606 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/modulnoe-yunit-komponentnoe-testirovanie-module-unit-component-testing.md @@ -0,0 +1,59 @@ +# Модульное/юнит/компонентное тестирование (Module/Unit/Component testing) + +С этими терминами часто происходит путаница. Если ссылаться на глоссарий ISTQB, то все они - синонимы: + +* _**Модуль, юнит (module, unit): См. компонент.**_ +* _**Модульное, юнит тестирование (module testing, unit testing): См. компонентное тестирование.**_ +* _**Компонент (component): Наименьший элемент программного обеспечения, который может быть протестирован отдельно.**_ +* _**Компонентное тестирование (component testing): Тестирование отдельных компонентов программного обеспечения (IEEE 610).**_ + +Тем не менее, некоторые источники описывают ситуацию несколько иначе и я решил выписать другую точку зрения. + +**Модульное тестирование (оно же юнит-тестирование)** используется для тестирования какого-либо одного логически выделенного и изолированного элемента системы (отдельные методы класса или простая функция, subprograms, subroutines, классы или процедуры) в коде. Очевидно, что это тестирование методом белого ящика и чаще всего оно проводится самими разработчиками. Целью тестирования модуля является не демонстрация правильного функционирования модуля, а демонстрация наличия ошибки в модуле, а также в определении степени готовности системы к переходу на следующий уровень разработки и тестирования. На уровне модульного тестирования проще всего обнаружить дефекты, связанные с алгоритмическими ошибками и ошибками кодирования алгоритмов, типа работы с условиями и счетчиками циклов, а также с использованием локальных переменных и ресурсов. Ошибки, связанные с неверной трактовкой данных, некорректной реализацией интерфейсов, совместимостью, производительностью и т.п. обычно пропускаются на уровне модульного тестирования и выявляются на более поздних стадиях тестирования. Изоляция тестируемого блока достигается с помощью заглушек (stubs), манекенов (dummies) и макетов (mockups). + +**Компонентное тестирование** - тип тестирования ПО, при котором тестирование выполняется для каждого отдельного компонента отдельно, без интеграции с другими компонентами. Его также называют модульным тестированием (Module testing), если рассматривать его с точки зрения архитектуры. Как правило, любое программное обеспечение в целом состоит из нескольких компонентов. Тестирование на уровне компонентов (Component Level testing) имеет дело с тестированием этих компонентов индивидуально. Это один из самых частых типов тестирования черного ящика, который проводится командой QA. Для каждого из этих компонентов будет определен сценарий тестирования, который затем будет приведен к Test case высокого уровня -> детальным Test case низкого уровня с предварительными условиями. + +Исходя из глубины уровней тестирования, компонентное тестирование можно классифицировать как: + +* Тестирование компонентов в малом (CTIS - Component testing In Small): тестирование компонентов может проводиться с или без изоляции остальных компонентов в тестируемом программном обеспечении или приложении. Если это выполняется с изоляцией другого компонента, то это называется CTIS; +* Тестирование компонентов в целом (CTIL - Component testing In Large) - тестирование компонентов, выполненное без изоляции других компонентов в тестируемом программном обеспечении или приложении; + +| **Module/Unit testing** | **Component testing** | +| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| Тестирование отдельных классов, функций для демонстрации того, что программа выполняется согласно спецификации | Тестирование каждого объекта или частей программного обеспечения отдельно с или без изоляции других объектов | +| Проверка в(на) соответствии с design documents | Проверка в(на) соответствии с test requirements, use case | +| Пишутся и выполняются разработчиками | Тестировщиками | +| Выполняется первым | Выполняется после Unit | + +Другой источник: + +По-существу эти уровни тестирования представляют одно и тоже, разница лишь в том, что в компонентном тестировании в качестве параметров функций используют реальные объекты и драйверы, а в модульном/unit тестировании - конкретные значения. + +\*В контексте юнит-тестирования еще можно встретить понятие [golden testing](https://ro-che.info/articles/2017-12-04-golden-tests). Оно означает те же юнит тесты, но с ожидаемыми результатами хранящимися в отдельном файле. Таким образом после прогона выходные значения тестов сравниваются с golden (эталонным) файлом. + +\*Иногда юнит-тесты называют одинокими (solitary) в случае тотального применения имитаций и заглушек или общительными (sociable) в случае реальных коммуникаций с другими участниками. + +\*Правило трех А(AAA) (arrange, act, assert) или триада «дано, когда, тогда» - хорошая мнемоника, чтобы поддерживать хорошую структуру тестов. + +Источники: + +* [What is Component Testing? Techniques, Example Test Cases](https://www.guru99.com/component-testing.html) +* [Лекция 5: Модульное и интеграционное тестирование](https://intuit.ru/studies/courses/48/48/lecture/1432) + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.11 Подпроцесс покомпонентного тестирования” +* [Я сомневался в юнит-тестах, но…](https://habr.com/ru/company/skyeng/blog/521324/) +* [Юнит-тесты переоценены](https://habr.com/ru/company/qiwi/blog/510608/) +* [Elliotte Rusty Harold - Effective Unit Testing](https://www.youtube.com/watch?v=QYj7MLumImM\&ab\_channel=Heisenbug) +* [Kevlin Henney - What we talk about when we talk about unit testing](https://www.youtube.com/watch?v=-WWIeXmm4ec\&ab\_channel=Heisenbug) +* [Андрей Сербин - Компонентное тестирование инфраструктуры](https://www.youtube.com/watch?v=hRg\_HKB4Fbc\&ab\_channel=Heisenbug) +* [Анатомия юнит тестирования](https://habr.com/ru/post/507594/) +* [Unit Test](https://martinfowler.com/bliki/UnitTest.html) +* [Component Test](https://martinfowler.com/bliki/ComponentTest.html) +* [Анатомия юнит-теста](https://habr.com/ru/post/554808/) +* [Почему большинство юнит тестов - пустая трата времени? (перевод статьи)](https://habr.com/ru/post/557824/) +* [Unit Testing Guide](https://www.softwaretestingmaterial.com/unit-testing/) +* [Лекция 2: Тестирование программного кода (методы+окружение)](https://intuit.ru/studies/courses/1040/209/lecture/5385) +* [Starting to Unit Test: Not as Hard as You Think](https://www.amazon.com/Starting-Unit-Test-Hard-Think-ebook/dp/B00KIZ6JAC/) +* [6 оправданий для того, чтобы не писать юнит-тесты](https://testengineer.ru/opravdaniya-dlya-togo-chtoby-ne-pisat-yunit-testy/) diff --git a/vidy-metody-urovni-testirovaniya/mozhno-li-otnesti-testirovanie-bezopasnosti-ili-nagruzochnoe-testirovanie-k-funkcionalnym-vidam-test.md b/vidy-metody-urovni-testirovaniya/mozhno-li-otnesti-testirovanie-bezopasnosti-ili-nagruzochnoe-testirovanie-k-funkcionalnym-vidam-test.md new file mode 100644 index 0000000..24ee79d --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/mozhno-li-otnesti-testirovanie-bezopasnosti-ili-nagruzochnoe-testirovanie-k-funkcionalnym-vidam-test.md @@ -0,0 +1,15 @@ +# Можно ли отнести тестирование безопасности или нагрузочное тестирование к функциональным видам тести + +Данные виды принято относить к нефункциональным видам тестирования, однако если конкретно безопасность или производительность является основным функционалом приложения, а не его атрибутами, то можно отнести и к функциональным. Как пример я бы привел программу-шифровальщик флешки (можно обсудить в коммьюнити, накидают вариантов). + +_Есть функциональное требование: “Пользователь должен иметь возможность перевести деньги со своей карты на другую карту по номеру"._ + +_Это функциональное требование (ну, на самом деле это целая тонна требований, но обобщим их до одной user story)._ + +_Оно отвечает на вопрос "какие операции должен уметь выполнять сервис"._ + +_К этой функциональности может предъявляться еще куча требований - по безопасности, по скорости, по отказоустойчивости, и т.д. Они описывают то, КАК система должна работать, а не ЧТО она должна уметь._ + +_\_Нефункциональные требования могут быть критичными, могут блокировать выпуск той или иной функциональности. Но это все еще свойство фичи, а не какая-то самостоятельная ее функция._ + +_В то же время, есть, например, функциональные требования безопасности, типа "автоматически блокировать транзакции обладающие характеристиками А, Б, В". (с)_ [azshoo](https://t.me/qajuniors/253022) diff --git a/vidy-metody-urovni-testirovaniya/nagruzochnoe-testirovanie-load-testing.md b/vidy-metody-urovni-testirovaniya/nagruzochnoe-testirovanie-load-testing.md new file mode 100644 index 0000000..3dd4a4f --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/nagruzochnoe-testirovanie-load-testing.md @@ -0,0 +1,65 @@ +# Нагрузочное тестирование (Load testing) + +_Нагрузочное тестирование (load testing): Вид тестирования производительности, проводимый с целью оценить поведение компонента или системы под увеличивающейся нагрузкой (число одновременно работающих пользователей и/или число транзакций) для определения максимально допустимого уровня нагрузки для исследуемого компонента или системы. (ISTQB)_ + +_Нагрузочное тестирование (load testing): Тип тестирования уровня производительности, проводимого для оценки поведения элемента тестирования при ожидаемых условиях переменной нагрузки, обычно для ожидаемых условий низкого, типичного и пикового использования. (ГОСТ 56920)_ + +Нагрузочное тестирование - это тестирование, имитирующее работу определенного количества бизнес пользователей на каком-либо общем (разделяемом ими) ресурсе. Этот подвид тестирования производительности выполняется для диагностики поведения системы при увеличении рабочей нагрузки. + +Пример. Предположим, что требование нашего клиента для страницы входа составляет 2-5 секунд, и эти 2-5 секунд должны быть всегда, пока нагрузка не достигнет 5000 пользователей, а также если количество пользователей постепенно увеличивается, то сколько ЦП, памяти будет потребляться, каково состояние сети, время отклика, пропускная способность и т.д. + +![](https://lh3.googleusercontent.com/KQDgZCIEO4LqnoxMqJNaTZ3F7\_bxgN7oKJfQzY\_uw7FUdT8ssHCirc5E1J9l6L9lF\_PXaVQIg6J1M1YsQiLv7MTAaccr3w2WmB3\_0BSxo454ossgqrPGDAErf2eal5Pt0IUycExM) + +**Подход к нагрузочному тестированию**: + +**Определите критерии приемки нагрузочного теста**. Например: + +* Время отклика страницы входа не должно превышать 5 секунд даже в условиях максимальной нагрузки; +* Загрузка ЦП не должна превышать 80%; +* Пропускная способность системы должна составлять 100 транзакций в секунду; + +**Определите бизнес-сценарии, которые необходимо протестировать**. Не тестируйте все потоки, постарайтесь понять основные business flows, которые, как ожидается, будут происходить в производственной среде. Если это уже существующее приложение, мы можем получить информацию из логов. Если это новое приложение, нам нужно работать с бизнес-группами, чтобы понять закономерности потока, использование приложения и т. д. Иногда команда проекта проводит семинары, чтобы дать обзор или подробности о каждом компоненте приложения; + +**Моделирование рабочей нагрузки**. Получив подробную информацию о бизнес-потоках, шаблонах доступа пользователей и количестве пользователей, нам нужно спроектировать рабочую нагрузку таким образом, чтобы она имитировала фактическую навигацию пользователя в производственной среде или как она ожидается в будущем, когда приложение будет в производстве. Ключевые моменты, которые следует помнить при разработке модели рабочей нагрузки, - это увидеть, сколько времени потребуется для завершения конкретного бизнес-потока. Здесь нам нужно назначить время обдумывания (think time) таким образом, чтобы пользователь мог более реалистично перемещаться по приложению. Схема рабочей нагрузки обычно будет с нарастанием, спадом и устойчивым состоянием (Ramp up, Ramp down and a steady state). + +![https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/06/Image5.png](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/06/Image5.png) + +Устойчивое состояние обычно представляет собой одночасовое испытание под нагрузкой с нарастанием 15 минут и замедлением 15 минут. + +**Пример модели рабочей нагрузки**: Предположим, что это интернет-магазин, где пользователи войдут в приложение и получат широкий выбор платьев для покупок и могут перемещаться по каждому продукту. Чтобы просмотреть подробную информацию о каждом продукте, им нужно щелкнуть по продукту. Если им нравится цена и качество продукта, они могут добавить его в корзину и купить продукт, выполнив проверку и произведя оплату. Список сценариев: + +* Обзор - здесь пользователь запускает приложение, входит в приложение, просматривает различные категории и выходит из приложения; +* Обзор, Просмотр продукта, Добавить в корзину - здесь пользователь входит в приложение, просматривает различные категории, просматривает сведения о продукте, добавляет продукт в корзину и выходит из системы; +* Обзор, просмотр продукта, добавление в корзину и оформление заказа - в этом сценарии пользователь входит в приложение, просматривает различные категории, просматривает сведения о продукте, добавляет продукт в корзину, оформляет заказ и выходит из системы; +* Обзор, Просмотр продукта, Добавить в корзину, Оформить заказ и произвести оплату - здесь пользователь входит в приложение, просматривает различные категории, просматривает сведения о продукте, добавляет продукт в корзину, оформляет заказ, производит оплату и выходит из системы. + +| Business Flow | Количество транзакций | Виртуальная пользовательская нагрузка | Время отклика (сек) | % Допустимая частота отказов | Транзакций в час | +| ------------- | --------------------- | ------------------------------------- | ------------------- | ---------------------------- | ---------------- | +| 1 | 17 | 1600 | 3 | Менее 2% | 96000 | +| 2 | 17 | 200 | 3 | Менее 2% | 12000 | +| 3 | 18 | 120 | 3 | Менее 2% | 7200 | +| 4 | 20 | 80 | 3 | Менее 2% | 4800 | + +Приведенные выше значения были получены на основе следующих расчетов: Транзакций в час = Количество пользователей \* Транзакции, совершенные одним пользователем за один час. Количество пользователей = 1600. Общее количество транзакций в сценарии просмотра = 17. Время отклика для каждой транзакции = 3. Общее время, за которое один пользователь совершил 17 транзакций = 17 \* 3 = 51, округленное до 60 секунд (1 мин). Транзакций в час = 1600 \* 60 = 96000 Транзакций. + +1. Дизайн / разработка нагрузочных тестов - Нагрузочный тест должен быть разработан с использованием данных, которые мы уже собрали, то есть бизнес-потоков, количества пользователей, пользовательских шаблонов, показателей, которые необходимо собрать и проанализировать. Более того, тесты должны быть максимально реалистичными. +2. Выполнение нагрузочного теста - перед тем, как мы выполним нагрузочный тест, убедитесь, что приложение запущено и работает. Среда нагрузочного тестирования готова. Приложение функционально протестировано и работает стабильно. Проверьте параметры конфигурации среды нагрузочного тестирования. Она должна быть такой же, как и в производственной среде. Убедитесь, что доступны все тестовые данные. Не забудьте добавить необходимые метрики для отслеживания производительности системы во время выполнения теста. Всегда начинайте с небольшой нагрузки и постепенно увеличивайте ее. Никогда не начинайте работу с полной нагрузкой. +3. Анализ результатов нагрузочного теста - имейте baseline test, чтобы всегда сравнивать его с другими тестами. Соберите метрики и журналы сервера после запуска теста, чтобы найти узкие места. Некоторые проекты используют инструменты мониторинга производительности приложений для мониторинга системы во время тестового запуска, эти инструменты APM (Application Performance Monitoring) помогают легче определить основную причину и сэкономить много времени. +4. Отчетность - после завершения тестового прогона соберите все показатели и отправьте сводный отчет теста соответствующей группе со своими наблюдениями и рекомендациями. + +Источники: + +* [Load Testing Complete Guide For Beginners](https://www.softwaretestinghelp.com/load-testing/) +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) +* [Нагрузочное тестирование игровых серверов](https://habr.com/ru/company/vk/blog/572742/) +* [Методология и практика нагрузочного тестирования. Опыт Miro](https://habr.com/ru/company/miro/blog/573338/) +* [Нагрузочное тестирование сайта на Microsoft Azure](https://habr.com/ru/post/578192/) +* [Стенд для нагрузочного тестирования: от DEV до PROD](https://habr.com/ru/company/rtlabs/blog/577580/) +* [Поговорим о нагрузочном тестировании](https://habr.com/ru/company/veeam/blog/578942/) +* [Как не надо проводить нагрузочное тестирование](https://xwizard-test.blogspot.com/2015/01/blog-post\_30.html) +* [Планируем нагрузочное тестирование](https://testengineer.ru/planiruem-nagruzochnoe-testirovanie/) +* [Нагрузочное тестирование X5 QA meetup #2](https://www.youtube.com/watch?v=apDoQM6Ys1k) + +Доп. материал: + +* [Профиль нагрузочного тестирования. С чего начать?](https://www.youtube.com/watch?v=KOdmFxyB\_Ok) diff --git a/vidy-metody-urovni-testirovaniya/nefunkcionalnoe-testirovanie-non-functional-testing.md b/vidy-metody-urovni-testirovaniya/nefunkcionalnoe-testirovanie-non-functional-testing.md new file mode 100644 index 0000000..8f1184e --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/nefunkcionalnoe-testirovanie-non-functional-testing.md @@ -0,0 +1,73 @@ +# Нефункциональное тестирование (Non-Functional testing) + +Нефункциональное тестирование проводится для проверки нефункциональных требований приложения, таких как производительность, безопасность, совместимость, надежность, удобство использования и т. д. В большинстве случаев это выполняется методом black box testing. Оно проверяет, соответствует ли поведение системы требованиям по всем аспектам, не охваченные функциональным тестированием. В нашем повседневном тестировании много внимания уделяется функциональному тестированию и функциональным требованиям и клиенты также заинтересованы в выполнении функциональных требований, которые напрямую связаны с функциональностью приложения, но когда ПО выходит на рынок и используется реальными конечными пользователями, у них есть шансы столкнуться с проблемами. Эти проблемы не связаны с функциональностью системы, но могут негативно повлиять на пользовательский опыт. + +**Нефункциональные требования могут быть отражены как**: + +* Пользовательские / Технические истории (User /Technical Stories): запись нефункциональных требований в виде пользовательской истории такая же, как и запись любых других требований. Единственная разница между пользователем и технической историей заключается в том, что пользовательская история требует обсуждения и имеет видимость (? visibility); +* В критериях приемки (Acceptance criteria): это точка, которая определяется для принятия продукта заказчиком. Нефункциональное требование должно быть включено в критерии приемки, но иногда невозможно проверить нефункциональные требования с каждой историей, то есть с каждой итерацией. Следовательно, требования следует добавлять или тестировать только с соответствующей итерацией; +* В артефактах (Artifact): для нефункциональных требований следует подготовить отдельный артефакт, это, в свою очередь, поможет лучше понять, что нужно тестировать и как это можно делать в итерациях; + +**Документ подхода к тестированию (Approach Document)**: + +Разработайте конкретный подход к этапу тестирования, уточнив общую стратегию тестирования. Этот подход к тестированию помогает при планировании и выполнении всех задач тестирования: + +* Объем испытаний (Test Scope); +* Метрики тестирования; +* Инструменты тестирования; +* Основные даты и результаты; + +**Виды нефункционального тестирования (список не полный)**: + +* Тестирование производительности (Performance Testing) +* Нагрузочное тестирование (Load Testing) +* Стрессовое тестирование (Stress Testing) +* Объемное тестирование (Volume Testing) +* Тестирование восстановления (Recovery Testing) +* Тестирование отказоустойчивости (Failover Testing) +* Тестирование эффективности (Efficiency Testing) +* Тестирование аварийного восстановления (Disaster Recovery Testing) +* Тестирование установки (Installation Testing) +* Тестирование документации (Documentation Testing) +* Тестирование на удобство использования (Usability Testing) +* Тестирование графического интерфейса пользователя (User Interface Testing) +* Тестирование совместимости (Compatibility Testing) +* Тестирование обслуживаемости (Maintainability Testing) +* Тестирование безопасности (Security Testing) +* Тестирование масштабируемости (Scalability Testing) +* Тестирование выносливости (Endurance Testing) +* Тестирование надежности (Reliability Testing) +* Тестирование соответствия (Compliance Testing) +* Тестирование локализации (Localization Testing) +* Тестирование интернационализации (Internationalization Testing) +* Тестирование переносимости (Portability Testing) +* Тестирование на основе базового уровня (Baseline Testing) + +**Примеры чек-листов**: + +Тестирование производительности: + +* Время отклика (The response time) приложения, то есть сколько времени требуется для загрузки приложения, за какое время любой ввод, предоставленный приложению, обеспечивает вывод, время обновления браузера и т. д.; +* Пропускную способность (Throughput) следует проверять по количеству транзакций, завершенных во время нагрузочного теста; +* Настройка среды (Environment) должна быть такой же, как и в реальной среде, иначе результаты не будут такими же; +* Время процесса (Process time) - такие действия, как импорт и экспорт Excel, любые вычисления в приложении должны быть протестированы; +* Совместимость (Interoperability) должна быть проверена, т.е. программное обеспечение должно иметь возможность взаимодействовать с другим программным обеспечением или системами; +* Необходимо проверить время ETL, то есть время, затраченное на извлечение, преобразование и загрузку данных из одной базы данных в другую; +* Необходимо проверить возрастающую нагрузку (Load) на приложение; + +Тестирование безопасности: + +* Аутентификация (Authentication): только достоверный пользователь может войти в систему; +* Авторизация (Authorized): пользователь должен иметь возможность входить в те модули, для которых он авторизован или к которым пользователю был предоставлен доступ; +* Пароль: Требование пароля должно быть подтверждено, т.е. пароль должен соответствовать тому, как это требование определяется, то есть длине, специальным символам, числам и т. д.; +* Тайм-аут: если приложение неактивно, оно должно истечь по таймауту в указанное время; +* Резервное копирование данных: резервное копирование данных должно быть выполнено в указанное время и данные должны быть скопированы в безопасное место; +* Внутренние ссылки на веб-приложение не должны быть доступны, если размещены непосредственно в браузере; +* Вся коммуникация должна быть зашифрована; + +Тестирование документации: + +* Пользовательская и системная документация; +* Документы для учебных целей; + +Источник: [A Complete Non-Functional Testing Guide For Beginners](https://www.softwaretestinghelp.com/what-is-non-functional-testing/) diff --git a/vidy-metody-urovni-testirovaniya/obemnoe-testirovanie-volume-testing.md b/vidy-metody-urovni-testirovaniya/obemnoe-testirovanie-volume-testing.md new file mode 100644 index 0000000..802c3ac --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/obemnoe-testirovanie-volume-testing.md @@ -0,0 +1,33 @@ +# Объемное тестирование (Volume testing) + +_Объемное тестирование (volume testing): Тип тестирования уровня производительности, проводимого для оценки способности элемента тестирования обработать определенные объемы данных (обычно равных или близких к максимальным указанным потенциальным возможностям) с точки зрения потенциальных возможностей пропускной способности, емкости памяти или того и другого. (ГОСТ 56920)_ + +Объемное тестирование (также flood testing) предназначено для прогнозирования того, может ли система / приложение обрабатывать большой объем данных в плане проверки объема данных, обрабатываемых базой данных. Это тестирование сосредоточено на наполнении БД продукта в реальных сценариях использования, отслеживании производительности приложения при различных объемах БД. Обычно продолжительность проверки объема составляет 1 час или время, необходимое для обработки n записей; оно может варьироваться в зависимости от вашего SLA / требований. + +![https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/01/Connected-Data.jpg](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/01/Connected-Data.jpg) + +**Причины для проведения этого тестирования**: + +* Самая основная потребность - проанализировать производительность вашей системы при увеличивающемся объеме данных. Создание огромного объема данных поможет вам понять производительность вашей системы с точки зрения времени отклика, потери данных и т. д.; +* Выявление проблем, которые могут возникнуть с огромными данными, а также пороговой точки (threshold point); +* За пределами устойчивой или пороговой точки (то есть при сбое БД) система перестает отвечать на запросы или появляются таймауты; +* Реализация решений по перегрузке БД и даже их проверка; +* Выявление крайней точки вашей БД (которая не может быть исправлена), за которой система выйдет из строя, и, следовательно, необходимо принять меры предосторожности; +* В случае наличия более одного сервера БД, выявление проблем с коммуникациями между БД; + +**Примеры тест-кейсов**: + +* Добавление данных может быть выполнено успешно и отражено ли оно в приложении или на веб-сайте; +* Удаление данных может быть выполнено успешно и отражается ли оно в приложении или на веб-сайте; +* Обновление данных может быть выполнено успешно, и отражается ли оно в приложении или на веб-сайте; +* Отсутствуют потери данных и вся информация отображается в приложении или на веб-сайте должным образом; +* Время ожидания приложения или веб-страниц не истекло из-за большого объема данных; +* При большом объеме данных нет сообщений о крешах; +* Данные не перезаписаны и отображаются соответствующие предупреждения; +* Другие модули вашего веб-сайта или приложения не завершают работу аварийно или не работают по таймауту из-за большого объема данных; +* Время отклика базы данных находится в допустимом диапазоне; + +Источники: + +* [Volume Testing Tutorial: Examples And Volume Testing Tools](https://www.softwaretestinghelp.com/what-is-volume-testing/) +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) diff --git a/vidy-metody-urovni-testirovaniya/ocenka-uyazvimosti-zashishennosti-vulnerability-assessment.md b/vidy-metody-urovni-testirovaniya/ocenka-uyazvimosti-zashishennosti-vulnerability-assessment.md new file mode 100644 index 0000000..5c3a0e7 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/ocenka-uyazvimosti-zashishennosti-vulnerability-assessment.md @@ -0,0 +1,130 @@ +# Оценка уязвимости/защищенности (Vulnerability Assessment) + +**Уязвимость** - это любые ошибки или недостатки в процедурах безопасности системы, разработке, реализации или любом внутреннем контроле, которые могут привести к нарушению политики безопасности системы. + +**Оценка уязвимости** - это процесс оценки рисков безопасности в программной системе с целью уменьшения вероятности угрозы. Целью оценки уязвимости является снижение возможности несанкционированного доступа для злоумышленников (хакеров). + +Анализ проникновения зависит от двух механизмов, а именно от оценки уязвимости и тестирования на проникновение (VAPT - Vulnerability Assessment and Penetration testing). + +**Классификация уязвимостей**: + +* Уязвимость оборудования - это недостатки, возникающие из-за проблем с оборудованием, таких как чрезмерная влажность, пыль и незащищенное хранение оборудования; +* Уязвимость программного обеспечения. Недостаток в методике разработки проекта, несоответствующее тестирование и отсутствие своевременного аудита активов приводят к уязвимости программного обеспечения; +* Уязвимость сети: из-за использования открытых сетевых подключений, незащищенной сетевой архитектуры и слабого канала связи возникают проблемы этого типа; +* Физическая уязвимость: если система расположена в зоне, подверженной сильному дождю, наводнению, нестабильному электроснабжению и т. д., тогда она подвержена физической уязвимости; +* Уязвимость организации: эта уязвимость возникает из-за использования несоответствующих инструментов безопасности, правил аудита и ошибок в административных действиях; + +**Наиболее распространенные уязвимости** сетевой безопасности: + +* **USB-накопители**. Использование USB-накопителей - самый обычный способ воздействия на любую сетевую систему и даже брандмауэр не сможет остановить вирусную атаку, поскольку они используются между многими компьютерами для обмена большим объемом информации и могут переносить большие объемы данных внутри себя. USB-накопители, зараженные вирусами, такими как червь, автоматически устанавливаются в ОС и подключаются к USB-порту, поскольку большая часть ОС по умолчанию позволяет запускать эти программы. + + Способ устранения: мы можем остановить автоматическую установку их в ОС, изменив настройки по умолчанию в операционных системах, и можем сделать их более безопасными от вирусных атак с USB-накопителей. +* **Ноутбуки**. Такие устройства, как лэптопы и ноутбуки очень удобны и портативны, оснащены всеми новейшими драйверами, ОС и имеют порт Ethernet, через который их можно легко подключить к любой сетевой системе. Ноутбуки очень небезопасны с точки зрения организации, ноутбук сотрудника содержит конфиденциальные данные, такие как зарплата сотрудника, адрес, контактная информация, личные данные, важная база данных компании, личные банковские пароли и т. д. Любая организация не может допустить утечки всей этой информации, так как это повлияет на бизнес, и организация может пострадать от бизнес-потерь. + + Способ устранения: все конфиденциальные и важные данные должны храниться в зашифрованном виде, чтобы третьи лица не могли легко получить к ним доступ. Права доступа к базе данных должны быть ограничены. В дополнение к этому, должен быть включен только порт LAN, а все остальные порты должны быть отключены администратором. +* **Разные USB-устройства**. Помимо флэш-накопителей USB, в сети присутствуют некоторые другие устройства, которые могут считывать и хранить данные в них и могут подвергнуть вашу систему уязвимости. Зараженные этим вирусом устройства, такие как цифровая камера, принтер, сканер, MP3-плеер и т. д., вступят в контакт с вашей системой через порт USB и могут нанести вред вашей сетевой системе. + + Способ устранения: установите такие политики, которые могут контролировать автоматический запуск программ порта USB в вашей системе. +* **Оптические носители**. Оптические носители являются носителями важных пакетов данных, которыми обмениваются в сетевой системе WAN для связи на большие расстояния. Следовательно, данные по этим ссылкам также могут быть пропущены или использованы не по назначению третьей стороной в интересах кого-то другого, как в случае с USB-устройствами. + + Способ устранения: руководство должно ввести такие политики и правила контроля активов, которые могут отслеживать и контролировать неправомерное использование данных. +* **Электронная почта**. Электронная почта является наиболее распространенным источником связи внутри организации или между различными организациями в деловых целях. Любая компания использует электронную почту для отправки и получения данных. Но электронной почтой чаще всего злоупотребляют, так как ее легко переслать кому угодно. Кроме того, иногда электронные письма содержат вирусы, которые могут узнать учетные данные целевого хоста, а затем хакер может легко получить доступ к электронной почте этого сотрудника организации из любого места. Они также могут использовать его для другого несанкционированного доступа. + + Способ устранения: использование политик безопасности электронной почты и частая смена паролей системы через определенный промежуток времени - лучшее решение для этого. +* **Смартфоны и другие цифровые устройства**. Смартфоны и другие планшетные устройства могут работать как компьютер в дополнение к выполнению различных задач, таких как интеллектуальные вызовы, видеозвонки, большой объем памяти, камера с высоким разрешением и огромная система поддержки приложений. Риск утечки конфиденциальных данных также высок, поскольку сотрудник организации, использующий смартфон, может щелкнуть изображение секретного бизнес-предложения или расценок и может отправить их любому, кто пользуется мобильной сетью 4G. + + Способ устранения: необходимо внедрить политики, которые могут контролировать доступ к устройству при входе в среду сетевой системы и выходе из нее. +* **Слабая безопасность учетных данных**: использование слабых паролей в сетевой системе легко подвергает сеть различным вирусным атакам. + + Способ устранения: пароль, используемый для сетевой безопасности, должен быть надежным, как уникальная комбинация буквенно-цифровых символов и символов. Кроме того, нельзя использовать один и тот же пароль в течение длительного времени, необходимо регулярно менять системный пароль для получения лучших результатов. +* **Плохая конфигурация и использование устаревшего брандмауэра**: брандмауэр играет очень важную роль в процессе управления сетевой безопасностью. Если администратор неправильно настроит брандмауэр на различных уровнях сети, она станет уязвимой для атак. Помимо этого, программный патч брандмауэра должен постоянно обновляться для правильного функционирования брандмауэра. Использование устаревшего оборудования и программного обеспечения брандмауэра бесполезно. + + Способ устранения: Регулярное обновление программного обеспечения межсетевого экрана и правильная реализация. + +**Этапы оценки уязвимости:** + +* **Сбор данных**: первым шагом оценки является сбор всех необходимых данных, касающихся ресурсов, используемых в системе, таких как IP-адреса системы, используемые носители, используемое оборудование, тип антивируса, используемого системой, и т. д.; +* **Выявление возможных сетевых угроз**: теперь, имея входные данные, мы можем определить возможные причины и лазейки сетевых угроз в сети, которые могут нанести вред нашей системе. Здесь нам также необходимо определить риски и приоритетность угроз (The impact of Risk, The threshold of Risk, Risk strategy, business impact); +* **Анализ паролей маршрутизаторов и WI-FI**: необходимо проверить, что пароли, используемые для входа в маршрутизатор, и пароль, используемый для доступа в Интернет, достаточно надежны, чтобы их было сложно взломать. Кроме того, здесь важно убедиться, что пароль меняется через регулярные промежутки времени, чтобы система стала более устойчивой к атакам; +* **Анализ стойкости (strength) сети организации**: Следующим шагом является оценка стойкости сети системы по отношению к обычным атакам, включая распределенную атаку типа «отказ в обслуживании» (DDoS), атаку «человек посередине» (MITM) и сетевое вторжение. Это, в свою очередь, даст нам четкое представление о том, как наша система будет реагировать в случае этих атак, и способна ли она спастись или нет; +* **Оценка безопасности сетевых устройств**: теперь проанализируйте реакцию сетевых устройств, таких как коммутатор, маршрутизатор, модем и ПК, на сетевые атаки. Здесь будет подробно рассказываться о реакции устройств со ссылкой на угрозы; +* **Сканирование на выявленные уязвимости**: последний шаг оценки - сканирование системы на предмет известных угроз и уязвимостей, которые уже присутствуют в сети. Это делается с помощью различных инструментов сканирования; +* **Создание отчета**: Очень важна документация по процессу оценки уязвимости сети. Она должна содержать все действия, выполненные от начала до конца, и угрозы, обнаруженные во время тестирования, а также процесс их устранения; +* **Повторное тестирование**: следует постоянно проверять и анализировать систему на предмет новых возможных угроз и атак и принимать все возможные меры для их смягчения; + +Процесс оценки уязвимости выступает в качестве входных данных для политики сетевой безопасности (network security policy). + +**Классификации сканеров уязвимостей:** + +**По типу активов/ресурсов (assets):** + +* **Сетевые сканеры** (Network-based scanners). Вы можете использовать сетевые сканеры для обнаружения неавторизованных устройств или неизвестных пользователей в сети. Эти сканеры позволяют сетевым администраторам определять, существуют ли в сети скрытые лазейки по периметру, такие как несанкционированный удаленный доступ. Сетевые сканеры не имеют прямого доступа к файловой системе. Таким образом, они не могут проводить проверки безопасности низкого уровня; +* **Хост-сканеры** (Host-based scanners). Как следует из названия, сканер на основе хоста находится на каждом хосте в отслеживаемой сети. Он обнаруживает и идентифицирует уязвимости на рабочих станциях, серверах или других сетевых узлах, обеспечивая большую видимость настроек конфигурации ваших активов; +* **Сканеры приложений** (Application scanners). Сканеры приложений находят уязвимости на веб-сайтах. Их режим работы аналогичен режиму работы поисковых систем - они «ползут» по веб-сайтам, отправляя ряд зондов на каждую веб-страницу на веб-сайте, чтобы найти слабые места; +* **Сканеры беспроводной сети** (Wireless network scanners). Сканеры беспроводных сетей, также называемые анализаторами беспроводных протоколов (wireless protocol analyzers), представляют собой инструменты, которые вы можете использовать для обнаружения открытых беспроводных сетей в вашей среде. Организации, которые запрещают использование беспроводных сетей, могут использовать эти сканеры беспроводных сетей для обнаружения любых неавторизованных сетей Wi-Fi; +* **Сканеры баз данных** (Database scanners). Вы можете использовать сканеры баз данных для выявления уязвимостей в вашей базе данных. Сканеры баз данных могут помочь вам предотвратить вредоносные взломы, такие как атаки с использованием SQL-инъекций; + +**По источнику:** + +* **Сканеры внешних уязвимостей**. С помощью внешних сканеров вы выполняете сканирование уязвимостей вне сети компании. Внешние сканеры обычно нацелены на ИТ-инфраструктуру, доступную в Интернете, включая открытые порты в сетевом брандмауэре и брандмауэрах веб-приложений; +* **Сканеры внутренних уязвимостей**. В отличие от внешних сканеров, внутренние сканеры проводят сканирование уязвимостей изнутри корпоративной сети. Это сканирование позволяет защитить и укрепить критически важные приложения, обнаруживая внутренние угрозы, например вредоносные программы, проникшие в сеть; + +**По авторизованности:** + +* **С аутентификацией**. Сканирование с проверкой подлинности - также называемое сканированием с учетными данными - позволяет администратору сети войти в систему как пользователь и определить слабые места сети с точки зрения доверенного пользователя. Поскольку вы вошли в систему, вы можете глубже проникнуть в сеть, чтобы обнаружить многочисленные угрозы; +* **Без аутентификации**. При сканировании без аутентификации вам не нужно входить в сеть для выполнения сканирования. Хотя вы можете получить представление о сети посторонним, вы, скорее всего, упустите большинство уязвимостей при использовании сканирования без аутентификации; + +**Тестирование на проникновение (Penetration testing)**: + +Это имитация атаки, в ходе которой компьютерная система, сеть или приложение проверяются на наличие слабых мест в системе безопасности. Эти тесты основаны на сочетании инструментов и методов, которые настоящие хакеры использовали бы для взлома. Это похоже на то, как банк нанимает кого-то, чтобы в роли грабителя попытаться проникнуть в их здание и получить доступ к хранилищу. Если «грабитель» добьется успеха и проникнет в банк или хранилище, банк получит ценную информацию о том, как им нужно усилить меры безопасности. Другие распространенные названия тестов на проникновение - это white hat attacks and ethical hacking. Данный вид тестирования выполняется как вручную, так и автоматически и может быть как Black Box, так и Grey и White. Ввиду необходимости наличия специфических знаний и опыта для выполнения этого вида тестирования привлекается отдельный специалист - пентестер. + +**Примеры кейсов** тестирования на проникновение: + +* Тест на проникновение в сеть: + * выявление уязвимостей сетевого и системного уровня; + * определение неправильных конфигураций и настроек; + * выявление уязвимости беспроводной сети; + * мошеннические услуги; + * отсутствие надежных паролей и наличие слабых протоколов. +* [Тест на проникновение приложений](http://withsecurity.ru/pentest-mobilnyh-prilozheniy-na-chto-obratit-vnimanie): + * выявление недостатков прикладного уровня; + * подделка запросов; + * применение злонамеренных скриптов; + * нарушение работы управления сеансами; +* Тест на физическое проникновение: + * взлом физических барьеров; + * проверка и взлом замков; + * нарушения работы и обход датчиков; + * вывод из строя камер видеонаблюдения; + +**Отличия Vulnerability Assessment от Penetration testing** + +VAPT = Vulnerability Assessment + Penetration testing + +![https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/01/Vulnerbility-Assessment-and-Penetration-Testing.jpg](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/01/Vulnerbility-Assessment-and-Penetration-Testing.jpg) + +| Vulnerability Assessment | Penetration Testing | +| ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| Это метод поиска и измерения уязвимости системы | Находит уязвимости и использует их | +| Конечным результатом является список уязвимостей, которые приоретизируются по их влиянию | Тест на проникновение более целенаправлен. Он помогает наметить путь, по которому злоумышленник проникнет в систему | +| В основном автоматизированно | В основном вручную | +| Быстрее | Дольше | +| Дешевле | Дороже | +| Направлено вширь | Направлено вглубь каждой уязвимости для достижения конкретных целей | +| Выполняется в критически важных системах в реальном времени | Выполняется на некритичных системах | +| Оценка уязвимости должна проводиться не реже одного раза в квартал, в основном после обновления оборудования или серьезных изменений в сети | Тестирование на проникновение следует проводить ежегодно после значительных изменений | +| Подробно описывается, какие уязвимости существуют и что изменилось с момента последнего анализа | Эффективно идентифицирует информацию, которая была скомпрометирована | + +Источники: + +* [Network Vulnerability Assessment And Management Guide](https://www.softwaretestinghelp.com/vulnerability-assessment-management/) +* [What Is Vulnerability Assessment, and Why Is It Important?](https://www.parallels.com/blogs/ras/vulnerability-assessment/) +* [Penetration Testing vs Vulnerability Assessment](https://www.educba.com/penetration-testing-vs-vulnerability-assessment/) + +Доп. материал: + +* [Top 10 Most Powerful Vulnerability Assessment Scanning Tools In 2021](https://www.softwaretestinghelp.com/vulnerability-assessment-tools/) +* [A Complete Penetration Testing Guide With Sample Test Cases](https://www.softwaretestinghelp.com/penetration-testing-guide/) +* [Взрослый разговор о пентесте и хакинге](https://www.youtube.com/watch?v=sTmAf0Pa\_eM) +* [50 000 $ в месяц - не проблема, или Сколько на самом деле зарабатывают пентестеры](https://habr.com/ru/company/skillfactory/blog/548012/) +* [TWAPT - пентестим по-белому в домашних условиях](https://habr.com/ru/company/pentestit/blog/551978/) diff --git a/vidy-metody-urovni-testirovaniya/odnovremennoe-mnogopolzovatelskoe-testirovanie-concurrency-multi-user-testing.md b/vidy-metody-urovni-testirovaniya/odnovremennoe-mnogopolzovatelskoe-testirovanie-concurrency-multi-user-testing.md new file mode 100644 index 0000000..7e44561 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/odnovremennoe-mnogopolzovatelskoe-testirovanie-concurrency-multi-user-testing.md @@ -0,0 +1,13 @@ +# Одновременное / многопользовательское тестирование (Concurrency/Multi-user testing) + +Concurrency testing - это подвид нагрузочного тестирования, при котором проверяется поведение системы (веб-приложение, веб-страница или API) в момент, когда одновременно происходят два или более событий, или выполняется одновременный вход нескольких пользователей в систему с выполнением одного и того же действия. Во время теста наблюдаются и записываются определенные метрики, а также измеряется время отклика системы в периоды устойчивой большой нагрузки. Зачем оно нужно: + +* Определяет влияние одновременного доступа к одним и тем же записям базы данных, модулям или коду приложения; +* Определяет и измеряет уровень взаимоблокировки, блокировки и использования однопоточного кода и ограничения доступа к общим ресурсам; + +Concurrency Testing Techniques: Reviewing code, Static Analysis, Con testing, Reachability Testing, Fuzz Testing, Random testing, Extending [concolic testing](https://en.wikipedia.org/wiki/Concolic\_testing). + +Источники: + +* [Concurrency Testing: Challenges, Techniques & Process](https://www.softwaretestingclass.com/concurrency-testing-challenges-techniques-process/) +* [LoadView - Concurrent User Testing](https://www.loadview-testing.com/concurrent-user-testing/) diff --git a/vidy-metody-urovni-testirovaniya/osnovnye-vidy-testirovaniya-po.md b/vidy-metody-urovni-testirovaniya/osnovnye-vidy-testirovaniya-po.md new file mode 100644 index 0000000..81c8a53 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/osnovnye-vidy-testirovaniya-po.md @@ -0,0 +1,48 @@ +# Основные виды тестирования ПО + +_Тип тестирования (test type): Совокупность тестирующих действий, которая фокусируется на определенных показателях качества. (ГОСТ 56920) Прим.: в русскоязычной среде это “вид”._ + +* Функциональные виды («Что?» - проверяет весь функционал продукта): + * Функциональное тестирование (Functional testing) + * Тестирование взаимодействия (Interoperability testing) +* Нефункциональное («Как?»): + * Производительности (Performance) + * Тестирование емкости (Capacity testing) + * Нагрузочное (Load testing) + * Стрессовое (Stress testing) + * Масштабируемости (Scalability test) + * Объемное тестирование (Volume testing) + * Выносливости (Soak/Endurance testing) + * Устойчивости (Resilience testing) + * Стабильности/надежности (Stability / Reliability testing) + * Отказ и восстановление (Failover and Recovery testing) + * Эталонное и тестирование базовой версии (Benchmark and Baseline Testing) + * Тестирование безопасности (Security and Access Control testing) + * Удобство пользования (Usability testing) + * Тестирование доступности (Accessibility testing) + * Тестирование установки (Installation testing) + * Тестирование на соответствие (Conformance/Compliance testing) + * Конфигурационное (Configuration testing) + * Тестирование локализации, глобализации и интернационализации +* Связанное с изменениями: + * Регрессионное (Regression testing) + * Тест работоспособности (Sanity testing) + * Дымовое (Smoke testing) + +Вообще виды тестирования можно классифицировать по самым разным критериям, поэтому можно встретить и такие схемы: + +[Схема от Святослава Куликова](https://svyatoslav.biz/wp-pics/software\_testing\_classification\_ru.png) + [текстовая версия](https://docs.google.com/spreadsheets/d/13GVO1Bz5NnGDO1F7jIjyixodnjImQ6WxQyk-WnWNDpE/edit#gid=0) + +![http://1.bp.blogspot.com/-bs1YvlaxYm8/VESbKf7PTPI/AAAAAAAAIYM/6zwnNU1He4A/w1200-h630-p-k-no-nu/bd6dcbbb7d7c44a485b65ae29b4c0ae4%2B(1).jpeg](http://1.bp.blogspot.com/-bs1YvlaxYm8/VESbKf7PTPI/AAAAAAAAIYM/6zwnNU1He4A/w1200-h630-p-k-no-nu/bd6dcbbb7d7c44a485b65ae29b4c0ae4%2B\(1\).jpeg) + +![https://www.evkova.org/evkovaupload/job/144476/2.png](https://www.evkova.org/evkovaupload/job/144476/2.png) + +![https://static.tildacdn.com/tild3137-6364-4834-b738-353565626438/photo.png](https://static.tildacdn.com/tild3137-6364-4834-b738-353565626438/photo.png) + +Еще классификаций на десерт: exploratory vs scripted; traditional vs agile; testing vs checking; standards-driven vs context-driven; phased vs. threaded. + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) 5.6 Методики тестирования +* [Types of Testing - Software Testing Types Every QA Should Know](https://artoftesting.com/types-of-testing) +* [Phased vs Threaded Testing](https://medium.com/@AWGHodder/phased-vs-threaded-testing-c4a16057ca28) diff --git a/vidy-metody-urovni-testirovaniya/piramida-urovni-testirovaniya-test-pyramid-testing-levels.md b/vidy-metody-urovni-testirovaniya/piramida-urovni-testirovaniya-test-pyramid-testing-levels.md new file mode 100644 index 0000000..28f8b6f --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/piramida-urovni-testirovaniya-test-pyramid-testing-levels.md @@ -0,0 +1,27 @@ +# Пирамида / уровни тестирования (Test Pyramid / Testing Levels) + +«Пирамида тестов» - метафора, которая означает группировку динамических тестов программного обеспечения по разным уровням. Она также дает представление, какое количество тестов должно быть в каждой из этих групп. Основной принцип разделения уровней - тест должен быть на том же уровне, что и тестируемый объект. В тесте более высокого уровня вы не тестируете всю условную логику и пограничные случаи, которые уже покрыты тестами более низкого уровня. + +![](https://lh6.googleusercontent.com/yDN1s-lXbEFI5tsd429c2fT5DkHxfDNFpTotktfGZe2tdXVAdo218WSOksJIhBx5VDJffYvMOcadII\_r7ln-kvX4iKFuuQ75io5IEimepSLJq\_qkkZ\_JH5x5UfdSXdF2PqbBPqpV) + + Уровни тестирования: + +* Unit/component/program/module testing - тестируется минимально-атомарный модуль программы, чаще всего это одна функция или метод. Таких тестов должно быть больше всего; +* Integration testing - несколько модулей программы тестируются вместе; +* System testing - вся программа тестируется полностью; +* Acceptance testing - программа принимается заказчиком на соответствие заявленным требованиям либо тестировщики проходят end-to-end сценарии с точки зрения пользователя; + +Доп. материал: + +* [Test Pyramid](https://martinfowler.com/bliki/TestPyramid.html) +* [The Practical Test Pyramid](https://martinfowler.com/articles/practical-test-pyramid.html) + перевод на русский [Пирамида тестов на практике](https://habr.com/ru/post/358950/) +* [От песочных часов к пирамиде: как усовершенствовать структуру тестов](https://habr.com/ru/company/badoo/blog/652025/) +* [Just Say No to More End-to-End Tests](https://testing.googleblog.com/2015/04/just-say-no-to-more-end-to-end-tests.html) +* [How Much Testing is Enough?](https://testing.googleblog.com/2021/06/how-much-testing-is-enough.html) +* [Software Testing Anti-patterns](http://blog.codepipes.com/testing/software-testing-antipatterns.html) +* [Пирамида Автоматизации Тестирования: Версия 2021 года](https://telegra.ph/Piramida-Avtomatizacii-testirovaniya-Versiya-2021-goda-03-24) +* [Антипаттерны тестирования ПО](https://habr.com/ru/post/358178/) +* [Unit, API и GUI тесты - чем отличаются](https://telegra.ph/Unit-API-i-GUI-testy--chem-otlichayutsya-02-11) +* [Почему тестировать должны не только QA. Распределяем тест-кейсы между Dev, Analyst и QA](https://dou.ua/lenta/columns/test-cases-dev-qa-analyst/) +* [Пирамида тестирования на практике. Как работает QA в Jiji](https://dou.ua/lenta/columns/testing-in-jiji/) +* [Почему «осмысленное тестирование» - это важно?](https://habr.com/ru/post/650937/) diff --git a/vidy-metody-urovni-testirovaniya/priemochnoe-testirovanie-at-acceptance-testing.md b/vidy-metody-urovni-testirovaniya/priemochnoe-testirovanie-at-acceptance-testing.md new file mode 100644 index 0000000..32534f9 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/priemochnoe-testirovanie-at-acceptance-testing.md @@ -0,0 +1,28 @@ +# Приемочное тестирование (AT - Acceptance testing) + +_Приемочное тестирование (acceptance testing): Формальное тестирование по отношению к потребностям, требованиям и бизнес процессам пользователя, проводимое с целью определения соответствия системы критериям приемки и дать возможность пользователям, заказчикам или иным авторизированым лицам определить, принимать систему или нет. (IEEE 610)_ + +_Эксплуатационное приемочное тестирование (operational acceptance testing): Эксплуатационное тестирование в фазе приемочного тестирования, обычно выполняемое пользователем и/или сотрудниками с администраторским доступом, в рабочей среде (возможно, стимулированной), фокусируясь на функциональных аспектах. Например, восстанавливаемость, поведение ресурсов, устанавливаемость и техническое соответствие. (ISTQB)_ + +После того, как процесс тестирования системы завершен командой тестирования, весь продукт передается клиенту и/или нескольким его пользователям для проверки приемлемости (acceptability). Е2Е бизнес-потоки проверяются аналогично в сценариях в реальном времени. Подобная производственной среда будет тестовой средой для приемочного тестирования (Staging, Pre-Prod, Fail-Over, UAT environment). Это метод тестирования черного ящика, при котором проверяется только функциональность, чтобы убедиться, что продукт соответствует указанным критериям приемки. + +**Виды приемочного тестирования**: + +* **Пользовательское** приемочное тестирование (UAT - User Acceptance Testing, validation, end-user testing) выполняется пользователем или клиентом чтобы определить, может ли ПО быть принято (accepted) или нет и проверить ПО на соответствие бизнес-требованиям. Могут существовать такие бизнес-требования и процессы, которые известны только конечным пользователям, и они либо пропускаются, либо неправильно интерпретируются, поэтому приемочное тестирование выполняется конечными пользователями, знакомыми с бизнес-требованиями; +* **Бизнес -** приемочное тестирование (BAT - Business Acceptance Testing) необходимо для оценки того, соответствует ли Продукт бизнес-целям и задачам. BAT в основном фокусируется на бизнес-преимуществах (финансах), которые являются довольно сложными из-за меняющихся рыночных условий / прогрессирующих технологий, так что текущая реализация может претерпеть изменения, которые приведут к дополнительным затратам. Даже Продукт, отвечающий техническим требованиям, может не пройти BAT по этим причинам; +* **Контрактное** приемочное тестирование (CAT - Contract Acceptance Testing) - это контракт, который определяет, что после того, как Продукт будет запущен в течение заранее определенного периода, должен быть проведен приемочный тест, и он должен пройти все приемочные тест-кейсы. Подписанный здесь контракт называется Соглашением об уровне обслуживания (SLA), которое включает условия, по которым платеж будет производиться только в том случае, если услуги Продукта соответствуют всем требованиям, что означает, что контракт выполнен. Иногда этот контракт может заключаться до того, как Продукт будет запущен. В любом случае, контракт должен быть четко определен с точки зрения периода тестирования, областей тестирования, условий по проблемам, возникающим на более поздних этапах, платежей и т. д.; +* **Правовое** приемочное тестирование (RAT - Regulations/Compliance Acceptance Testing) необходимо для оценки того, нарушает ли Продукт правила и нормы, установленные правительством страны, в которой он выпускается. Это может быть непреднамеренным, но отрицательно скажется на бизнесе. Обычно разрабатываемый Продукт / приложение, предназначенный для выпуска во всем мире, должен пройти RAT, поскольку в разных странах / регионах действуют разные правила и положения, определенные его руководящими органами. Если какие-либо правила и нормы нарушаются для какой-либо страны, то этой стране или конкретному региону в этой стране не будет разрешено использовать Продукт и это будет считаться отказом (Failure). Вендоры Продукта несут прямую ответственность, если Продукт будет выпущен даже при наличии нарушения; +* **Эксплуатационное** приемочное тестирование ([OAT - Operational Acceptance testing](https://en.wikipedia.org/wiki/Operational\_acceptance\_testing)) - это тип тестирования программного обеспечения, который оценивает эксплуатационную готовность программного приложения до его выпуска в производство. Целью эксплуатационного тестирования является обеспечение бесперебойной работы системы в ее стандартной эксплуатационной среде (SOE - standard operating environment). В основном это тестирование восстановления, совместимости, ремонтопригодности, доступности технической поддержки, надежности, восстановления после сбоя, локализации и т. д (recovery, compatibility, maintainability, technical support availability, reliability, fail-over, localization); +* **Альфа-тестирование** ([Alpha Testing](https://www.softwaretestinghelp.com/alpha-testing/)) проводят для оценки продукта в среде разработки / тестирования специализированной командой тестировщиков, обычно называемой альфа-тестерами. Здесь отзывы и предложения тестировщиков помогают улучшить использование Продукта, а также исправить определенные ошибки; +* **Бета-тестирование, полевые испытания** ([Beta Testing](https://www.softwaretestinghelp.com/beta-testing/), Field Testing) проводят для оценки Продукта, предоставляя его реальным конечным пользователям, обычно называемым бета-тестерами / бета-пользователями, в их среде. Собирается постоянная обратная связь от пользователей, и проблемы устраняются. Кроме того, это помогает в улучшении Продукта, чтобы обеспечить удобство работы пользователей. Тестирование происходит неконтролируемым образом, что означает, что у пользователя нет ограничений на использование Продукта; + +Источники: + +* [What Is Acceptance Testing (A Complete Guide)](https://www.softwaretestinghelp.com/what-is-acceptance-testing/) +* [What Is User Acceptance Testing (UAT): A Complete Guide](https://www.softwaretestinghelp.com/what-is-user-acceptance-testing-uat/) + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.2 Подпроцесс приемочного испытания” +* [Business-facing tests](https://martinfowler.com/bliki/BusinessFacingTest.html) +* [Как проводить приемочное тестирование](https://www.youtube.com/watch?v=BKWgBk3gktw\&ab\_channel=Podlodka) diff --git a/vidy-metody-urovni-testirovaniya/raznica-testirovaniya-po-i-zheleza-software-vs.-hardware-testing.md b/vidy-metody-urovni-testirovaniya/raznica-testirovaniya-po-i-zheleza-software-vs.-hardware-testing.md new file mode 100644 index 0000000..bc32ed2 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/raznica-testirovaniya-po-i-zheleza-software-vs.-hardware-testing.md @@ -0,0 +1,31 @@ +# Разница тестирования ПО и железа (Software Vs. Hardware testing) + +**Программное обеспечение** ([Software](https://en.wikipedia.org/wiki/Software)) - это управляющий набор инструкций и данных. В информатике и разработке программного обеспечения программное обеспечение - это вся информация, обрабатываемая компьютерными системами, включая программы и данные. Программное обеспечение включает программы, библиотеки и связанные с ними неисполняемые данные, такие как онлайн-документация или цифровые носители. Программное обеспечение и оборудование требуют друг друга, и ни одно из них не может реально использоваться по отдельности. На самом низком уровне программирования исполняемый код состоит из инструкций машинного языка, поддерживаемых отдельным процессором - обычно центральным процессором (ЦП) или графическим процессором (ГП). Машинный язык состоит из групп двоичных значений, обозначающих инструкции процессора, которые изменяют состояние компьютера по сравнению с его предыдущим состоянием. + +**Аппаратное обеспечение** (Hardware) - это физическое электронное устройство, промышленное оборудование или компонент компьютера. Примерами оборудования компьютера являются CPU, MB, устройства ввода/вывода и хранения данных (HDD или SSD). Без оборудования программному обеспечению не на чем будет работать. Аппаратное и программное обеспечение взаимодействуют друг с другом, и программное обеспечение сообщает аппаратному обеспечению, какие задачи оно должно выполнять. + +**Разница в тестировании ПО и железа**: + +В глобальном смысле нам не сильно важна природа объекта тестирования, т.к. принципы особо не меняются. Однако, как говорится, есть нюансы: + +* “Железный” баг может легко физически безвозвратно сломать единственный рабочий прототип. Критерии отбора тестов должны учитывать и анализ рисков; +* Само взаимодействие с железом, как и снятие показателей результатов / метрик может потребовать дополнительное оборудование, физические модификации, а также почти наверняка инженерный ум и прямые руки из нужного места; +* Тесты программного обеспечения в отличии от тестов железа виртуальны, их можно копировать и переиспользовать и прогонять сколько потребуется. ПО можно легко изменить и развить с помощью нескольких релизов, в то время как оборудование требует более высоких затрат на изменение и не может быть подвергнуто рефакторингу после производства. Тестировщики должны понимать, что когда оборудование создается, они не могут добавлять к нему новые возможности. Таким образом, тесты подходят только для этой линейки оборудования, и для следующего продукта необходимо будет создать другой набор критериев оценки. Конструкции оборудования также значительно более ограничены из-за конкретных деталей или отраслевых рекомендаций; +* В результате первого различия существуют в тест-кейсах. При использовании кейсов для ПО для выполнения всех запланированных тестов может потребоваться от 50 до 100 шагов, это результат того, что нужно учесть бесчисленное множество вещей и высокого уровня автоматизации тестирования, связанного с гибкой разработкой программного обеспечения. Команды могут использовать инструменты тестирования качества, чтобы отслеживать эти операции и гарантировать, что все идет так, как ожидалось. С другой стороны, этапы тестирования оборудования намного короче и проще и включают всего несколько этапов, чтобы проверить, работает ли продукт. Во-первых, прошивка может быть проверена на исправность. Затем оборудование оценивается, чтобы убедиться, что оно хорошо интегрируется с другими системами и должным образом работает с необходимыми приложениями и операционными системами. Наконец, вся система оценивается по тому, насколько хорошо она соответствует требованиям заказчика и высокоуровневым спецификациям, таким как соответствие (compliance). Аппаратное обеспечение нельзя сильно менять перед выпуском, поэтому важно, чтобы группы выполняли полные тесты для выявления любых слабых мест, которые могут быть присущи продукту. +* Что касается программного обеспечения, управляющего оборудованием, здесь резко может возрасти необходимый технический уровень для тестирования (низкоуровневое понимание работы железа, связки с прошивкой, программирование микроконтроллеров, ассемблер и вот это всё): + * Embedded operating systems; + * Device driver and service testing; + * Multi threaded communications; + * Synchronising data from multiple external sources; + * Using data scopes to isolate errors (Hardware vs Software); + +Источники: + +* [Difference between Hardware and Software](https://www.guru99.com/hardware-vs-software-difference.html) +* [The Difference between Software Testing and Hardware Testing](https://www.techwell.com/techwell-insights/2017/03/difference-between-software-testing-and-hardware-testing?\_\_cf\_chl\_captcha\_tk\_\_=pmd\_dMswbG.OAQqO6tWy60YvKfgPLiHrKsEnWLd1kCA6LF0-1632916018-0-gqNtZGzNAxCjcnBszQjR) +* [software vs hardware testing](http://www.sqaforums.com/forums/general-discussion/43191-software-vs-hardware-testing.html) + +Доп. материал: + +* [Hardware vs Software Product Testing](https://medium.com/somiacx/hardware-vs-software-product-testing-7c61fb083ddf) +* [Siemens hardware and software testing solutions](https://www.plm.automation.siemens.com/global/en/products/simulation-test/testing.html) diff --git a/vidy-metody-urovni-testirovaniya/regressionnye-vidy-testirovaniya-regression-testing.md b/vidy-metody-urovni-testirovaniya/regressionnye-vidy-testirovaniya-regression-testing.md new file mode 100644 index 0000000..29231e2 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/regressionnye-vidy-testirovaniya-regression-testing.md @@ -0,0 +1,124 @@ +# Регрессионные виды тестирования (Regression testing) + +_Регрессионное тестирование (regression testing): Тестирование уже протестированной программы, проводящееся после модификации для уверенности в том, что процесс модификации не внес или не активизировал ошибки в областях, не подвергавшихся изменениям. Проводится после изменений в коде программного продукта или его окружении. (ISTQB)_ + +**Регресс** - это противоположность прогресса. Любое ПО по мере прогресса в функционале неизбежно усложняется, увеличиваются взаимосвязи в функциях и т.п., и чтобы убедиться в том, что в существующей системе не начинается регресс, полезно иногда проводить ее полное тестирование. И уж тем более логично перетестировать всё, что можно, если в систему были внесены какие-то существенные изменения. Но этого недостаточно. По-сути, проблема намного серьезнее - мы каждый раз не знаем, что принесет с собой новая функциональность в системе. Нам каждый раз надо предположить/узнать/протестировать новые взаимодействия в системе, а не тестировать только новые функции в изоляции от остальных. Старый функционал с новым если начинают пересекаться - надо заново расчехлять аналитику, выявлять новые ситуации, которые могут возникнуть, писать новые тест-кейсы, которые затрагивают уже не столько функциональные, сколько интеграционные аспекты. Поэтому выяснение "не наступил ли регресс" (внимание, не путать с "не наступила ли регрессия") - постоянная задача, которую также необходимо решать в контексте maintenance testing. + +**Регрессионное тестирование** (Regression Testing) - собирательное название для всех видов тестирования программного обеспечения связанных с изменениями, направленных на обнаружение ошибок в уже протестированных участках исходного кода, на проверку того, что новая функциональность не зааффектила (affect) старую. Такие ошибки - когда после внесения изменений в программу перестаёт работать то, что должно было продолжать работать, - называют регрессионными ошибками (regression bugs). Регрессионные тесты должны быть частью релизного цикла (Release Cycle) и учитываться при тестовой оценке (test estimation). + +При корректировках программы необходимо гарантировать сохранение качества. Для этого используется регрессионное тестирование - дорогостоящая, но необходимая деятельность в рамках maintenance testing, направленная на перепроверку корректности измененной программы. В соответствии со стандартным определением, регрессионное тестирование - это выборочное тестирование, позволяющее убедиться, что изменения не вызвали нежелательных побочных эффектов, или что измененная система по-прежнему соответствует требованиям. Регрессионное тестирование обычно проводится перед релизом новой версии приложения. Это происходит следующим образом: в течение какого-то времени делаются какие-то фичи и другие задачи, они тестируются по отдельности и сливаются в общую ветку (мастер/девелоп - чаще всего эта ветка называется в зависимости от процессов в проекте). Дальше, когда время подходит к релизу от ветки девелопа создается ветка релиза, из которой собирается релиз-кандидат и на нем уже проводят регресс. + +Главной задачей maintenance testing является реализация систематического процесса обработки изменений в коде. После каждой модификации программы необходимо удостовериться, что на функциональность программы не оказал влияния модифицированный код. Если такое влияние обнаружено, говорят о регрессионном дефекте. Для регрессионного тестирования функциональных возможностей, изменение которых не планировалось, используются ранее разработанные тесты. Одна из целей регрессионного тестирования состоит в том, чтобы, в соответствии с используемым критерием покрытия кода (например, критерием покрытия потока операторов или потока данных), гарантировать тот же уровень покрытия, что и при полном повторном тестировании программы. Для этого необходимо запускать тесты, относящиеся к измененным областям кода или функциональным возможностям. + +Другая цель регрессионного тестирования состоит в том, чтобы удостовериться, что программа функционирует в соответствии со своей спецификацией, и что изменения не привели к внесению новых ошибок в ранее протестированный код. Эта цель всегда может быть достигнута повторным выполнением всех тестов регрессионного набора, но более перспективно отсеивать тесты, на которых выходные данные модифицированной и старой программы не могут различаться. Важной задачей регрессионного тестирования является также уменьшение стоимости и сокращение времени выполнения тестов. + +Можно заключить, что регрессионное тестирование выполняется чтобы минимизировать регрессионные риски. То есть, риски того, что при очередном изменении продукт перестанет выполнять свои функции. С регрессионным тестированием плотно связана другая активность - импакт анализ (Impact Analysis, анализ влияния изменений). Итоговая область регрессии называется Regression Scope / Scope of Regression. + +**Классификация регрессионного тестирования**: + +* Проверить всё (Retest All): Как следует из названия, все тест-кейсы в наборе тестов повторно выполняются, чтобы гарантировать отсутствие ошибок, возникших из-за изменения кода. Это дорогостоящий метод, поскольку он требует больше времени и ресурсов по сравнению с другими методами; +* Минимизация набора тестов (test suite minimization) стремится уменьшить размер тестового набора за счет устранения избыточных тестовых примеров из тестового набора; +* Задача выбора теста (test case selection) связана с проблемой выбора подмножества тестов, которые будут использоваться для проверки измененных частей программного обеспечения. Для этого требуется выбрать подмножество тестов из предыдущей версии, которые могут обнаруживать неисправности, основываясь на различных стратегиях. Большинство задокументированных методов регрессионного тестирования сосредоточены именно на этой технике. Обычная стратегия состоит в том, чтобы сосредоточить внимание на отождествления модифицированных частей SUT (system under test) и для выбора тестовых случаев, имеющих отношение к ним. Например, техника полного повторного тестирования (retest-all) - один из наивных типов выбора регрессионного теста путем повторного выполнения всех видов тестов от предыдущей версии на новой. Она часто используется в промышленности из-за её простого и быстрого внедрения. Тем не менее, её способность обнаружения неисправностей ограничена. Таким образом, значительный объём работ связан с разработкой эффективных и масштабируемых селективных методов; +* Задача определения приоритетов теста (test case prioritization). Ее цели заключаются в выполнении заказанных тестов на основе какого-либо критерия. Например, на основе истории, базы или требований, которые, как ожидается, приведут к более раннему выявлению неисправностей или помогут максимизировать некоторые другие полезные свойства; +* Гибридный: Гибридный метод представляет собой комбинацию выборочного и приоритезации. Вместо того, чтобы выбирать весь набор тестов, выберите только те тест-кейсы, которые повторно выполняются в зависимости от их приоритета; + +**Типы регрессии по Канеру**: + +* Регрессия багов (Bug regression) - попытка доказать, что исправленная ошибка на самом деле не исправлена; +* Регрессия старых багов (Old bugs regression) - попытка доказать, что недавнее изменение кода или данных сломало исправление старых ошибок, т.е. старые баги стали снова воспроизводиться; +* Регрессия побочного эффекта (Side effect regression) - попытка доказать, что недавнее изменение кода или данных сломало другие части разрабатываемого приложения; + +**Регрессия в Agile**: + +В Agile продукт разрабатывается в рамках короткой итерации, называемой спринтом, которая длится 2-4 недели. В Agile существует несколько итераций, поэтому это тестирование играет важную роль, поскольку в итерациях добавляется новая функциональность или изменения кода. Набор регрессионных тестов должен быть подготовлен на начальном этапе и обновляться с каждым спринтом. В Agile проверки регрессии делятся на две категории: + +* Регрессия уровня спринта (Sprint Level Regression): выполняется в основном для новых функций или улучшений, внесенных в последний спринт. Тест-кейсы из набора тестов выбираются в соответствии с новыми добавленными функциями или сделанными улучшениями; +* Сквозная регрессия (End to End Regression): включает в себя все тест-кейсы, которые должны быть повторно выполнены для сквозного тестирования всего продукта, охватывая все основные функции; + +**Смоук тестирование (Smoke testing)** + +_Тест "на дым" (smoke test): Выборка из общего числа запланированных тестовых сценариев, покрывающая основную функциональность компонента или системы. Проводится с целью удостовериться, что базовые функции программы в целом работают корректно, без углубления в детали. Ежедневная сборка и тест "на дым" являются передовыми практическими методами. См. входной тест, тест верификации сборки. (ISTQB)_ + +_Тест верификации сборки (build verification test): Набор автоматических тестов, валидирующих целостность каждой новой сборки и верифицирующих ее ключевую/базовую функциональность, стабильность и тестируемость. Данный вид тестирования используется там, где присутствует высокая частота сборок (например, проекты с использованием гибких методологий разработки) и выполняется для каждой новой сборки перед передачей ее в тестирования. См. также регрессионное тестирование, тест "на дым". (ISTQB)_ + +Smoke testing, BVT - Build Verification Testing, BAT - Builds Acceptance Testing, Breath Testing, Shakeout/Shakedown Testing, Intake test, а также в русскоязычных вариантах дымовое, на дым, дымное, тестирование сборки и т.п. - это подмножество регрессионного тестирования, короткий цикл тестов, выполняемый для каждой новой сборки для подтверждения того, что ПО после внесенных изменений стартует и выполняет основные функции без критических и блокирующих дефектов. В случае отсутствия таковых дефектов Smoke testing объявляется пройденным, и команда QA может начинать дальнейшее тестирование полного цикла, в противном случае, сборка объявляется дефектной, что делает дальнейшее тестирование пустой тратой времени и ресурсов. В таком случае сборка возвращается на доработку и исправление. Smoke testing обычно используется для Integration, Acceptance and System Testing. + +Если мы говорим про сайт интернет-магазина, то сценарий может быть следующим: + +* Сайт открывается +* Можно выбрать случайный товар и добавить его в корзину +* Можно оформить и оплатить заказ + +Если мы говорим про мобильное приложение, например, messenger, то: + +* Приложение устанавливается и запускается +* Можно авторизоваться +* Можно написать сообщение случайном контакту + +Небольшая шпаргалка по степени важности: + +* **smoke** - самое важное. Тест-кейсы играют очень важную роль на этом уровне тестирования, поэтому предел метрик (metric limit) часто соответствует 100% или примерно 100%; +* **critical path** - повседневное. Тесты критического пути запускаются для проверки функциональности, используемой типичными пользователями в их повседневной деятельности. Есть много пользователей, которые обычно используют определенную часть функциональности приложения, которую необходимо проверить, как только smoke этап будет успешно завершен. Здесь лимит метрик немного ниже, чем у smoke, и соответствует 70-80-90% в зависимости от цели проекта; +* **extended** - все. Выполняется для изучения всей функциональности, указанной в требованиях. Проверяется даже функциональность с низким приоритетом. При этом в этом тестировании нужно понимать, какой функционал наиболее ценный, а какой менее важный. При условии, что у вас достаточно времени или других ресурсов, тесты на этом уровне можно использовать для требований с низким приоритетом; + +Примечание. В русском языке термин ошибочно переводят как проверка дыма, корректнее уж говорить “на дым”. [История термина:](https://ru.wikipedia.org/wiki/Smoke\_test) Первое свое применение этот термин получил у печников, которые, собрав печь, закрывали все заглушки, затапливали ее и смотрели, чтобы дым шел только из положенных мест. Повторное «рождение» термина произошло в радиоэлектронике. Первое включение нового радиоэлектронного устройства, пришедшего из производства, совершается на очень короткое время (меньше секунды). Затем инженер руками ощупывает все микросхемы на предмет перегрева. Сильно нагревшаяся за эту секунду микросхема может свидетельствовать о грубой ошибке в схеме. Если первое включение не выявило перегрева, то прибор включается снова на большее время. Проверка повторяется. И так далее несколько раз. Выражение «smoke-test» используется инженерами в шуточном смысле, так как появления дыма, а значит и порчи частей устройства, стараются избежать. + +**Санити тестирование (Sanity testing)** + +_Тест работоспособности (sanity test): См. тест "на дым". (ISTQB)_ + +Другие источники: + +Sanity testing также является подмножеством регрессионного тестирования и выполняется до или вместо полной регрессии, но после smoke. Эти два подвида похожи, но в целом Sanity используется на более стабильных билдах для определения работоспособности определенной части приложения после внесения изменений. + +Примечание. Санитарным это тестирование в русскоязычной среде назвалось по совершенно непонятным причинам, но гуглится только так. На самом же деле дословно переводится как тестирование на вменяемость / разумность / работоспособность / согласованность или по версии ISTQB “Тест работоспособности”. + +**Подтверждающее, повторное тестирование (**[**confirmation testing**](https://www.softwaretestingmaterial.com/confirmation-testing/)**,** [**re-testing**](https://www.softwaretestingmaterial.com/retesting/)**)** + +_Подтверждающее тестирование (confirmation testing): Тестирование, при котором выполняются тестовые сценарии, которые были не пройдены при последнем запуске, с целью подтвердить успешность исправлений. (ISTQB)_ + +Повторное тестирование - это тип тестирования, выполняемый в новой сборке по проваленному на старой сборке тест-кейсу с тем же окружением и данными, для проверки того, что этот дефект теперь устранен. Ре-тест выполняется перед sanity-тестированием, приоритет ре-теста выше регрессионных проверок, поэтому оно должно выполняться перед ними. + +**Тестирование N+1 (N+1 testing)** + +Вариант регрессионного тестирования представлен как N+1. В этом методе тестирование выполняется в несколько циклов, в которых ошибки, обнаруженные в тестовом цикле «N», устраняются и повторно тестируются в тестовом цикле N + 1. Цикл повторяется, пока не будет найдено ни одной ошибки. + +**Разница между повторным и регрессионным тестированием:** + +* Регрессионное тестирование проводится для подтверждения того, что недавнее изменение программы или кода не оказало неблагоприятного воздействия на существующие функции. Повторное тестирование проводится для подтверждения того, что тест-кейсы, которые не прошли, проходят после устранения дефектов; +* Цель регрессионного тестирования подтвердить, что новые изменения кода не должны иметь побочных эффектов для существующих функций. Повторное тестирование проводится на основе исправлений дефектов.; +* Проверка дефектов не является частью регрессионного тестирования. Проверка дефекта является частью повторного тестирования; +* В зависимости от проекта и наличия ресурсов, регрессионное тестирование может проводиться параллельно с повторным тестированием. Приоритет повторного тестирования выше, чем регрессионное тестирование, поэтому оно проводится перед регрессионным тестированием; +* Регрессионное тестирование называется общим (generic) тестированием. Повторное тестирование - это плановое (planned) тестирование; +* Регрессионное тестирование проводится для пройденных Test case. Повторное тестирование проводится только для неудачных тестов; +* Регрессионное тестирование проверяет наличие неожиданных побочных эффектов. Повторное тестирование гарантирует, что первоначальная ошибка была исправлена; +* Test case для регрессионного тестирования могут быть получены из функциональной спецификации, user tutorials and manuals, а также defect reports в отношении исправленных проблем. Test case для повторного тестирования не могут быть получены до начала тестирования; + +**Может ли быть ситуация, когда регрессия проводится не после изменений в коде?** + +Да, в ситуациях с внешними факторами: изменения в БД, версии ОС и т.п. + +Источники: + +* [Maintenance, Regression testing and Re-testing](https://software-testing.ru/forum/index.php?/topic/31783-maintenance-regression-testing-and-re-testing/) +* [Регрессионное тестирование](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5\_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) +* [Тестировщики нужны - пост “Регресс для самых маленьких”](https://t.me/qa\_chillout/92) +* [QA Outsourcing: Smoke Testing, Critical Path Testing, Extended Testing](https://testing-companies.com/qa-outsourcing-smoke-testing-critical-path-testing-extended-testing/) +* [What Is Regression Testing? Definition, Tools, Method, And Example](https://www.softwaretestinghelp.com/regression-testing-tools-and-methods/) +* [В чём разница Smoke, Sanity, Regression, Re-test и как их различать?](https://habr.com/ru/post/358142/) +* [Difference Between Retesting and Regression Testing](https://www.guru99.com/re-testing-vs-regression-testing.html) +* [Top 150 Software Testing Interview Questions and Answers for Freshers and Experienced](https://www.guru99.com/software-testing-interview-questions.html) + +Дополнительный материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.6 Подпроцесс регрессионного тестирования”, “D.7 Подпроцесс повторного тестирования” +* [Лекция 11: Регрессионное тестирование: цели и задачи, условия применения, классификация тестов и методов отбора](https://intuit.ru/studies/courses/48/48/lecture/1444?page=1) +* [Black Box Software Testing PART 11 - REGRESSION TESTING by Cem Kaner](http://testingeducation.org/k04/bbst11\_2004.pdf) + [2005 year version](https://present5.com/black-box-software-testing-spring-2005-regression-testing/) +* [Епифанов Н. А. - Методы реализации регрессионного тестирования по расширенным тестовым наборам](https://elib.spbstu.ru/dl/577.pdf/view) +* [Anti-Regression Approaches: Impact Analysis and Regression Testing Compared and Combined - Part I: Introduction and Impact Analysis](https://gerrardconsulting.com/blog/2010/04/anti-regression-approaches-impact-analysis-and-regression-testing-compared-and-combined-part-i-introduction-and-impact-analysis/) +* [Anti-Regression Approaches - Part II: Regression Prevention and Detection Using Static Techniques](https://gerrardconsulting.com/blog/category/impact\_analysis/) +* [Как сохранить нервы тестировщика или ускорить регресс с 8 до 2 часов](https://habr.com/ru/company/vivid\_money/blog/559024/#habracut) +* [Регрессионное тестирование или Regression Testing](https://intellect.icu/regressionnoe-testirovanie-ili-regression-testing-6093) +* [QA Outsourcing: Smoke Testing, Critical Path Testing, Extended Testing](https://testing-companies.com/qa-outsourcing-smoke-testing-critical-path-testing-extended-testing/) +* [Антирегрессионное тестирование - минимизируйте затраты](https://habr.com/ru/company/typeable/blog/583062/) +* [Способы сокращения регрессионного тестирования](https://www.youtube.com/watch?v=pEJfP52GWTg) diff --git a/vidy-metody-urovni-testirovaniya/sistemnoe-testirovanie-system-testing.md b/vidy-metody-urovni-testirovaniya/sistemnoe-testirovanie-system-testing.md new file mode 100644 index 0000000..5e07dc9 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/sistemnoe-testirovanie-system-testing.md @@ -0,0 +1,54 @@ +# Системное тестирование (System Testing) + +Системное тестирование означает тестирование всей системы в целом, оно выполняется после интеграционного тестирования, чтобы проверить, работает ли вся система целиком должным образом. В основном это тестирование типа «черный ящик», которое оценивает работу системы с точки зрения пользователя с помощью документа спецификации и оно не требует каких-либо внутренних знаний о системе, таких как дизайн или структура кода. + +**Основное внимание уделяется следующему**: + +* Внешние интерфейсы; +* Многопрограммность и сложный функционал; +* Безопасность; +* Восстановление; +* Производительность; +* Гладкое (smooth) взаимодействие оператора и пользователя с системой; +* Возможность установки; +* Документация; +* Удобство использование; +* Нагрузка / стресс; + +**Зачем нужно системное тестирование**? + +* Очень важно завершить полный цикл тестирования, и ST - это этап, на котором это делается; +* ST выполняется в среде, аналогичной production environment, и, следовательно, заинтересованные стороны могут получить хорошее представление о реакции пользователя; +* Это помогает свести к минимуму устранение неполадок после развертывания и количество обращений в службу поддержки; +* На этом этапе STLC тестируются архитектура приложения и бизнес-требования. Это тестирование очень важно, и оно играет важную роль в предоставлении клиенту качественного продукта; + +**Критерии начала системного тестирования**: + +* Система должна соответствовать критериям окончания интеграционного тестирования, то есть все test cases должны быть выполнены, и не должно быть открытых критических ошибок или ошибок с приоритетом P1, P2; +* System Test Plan должен быть одобрен и подписан; +* Test cases/scenarios/scripts должны быть готовы к выполнению; +* Все нефункциональные требования должны быть доступны, и для них должны быть созданы test cases; +* Среда тестирования должна быть готова; + +**Критерии окончания системного тестирования**: + +* Все test cases должны быть выполнены; +* В открытом состоянии не должно быть критических, приоритетных или связанных с безопасностью ошибок; +* Если какие-либо ошибки со средним или низким приоритетом находятся в открытом состоянии, они должны быть исправлены с согласия клиента; +* Отчет о выходе (Exit Report) должен быть отправлен; + +**Чем отличается системное тестирование от сквозного** (E2E - end-to-end testing)? + +Сквозное тестирование - это методология тестирования программного обеспечения для тестирования flow приложения от начала до конца. Целью сквозного тестирования является моделирование реального пользовательского сценария и проверка тестируемой системы и ее компонентов на предмет интеграции и целостности данных. + +Системное тестирование - этап предпоследний этап STLC и уровень тестирования, а E2E - подход к тестам. Обычно сквозные тесты выполняют после системного тестирования и перед приемочным, а также после внесения изменений (smoke и regression). E2E выполняется от начала до конца в реальных сценариях, таких как взаимодействие приложения с оборудованием, сетью, базой данных и другими приложениями. Основная причина проведения этого тестирования - определение различных зависимостей приложения, а также обеспечение передачи точной информации между различными компонентами системы. + +Источники: + +* [What Is System Testing - A Ultimate Beginner’s Guide](https://www.softwaretestinghelp.com/system-testing/) +* [What Is End To End Testing: E2E Testing Framework With Examples](https://www.softwaretestinghelp.com/what-is-end-to-end-testing/#Why\_Do\_We\_Perform\_E2E\_Testing) + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.10 Подпроцесс тестирования системы” +* [Лекция 7: Разновидности тестирования: системное и регрессионное тестирование](https://intuit.ru/studies/courses/48/48/lecture/1436) diff --git a/vidy-metody-urovni-testirovaniya/staticheskoe-i-dinamicheskoe-testirovanie-static-testing-dynamic-testing.md b/vidy-metody-urovni-testirovaniya/staticheskoe-i-dinamicheskoe-testirovanie-static-testing-dynamic-testing.md new file mode 100644 index 0000000..c687920 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/staticheskoe-i-dinamicheskoe-testirovanie-static-testing-dynamic-testing.md @@ -0,0 +1,14 @@ +# Статическое и динамическое тестирование (Static Testing, Dynamic Testing) + +_Тестирование, как статическое так и динамическое, должно быть направлено на получение обоих типов подтверждения (верификация и валидация), хотя и должно допускать, что подтверждение не будет получено немедленно из-за обнаружения дефектов. (ГОСТ 56920)_ + +**Статическое тестирование** (Static Testing, Non-execution technique или verification) подразумевает проверку вручную или с помощью инструментов программного кода без его запуска, а также проверку документации. + +Почему требуется статическое тестирование: + +* Обнаружение ошибок / недостатков на ранних этапах: при создании ПО нельзя полагаться исключительно на динамическое тестирование, поскольку оно выявляет ошибки или недостатки программного продукта на более позднем этапе, что может стоить разработчикам много времени и усилий для отладки; +* Увеличение размера ПО: по мере увеличения размера программного продукта становится трудно справиться с ним, поскольку эффективность покрытия кода снижается; +* Динамическое тестирование занимает много времени: несмотря на то, что динамическое тестирование выявляет ошибку и предоставляет некоторые подробности относительно ошибки, исправление ошибки по-прежнему требует времени и усилий, поскольку оно включает в себя обнаружение сбоя от тестового примера до основной причины, что в целом усложняет процесс; +* Динамическое тестирование дорогое: как упоминалось ранее, для динамического тестирования требуются тестовые примеры, и выполнение этого само по себе является дорогостоящим, потому что тестовые примеры должны быть сначала созданы, затем выполнены и проверены, а также должны поддерживаться, что требует большой работы со стороны тестировщиков; + +**Динамическое тестирование** (Dynamic Testing, Execution technique или validation) подразумевает запуск кода для проведения функциональных и нефункциональных проверок ПО. Основная цель этого тестирования - подтвердить, что программный продукт работает в соответствии с требованиями бизнеса. Преимуществами динамического тестирования являются выявление сложных дефектов, которые не могут быть обнаружены статическим тестированием, обнаружение угроз безопасности, проблем с производительностью и т.п. diff --git a/vidy-metody-urovni-testirovaniya/stressovoe-testirovanie-stress-testing.md b/vidy-metody-urovni-testirovaniya/stressovoe-testirovanie-stress-testing.md new file mode 100644 index 0000000..6f4935f --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/stressovoe-testirovanie-stress-testing.md @@ -0,0 +1,41 @@ +# Стрессовое тестирование (Stress testing) + +_Стрессовое тестирование (stress testing): Вид тестирования производительности, оценивающий систему или компонент на граничных значениях рабочих нагрузок или за их пределами, или же в состоянии ограниченных ресурсов, таких как память или доступ к серверу. (IEEE 610)_ + +_Стрессовое тестирование (stress testing): Тип тестирования уровня производительности, проводимого для оценки поведения элемента тестирования при условиях загрузки, выше ожидаемой или указанной в требованиях к производительности, или при доступности ресурсов, ниже минимальной, указанной в требованиях. (ГОСТ 56920)_ + +Стрессовое тестирование выполняется самым первым, если нет отдельного Capacity тестирования, хотя по факту это все равно будет Capacity, т.к. нагрузка берется «с потолка». Стресс-тестирование - это отрицательное / негативное тестирование, которые проводят при больших нагрузках или нагрузках, выходящих за допустимые пределы, чтобы определить поведение системы при таких обстоятельствах, точку отказа системы (числовые показатели метрик), показываются ли корректные ошибки при этом и не теряются ли данные. Это тестирование также называют Fatigue testing. + +![](https://lh3.googleusercontent.com/aIJG3A1Mujx5ChXCbyeoY7SBwy06KdJSOjREYmcbiBXJdUdBDMxypKzoxodqx3l4JU7ouVi2zLrmZw8OSOHy\_QxwxuYZc2qh65G2VOhuqVSrponf-MQNWmAFGwacN8luIGCaoRmc) + +**Виды стресс-тестирования**: + +* Распределенное стресс-тестирование: тесты выполняются для всех клиентов с сервера для отслеживания их статуса, а также для выявления сбоев из-за чрезмерного стресса; +* Стресс-тестирование приложения: основное внимание в этом тестировании уделяется обнаружению дефектов в программном обеспечении, связанных с блокировкой данных (locking and blocking), проблемами сети и узкими местами производительности; +* Транзакционное стресс-тестирование: транзакционное тестирование выполняет стресс-тестирование одной или нескольких транзакций между различными программными продуктами или приложениями. Его основная цель - точная настройка и оптимизация системы для повышения ее производительности; +* Систематическое стресс-тестирование: интегрированное стресс-тестирование, систематическое стресс-тестирование, используется для тестирования нескольких систем, работающих на одном сервере. Это позволяет группе тестирования обнаруживать дефекты, когда данные одного программного обеспечения блокируют другое программное обеспечение; +* Исследовательское стресс-тестирование: используется для тестирования системы в необычных условиях, которые маловероятны в реальном сценарии. Эти сценарии стресс-тестирования позволяют группе обнаруживать различные необнаруженные проблемы и ошибки в системе; + +**Подход / процесс** содержит те же этапы, что описаны в нагрузочном, и то же самое в остальных подвидах, поэтому дублировать нет смысла. + +**Примеры**: + +* Стресс-тест банковской системы был остановлен при превышении отметки в 1500 пользователей, когда высокая загруженность процессора (более 80%) привела к увеличению среднего времени отклика в пять раз и массовому появлению ошибок HTTP(S); +* MS Word может выдать сообщение об ошибке «Не отвечает» при попытке скопировать файл размером 7-8 ГБ. Вы засыпали Word файлом огромного размера, и он не смог обработать такой большой файл, и в результате он завис; +* Когда большое количество пользователей одновременно получают доступ к логину / регистрации; +* Когда несколько пользователей пытаются загрузить один файл одновременно; +* База данных отключается, когда к ней обращается большое количество пользователей; +* Много пользователей заходят на веб-сайт, в то время как на сервере запускается сканирование на вирусы; +* Огромный объем данных копируется из буфера обмена и сохраняется в веб-форме большим количеством пользователей одновременно; +* Огромное количество пользователей одновременно нажимают кнопку «Добавить в корзину» на сайте покупок; + +**Пиковое тестирование** (Spike Testing) - это разновидность стресс-тестирования, проводится для проверки характеристик производительности, когда тестируемая система подвергается моделям рабочей нагрузки и объемам нагрузки, которые многократно увеличиваются за пределы ожидаемых производственных операций в течение коротких периодов времени. Обычно продолжительность теста составляет 1 час; он может отличаться в зависимости от вашего SLA / требований. + +[![](https://lh6.googleusercontent.com/cRXWK4ggaKSeH2nEPSPW3mGhAVi5DCuMmwmF2RgbnyAWo3homOIgRMjLrQihhjlBHUMZic9E80U44gYmbCnQ2v3lKJrlfSpANp2rGHSmxNhh15yVkaiWPyQZ74TrzcUceZ2513ZR)](https://1.bp.blogspot.com/-JejjJzmeIVs/WGpFkuprnzI/AAAAAAAAAh8/bzZN9uAtgNARNRnZknIl\_7\_cH0f3f52-wCLcB/s1600/STG.JPG) + +Источники: + +* [What is Stress Testing?](https://blog.testlodge.com/what-is-stress-testing/) +* [Stress Testing](https://www.professionalqa.com/stress-testing) +* [Stress Testing Guide For Beginners](https://www.softwaretestinghelp.com/stress-testing/) +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) diff --git a/vidy-metody-urovni-testirovaniya/svobodnoe-intuitivnoe-testirovanie-adhoc-ad-hoc-testing.md b/vidy-metody-urovni-testirovaniya/svobodnoe-intuitivnoe-testirovanie-adhoc-ad-hoc-testing.md new file mode 100644 index 0000000..614e8fb --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/svobodnoe-intuitivnoe-testirovanie-adhoc-ad-hoc-testing.md @@ -0,0 +1,43 @@ +# Свободное / Интуитивное тестирование (Adhoc, Ad-hoc Testing) + +_Свободное тестирование (ad hoc testing): Тестирование, выполняемое неформально; без формальной подготовки тестов, формальных методов проектирования тестов, определения ожидаемых результатов и руководства по выполнению тестирования. (ISTQB)_ + +_Парное тестирование (pair testing): Два человека (двое тестировщиков, разработчик и тестировщик, или конечный пользователь и тестировщик), работающих вместе над поиском дефектов. Обычно они работают за одним компьютером, в течение работы, передавая управление друг другу. (ISTQB)_ + +Свободное тестирование (ad-hoc testing) - это вид тестирования, который выполняется без подготовки к тестированию продукта, без определения ожидаемых результатов, проектирования тестовых сценариев. Это неформальное, импровизационное тестирование. Оно не требует никакой документации, планирования, процессов, которых следует придерживаться при выполнении тестирования. Такой способ тестирования в большинстве случаев дает большее количество заведенных отчетов об ошибке. Это обусловлено тем, что тестировщик на первых шагах приступает к тестированию основной функциональной части продукта и выполняет как позитивные, так и негативные варианты возможных сценариев. + +Чаще всего такое тестирование выполняется, когда владелец продукта не обладает конкретными целями, проектной документацией и ранее поставленными задачами. При этом тестировщик полагается на свое общее представление о продукте, сравнение с похожими продуктами, собственный опыт. Однако при тестировании ad-hoc тестировщик должен иметь полные знания и осведомленность о тестируемой системе, особенно если проект очень сложный и большой. Поэтому нужно хорошее представление о целях проекта, его назначении, основных функциях и возможностях. + +**Виды свободного тестирования** (ad-hoc testing): + +* Buddy testing - процесс, когда 2 человека, как правило разработчик и тестировщик, работают параллельно и находят дефекты в одном и том же модуле тестируемого продукта. Сразу после того, как разработчик завершает модульное тестирование, тестировщик и разработчик вместе работают над модулем. Этот вид тестирования позволяет обеим сторонам рассматривать эту функцию в более широком масштабе. Разработчик получит представление обо всех различных тестах, выполняемых тестером, а тестировщик получит представление о том, какова внутренняя конструкция, которая поможет ему избежать разработки недействительных сценариев; +* Pair testing - в этом тестировании два тестировщика (лучше с разным опытом) работают вместе над одним модулем. Идея, лежащая в основе этой формы тестирования состоит в том, чтобы заставить двух тестировщиков провести мозговой штурм идей и методов, чтобы выявить ряд дефектов. Оба могут разделять работу по тестированию и делать необходимую документацию по всем сделанным наблюдениям; +* Monkey testing - произвольное тестирование продукта с целью как можно быстрее, используя различные вариации входных данных, нарушить работу программы или вызвать ее остановку (простыми словами - сломать); + +**Основные преимущества ad-hoc testing**: + +* нет необходимости тратить время на подготовку документации; +* самые важные дефекты зачастую обнаруживаются на ранних этапах; +* часто применяется, когда берут нового сотрудника. С помощью этого метода, человек усваивает за 3 дня то, что, разбираясь тестовыми случаями, разбирал бы неделю - это называется форсированное обучение новых сотрудников; +* возможность найти трудновоспроизводимые и трудноуловимые дефекты, которые невозможно было бы найти, используя стандартные сценарии проверок; + +| Adhoc Testing | Exploratory Testing | +| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| Начинается с изучения приложения, а затем - с фактического процесса тестирования | Начинается с тестирования приложения, а затем его понимания посредством исследования | +| Самостоятельный вид тестирования | Разновидность Adhoc Testing | +| Не требуется никакой документации | Обязательно наличие документации по деталям тестирования. | +| Adhoc Testing проводят тестировщики, обладающие глубокими знаниями о приложении | Для изучения приложения не обязательно иметь эксперта. | +| Тестирование начинается после того, как будут собраны все данные для проведения тестирования | Сбор данных и тестирование происходят одновременно. | +| Это работает для отрицательных сценариев тестирования | В основном это касается положительных сценариев | +| Ориентировано на улучшение процесса тестирования | Ориентировано на изучение приложения | +| Зависит от творческих способностей и интуиции тестировщика | Зависит от любопытства и понимания тестировщика | +| Нет ограничений по времени | Это ограниченный по времени метод | + +Источники: + +* [Ad-Hoc Testing: How To Find Defects Without A Formal Testing Process](https://www.softwaretestinghelp.com/ad-hoc-testing/) +* [Adhoc Testing Guide - What You Should Know](https://www.softwaretestingmaterial.com/adhoc-testing/) + +Доп. материал: + +* [Что такое ad-hoc тестирование?](https://testengineer.ru/chto-takoe-ad-hoc-testirovanie/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-api-api-application-programming-interface.md b/vidy-metody-urovni-testirovaniya/testirovanie-api-api-application-programming-interface.md new file mode 100644 index 0000000..03ae1e6 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-api-api-application-programming-interface.md @@ -0,0 +1,120 @@ +# Тестирование API (API - Application Programming Interface) + +Каждый день используя любимые мобильные приложения и веб-ресурсы вы незаметно взаимодействуете с API, скрытым под интерфейсом пользователя. + +API действует как интерфейс между двумя программными приложениями и позволяет им связываться друг с другом на оговоренных правилах и не залезая в реализацию предоставляемых функций, при том правила - не договоренность, а контракт. Простой пример: вы можете встроить на свою главную страницу сайта маленький виджет прогноза погоды, который будет отправлять определенный правилами запрос к API некоего сервиса погоды и получать определенный правилами ответ, содержащий посылку с данными. + +Еще более простой пример: примите официанта в качестве API ресторана. В ресторане вы даете заказ на основе блюд, определенных в меню. Официант принимает ваш заказ и на этом ваше участие заканчивается и вам не интересно, что там произойдет дальше. От официанта вы ожидаете только итог - вам приносят заказанное блюдо. + +Можете попробовать взаимодействие с API сами: отправляете GET запрос на [https://reqres.in/api/users](https://reqres.in/api/users), и получаете в ответ список пользователей. Это очень удобно, когда вы хотите предоставить интерфейс взаимодействия со своим сервисом сторонним лицам. Например, у google, instagram, vk и, в общем-то, всех популярных продуктов есть открытая часть API. То есть у вас есть документ с перечнем того, что и как можно спросить и что вам на это придет в ответ. Взаимодействовать с API можно и с веб-страницы, и с помощью специальных инструментов и напрямую из кода. Помимо прочего, API бывает не только в контексте сетей, например, в той же системе Android есть внутреннее системное API. + +**Тестирование API** - это тип тестирования (хотя правильнее наверное сказать не тип или вид, а еще один вариант взаимодействия с системой) который включает в себя тестирование API напрямую, а также в рамках интеграционного тестирования, чтобы проверить, соответствует ли API ожиданиям с точки зрения функциональности, надежности, производительности и безопасности приложения. В тестировании API наш основной упор будет сделан на уровне бизнес-логики архитектуры программного обеспечения. + +![https://cdn-images-1.medium.com/fit/t/1600/480/0\*xP5HjXhJk383Jkyz.png](https://cdn-images-1.medium.com/fit/t/1600/480/0\*xP5HjXhJk383Jkyz.png) + +Типы тестирования API: + +* Unit testing: Для проверки функциональности отдельной операции; +* Functional testing: Чтобы проверить функциональность более широких сценариев с помощью блока результатов unit-тестирования, протестированных вместе; +* Load testing: Чтобы проверить функциональность и производительность под нагрузкой; +* Runtime/Error Detection: Мониторинг приложения для выявления проблем, таких как исключения и утечки ресурсов; +* Security testing: Чтобы гарантировать, что реализация API защищена от внешних угроз; +* UI testing: Это выполняется как часть end-to-end integration тестов, чтобы убедиться, что каждый аспект пользовательского интерфейса функционирует должным образом; +* Interoperability and WS Compliance testing: Совместимость и WS Compliance testing - это тип тестирования, который применяется к SOAP API. Функциональная совместимость между API-интерфейсами SOAP проверяется путем обеспечения соответствия профилям функциональной совместимости веб-служб. Соответствие WS- \* проверено, чтобы гарантировать, что стандарты, такие как WS-Addressing, WS-Discovery, WS-Federation, WS-Policy, WS-Security и WS-Trust, должным образом реализованы и используются; +* Penetration testing: Чтобы найти уязвимости при атаках злоумышленников; +* Fuzz testing: Для проверки API путем принудительного ввода в систему некорректных данных для попытки принудительного сбоя; +* Usability testing: проверяет, является ли API функциональным и удобным для пользователя и хорошо ли интегрируется с другой платформой; +* Documentation testing: команда тестирования должна убедиться, что документация соответствует требованиям и предоставляет достаточно информации для взаимодействия с API. Документация должна быть частью окончательного результата; + +**Примеры проблем, которые обнаруживает тестирование API:** + +* Некорректная обработка условий ошибки; +* Неиспользуемые флаги; +* Отсутствующие или повторяющиеся функции; +* Вопросы надежности; +* Сложность подключения и получения ответа от API; +* Проблемы с безопасностью; +* Проблемы с многопоточностью; +* Проблемы с производительностью. Время отклика API очень велико; +* Неправильные ошибки / предупреждение вызывающему абоненту; +* Неправильная обработка допустимых значений аргументов; +* Данные ответа неправильно структурированы (JSON или XML); + +**Контрактное тестирование API** + +В общем случае контрактное тестирование или Consumer Driven Contract (CDC) является связующим звеном между модульным и интеграционным тестированием. + +Каждый интерфейс имеет поставщика (supplier) и потребителя (consumer). Само собой, сервисы поставщика и потребителя распределены между разными командами, мы оказываемся в ситуации, когда четко прописанный интерфейс между ними (или контракт) просто необходим. Обычно многие подходят к этой проблеме следующим образом: + +* Пишут подробное описание спецификации интерфейса - контракт; +* Реализуют сервис поставщика согласно спецификации; +* Передают спецификацию интерфейса потребителю; +* Ждут реализации от другой стороны; +* Запускают ручные системные тесты, чтобы всё проверить; +* Держат кулачки, что обе стороны будут вечно соблюдать описанный интерфейс; + +Сегодня многие компании заменили последние два шага на автоматизированные контрактные тесты, которые регулярно проверяют соответствие описания и реализации у поставщика и потребителя определенного контракта. Что является набором регрессионных тестов, которые обеспечивают раннее обнаружение отклонения от контракта. + +Разберемся во взаимодействии на примере REST архитектуры: поставщик создает API c некоторым endpoint, а потребитель отправляет запрос к API, например, с целью получения данных или выполнения изменений в другом приложении. Это контракт, который описывается с помощью DSL (domain-specific language). Он включает API описание в форме сценариев взаимодействия между потребителем и поставщиком. С помощью CDC выполняется тестирование клиента и API с использованием заглушек, которые собираются на основе контракта. Основной задачей CDC является сближение восприятия между командами разработчиков API и разработчиков клиента. Таким образом, участники команды потребителей пишут CDC тесты (для всех данных проекта разработки), чтобы команда поставщика смогла запустить тесты и проверить API. В итоге команда поставщика с легкостью разработает свой API, используя тесты CDC. Результатом прогона контрактных тестов является понимание, что поставщик уверен в исправной работе API у потребителя. Следует обратить внимание, что команда потребителя должна регулярно осуществлять поддержку CDC-тестов при каждом изменении, и вовремя передавать всю информацию команде поставщика. Если регулярно фиксируем неудачно выполненные CDC-тесты, то следует пойти (в буквальном смысле слова, к пострадавшей стороне теста и узнать, в рамках какой задачи были изменения (что привело к падению теста). + +Из того, что было описано выше, можно выделить следующие тезисы для выполнения контрактного тестирования: + +* Команда разработчиков (тестировщиков) со стороны потребителей пишет автоматизированные тесты с ожидаемыми параметрами со стороны потребителей. +* Тесты передаются команде поставщика. +* Команда поставщика запускает контрактные тесты и проверяет результат их выполнения. Если происходит падение тестов, то команды должны зафиксировать сбой и перепроверить документацию (согласованность разработки). + +Минусы CDC: + +* CDC тесты не заменяют E2E тесты. По факту я склонен отнести CDC к заглушкам, которые являются моделями реальных компонентов, но не являются ими, т.е. это еще одна абстракция, которую нужно поддерживать и применять в нужных местах (сложно реализовать сложные сценарии); +* CDC тесты не заменяют функциональные тесты API. Лично придерживаюсь золотого правила - если убрать контракт и это не вызывает ошибки или неправильную работу клиента, то значит он не нужен. Пример: Нет необходимости проверять все коды ошибок через контракт, если клиент обрабатывает их (ошибки) одинаково. Таким образом контракт то, что важно для клиента сервиса, а не наоборот; +* CDC тесты дороже в поддержке, чем функциональные тесты; +* Для реализации CDC-тестов нужно использовать (изучать) отдельные инструменты тестирования - Spring Cloud Contract, PACT; + +**Отличие API от SDK**: + +SDK (software development kit) - это набор функционала (библиотек) и утилит для разработки. Собственно SDK и предоставляет реализацию некоторого API, это оболочка API's, которая упрощает работу для разработчиков. + +* API: набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением для использования во внешних программных продуктах. Это интерфейс, похоже на спецификацию телефонной системы или электропроводки в вашем доме. Это список того, что можно вызывать и какого ждать результата; +* SDK: набор реальных инструментов внедрения. Это как чемодан деталей и инструментов, который позволяет вам подключиться к телефонной системе или электрической проводке. Это библиотеки, в которых реализованы вызываемые функции + файлы необходимые для подключения этих библиотек; + +**Тестирование API без документации/черным ящиком**: + +Если Вам по какой-то причине предстоит проделать эту неблагодарную работу, определитесь, насколько все плохо и какая у Вас есть информация об объекте тестирования. Известно ли какие порты для Вас открыты? Знаете ли Вы нужные endpoints? Если дело совсем плохо - просканируйте порты, например, с помощью netcat. Открытые порты сохраните в файл. Эта операция займет довольно много времени. Можете почитать советы по работе с Nmap и Netcat. Если Вам известен нужный порт и соответствующий endpoint - переберите все возможные HTTP методы. Начните с наиболее очевидных POST, PUT, GET. Для ускорения процесса напишите скрипт, например, на Python.В худшем случае, когда ни порт ни endpoints неизвестны Вам, скорее всего придется перебирать все открытые порты и генерировать endpoints, которые подходят по смыслу.\ +Разработчики обычно не особо заморачиваются и закладывают минимально-необходимую информацию. Так что включите воображение и попробуйте придумать endpoints опираясь на бизнес логику и принятые в Вашей компании стандарты. Если ни endpoints ни бизнес логика Вам неизвестны, то у меня есть подозрение, что Вы тестируете API с не самыми хорошими намерениями. + +Источники: + +* [API Testing Tutorial: What is API Test Automation? How to Test](https://www.guru99.com/api-testing.html) +* [A Comprehensive API Testing Guide](https://www.softwaretestingmaterial.com/api-testing/) +* [API Testing Tutorial: A Complete Guide For Beginners](https://www.softwaretestinghelp.com/api-testing-tutorial/#i\_Functional\_Testing) +* [Spring Cloud Contract. Что такое контрактное тестирование и с чем его едят](https://habr.com/ru/company/testit-tms/blog/570544/) +* [Чем отличается api от sdk?](https://ru.stackoverflow.com/questions/796323/%D0%A7%D0%B5%D0%BC-%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F-api-%D0%BE%D1%82-sdk/796340#796340) +* [Тестирование API без документации](https://www.andreyolegovich.ru/testing/api\_testing.php#nospec) + +Доп. материал: + +* [Игорь Гольшмидт. АPI тестирование без документации](https://www.youtube.com/watch?v=9VnBVmo1Muc) +* [Курс Тестирование ПО. Занятие 29. Тестирование API - QA START UP](https://www.youtube.com/watch?v=7D7AMmgxt\_I\&t=1540s\&ab\_channel=QASTARTUP-ITTrainingCenter) +* [Курс Тестировщика с нуля / 27 урок/ Тестирование API с помощью Postman](https://www.youtube.com/watch?v=vBkEptmug7c) +* [Rest Assured и Postman - два подхода к тестированию API](https://testit.software/blog/post/rest-assured-i-postman-dva-podhoda-k-testirovaniyu-api) +* [Эвристики и мнемоники в тестировании: шаблоны для тестирования API](https://dou.ua/lenta/columns/testing-heuristics-mnemonics-2/) +* [От шока до принятия: пять стадий тестирования API](https://dou.ua/lenta/columns/api-testing-stages/) +* [Тестирование API](https://software-testing.ru/library/testing/testing-automation/3382-api-testing) +* [Swagger/OpenAPI Specification как основа для ваших приемочных тестов](https://habr.com/ru/company/jugru/blog/525298/) +* [История одного сервера и тестировщика Васи](https://habr.com/ru/company/nix/blog/534156/) +* [What Is an API?](https://www.howtogeek.com/343877/what-is-an-api/) +* [Тестирование API простыми словами за 8 минут / Тестировщик API](https://www.youtube.com/watch?v=kUPWQMalWNk\&feature=youtu.be\&ab\_channel=ArtsiomRusauQALife) +* [Тестирование Web API - From Zero To Hero](https://beqa.pro/blog/all-you-need-for-api-testing/#learn-api-testing-roadmap) +* [Стратегия тестирования REST API: что именно вам нужно тестировать?](https://habr.com/ru/post/568360/) +* [Test Design and Automation for Rest API. Part 1. Иван Катунов. Comaqa Spring 2018](https://www.youtube.com/watch?v=VTVx5Rx6rsY) + [Test Design and Automation for Rest API. Part 2. Иван Катунов. Comaqa Spring 2018](https://www.youtube.com/watch?v=Tq2thhEiQJE) + [pdf](https://testconf.ru/wp-content/uploads/2018/04/6-H1-19-%D0%98%D0%B2%D0%B0%D0%BD-%D0%9A%D0%B0%D1%82%D1%83%D0%BD%D0%BE%D0%B2-Test-Design-and-Automation-for-REST-API\_TestConf-min.pdf) +* [What is the Difference Between an API and an SDK?](https://nordicapis.com/what-is-the-difference-between-an-api-and-an-sdk/) +* [Introduction to API Testing](https://docs.katalon.com/katalon-studio/docs/introduction\_api\_testing.html) +* [19:05 «Контрактное тестирование Rest API»](https://www.youtube.com/watch?v=1cdMYN\_u4lA\&t=1145s) + [презентация](https://drive.google.com/drive/folders/1WERT2pCAJ73qdFaXredTSEmClPuSNs6N) +* [Организация контрактного тестирования микросервисов и графического портала](https://automated-testing.info/t/organizacziya-kontraktnogo-testirovaniya-mikroservisov-i-graficheskogo-portala/22763) +* [Introduction To Contract Testing With Examples](https://www.softwaretestinghelp.com/contract-testing/) +* [Микросервисы для разработчиков Java: Контрактное тестирование](https://coderlessons.com/articles/programmirovanie/mikroservisy-dlia-razrabotchikov-java-testirovanie#:\~:text=7.-,%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5%20%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,-%D0%92%20%D1%81%D0%BB%D0%B0%D0%B1%D0%BE%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BD%D0%BE%D0%B9) +* [Как тестировать GraphQL API? Гайд для начинающих](https://testengineer.ru/kak-testirovat-graphql-api/) +* [Что такое API](https://telegra.ph/CHto-takoe-API-11-01) +* [Что такое API](http://okiseleva.blogspot.com/2019/08/api.html?m=1) +* [Как передать в API фото формата base64](https://www.youtube.com/watch?v=Nstuin6XfxE) +* [API: под каким углом на них смотреть](https://www.youtube.com/watch?v=rin-PKE7-9Q) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-bezopasnosti-security-and-access-control-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-bezopasnosti-security-and-access-control-testing.md new file mode 100644 index 0000000..71154d4 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-bezopasnosti-security-and-access-control-testing.md @@ -0,0 +1,126 @@ +# Тестирование безопасности (Security and Access Control testing) + +Это тип тестирования ПО, который выявляет уязвимости, угрозы и риски. Целью тестов безопасности является выявление всех возможных лазеек и слабых мест в ПО, которые могут привести к потере информации, доходов, репутации компании, сотрудников или клиентов. Общая стратегия безопасности основывается на трех основных принципах: + +* Конфиденциальность - сокрытие определенных ресурсов или информации; +* Целостность - ресурс может быть изменен только в соответствии с полномочиями пользователя; +* Доступность - ресурсы должны быть доступны только авторизованному пользователю, внутреннему объекту или устройству; + +Тестирование безопасности обычно выполняет отдельный специалист по безопасности. В ходе тестирования безопасности испытатель играет роль взломщика. Ему разрешено все: + +* попытки узнать пароль с помощью внешних средств; +* атака системы с помощью специальных утилит, анализирующих защиты; +* перегрузка системы (в надежде, что она откажется обслуживать других клиентов); +* целенаправленное введение ошибок в надежде проникнуть в систему в ходе восстановления; +* просмотр несекретных данных в надежде найти ключ для входа в систему; + +При неограниченном времени и ресурсах хорошее тестирование безопасности взломает любую систему. Задача проектировщика системы - сделать цену проникновения более высокой, чем цена получаемой в результате информации. + +**Типы тестирования безопасности**: + +* Сканирование уязвимостей/оценка защищенности (Vulnerability Scanning) выполняется с помощью автоматизированного ПО для сканирования системы на наличие известных сигнатур уязвимостей; +* Сканирование безопасности (Security Scanning) включает в себя выявление слабых сторон сети и системы, а затем предоставляет решения для снижения этих рисков. Это сканирование может быть выполнено как вручную, так и автоматизированно; +* Тестирование на проникновение (Penetration testing) имитирует атаку злоумышленника. Это тестирование включает анализ конкретной системы для проверки потенциальных уязвимостей при попытке внешнего взлома; +* Оценка рисков (Risk Assessment) включает анализ рисков безопасности, наблюдаемых в организации. Риски классифицируются как Низкие, Средние и Высокие. Это тестирование рекомендует меры по снижению риска; +* Аудит безопасности (Security Auditing) - внутренняя проверка приложений и операционных систем на наличие уязвимостей. Аудит также может быть выполнен путем построчной проверки кода; +* Этический взлом (Ethical hacking) - совершается с целью выявления проблем безопасности в системе. Это делается White Hat хакерами - это специалисты по безопасности, которые использует свои навыки законным способом для помощи в выявлении уязвимостей системы, в отличии от Black Hat (преступников); +* Оценка состояния (Posture Assessment) объединяет сканирование безопасности, этический взлом и оценки рисков, чтобы показать общее состояние безопасности организации; + +| SDLC фаза | Security Processes | +| ----------------------- | --------------------------------------------------------------------------------------------------------------- | +| Requirements | Анализ безопасности для требований и проверка случаев злоупотребления / неправильного использования | +| Design | Анализ рисков безопасности для проектирования. Разработка плана тестирования с учетом тестирования безопасности | +| Coding and Unit testing | Статическое и динамическое тестирование безопасности и тестирование белого ящика | +| Integration testing | Тестирование черного ящика | +| System testing | Тестирование черного ящика и сканирование уязвимостей | +| Implementation | Тестирование на проникновение, сканирование уязвимостей | +| Support | Анализ воздействия патчей | + +Тестирование безопасности может выполняться методом любого ящика, а также Tiger Box: этот взлом обычно выполняется на ноутбуке с набором операционных систем и инструментов для взлома. Это тестирование помогает тестерам на проникновение и тестерам безопасности проводить оценку уязвимостей и атаки. + +**Методы тестирования безопасности**: + +**Доступ к приложению**. Будь то настольное приложение или веб-сайт, безопасность доступа обеспечивается функцией «Управление ролями и правами». Часто это делается неявно при описании функциональности, Например, в системе управления больницей администратор меньше всего беспокоится о лабораторных исследованиях, поскольку его работа состоит в том, чтобы просто зарегистрировать пациентов и назначить их встречи с врачами. Таким образом, все меню, формы и экраны, относящиеся к лабораторным тестам, не будут доступны для роли «регистратора». Следовательно, правильная реализация ролей и прав гарантирует безопасность доступа. + +Как протестировать доступ к приложению: Чтобы это проверить, необходимо выполнить тщательное тестирование всех ролей и прав. Тестировщик должен создать несколько учетных записей пользователей с разными, а также с несколькими ролями. Затем он должен использовать приложение с помощью этих учетных записей и убедиться, что каждая роль имеет доступ только к своим собственным модулям, экранам, формам и меню. Если тестировщик обнаруживает конфликт, он должен с полной уверенностью зарегистрировать проблему безопасности. Некоторые из тестов аутентификации включают в себя проверку правил качества пароля, проверку входа в систему по умолчанию, проверку восстановления пароля, проверку проверки подлинности, проверку функциональности выхода, проверку смены пароля, проверку контрольного вопроса / ответа и т. д. Аналогичным образом, некоторые из тестов авторизации включают в себя тест на обход пути, тест на отсутствие авторизации, тест на проблемы горизонтального контроля доступа и т. д. + +**Защита данных**. Есть три аспекта безопасности данных. Во-первых, пользователь может просматривать или использовать только те данные, которые он должен использовать. Это также обеспечивается ролями и правами. Например, TSR (представитель по телефону) компании может просматривать данные об имеющихся запасах, но не может видеть, сколько сырья было закуплено для производства. Итак, этот аспект тестирования безопасности уже объяснен выше. Второй аспект защиты данных связан с тем, [как эти данные хранятся в БД](https://www.softwaretestinghelp.com/database-security-testing/). Все конфиденциальные данные должны быть зашифрованы, чтобы сделать их безопасными. Шифрование должно быть надежным, особенно для конфиденциальных данных, таких как пароли учетных записей пользователей, номера кредитных карт или другой критически важной для бизнеса информации. Третий и последний аспект является продолжением этого второго аспекта. При передаче конфиденциальных или важных для бизнеса данных необходимо принять надлежащие меры безопасности. Независимо от того, перемещаются ли эти данные между разными модулями одного и того же приложения или передаются в разные приложения, они должны быть зашифрованы для обеспечения безопасности. + +Как протестировать защиту данных: Тестировщик должен запросить в базе данных «пароли» учетной записи пользователя, информацию о выставлении счетов клиентов, другие важные для бизнеса и конфиденциальные данные и убедиться, что все такие данные хранятся в зашифрованной форме. Точно так же он должен убедиться, что данные передаются между различными формами или экранами только после надлежащего шифрования. Более того, тестировщик должен убедиться, что зашифрованные данные должным образом расшифрованы в месте назначения. Особое внимание следует уделить различным действиям «отправить». Тестировщик должен убедиться, что информация, передаваемая между клиентом и сервером, не отображается в адресной строке веб-браузера в понятном формате. Если какая-либо из этих проверок завершится неудачно, значит, в приложении определенно есть баги безопасности. Тестировщик также должен проверить правильность использования соления (salting - добавление дополнительного секретного значения к конечному вводу, например пароля, что делает его более надежным и трудным для взлома). Небезопасная случайность также должна быть проверена, поскольку это своего рода уязвимость. Другой способ проверить защиту данных - проверить использование слабого алгоритма. Например, поскольку HTTP - это протокол открытого текста, если конфиденциальные данные, такие как учетные данные пользователя, передаются через HTTP, то это угроза безопасности приложения. Вместо HTTP конфиденциальные данные следует передавать через HTTPS (защищенный через SSL, туннель TLS). Однако HTTPS увеличивает поверхность атаки, поэтому необходимо проверить правильность конфигурации сервера и гарантировать действительность сертификата; + +**Атака грубой силы** (Brute-Force Attack, атака полным перебором) в основном выполняется некоторыми программными инструментами. Идея состоит в том, что, используя действительный идентификатор пользователя, программное обеспечение пытается подобрать связанный пароль, пытаясь войти в систему снова и снова. Простым примером защиты от такой атаки является приостановка учетной записи на короткий период времени, как это делают все почтовые приложения, такие как Yahoo, Gmail и Hotmail. Если определенное количество последовательных попыток (в основном 3) не позволяют войти в систему, эта учетная запись блокируется на некоторое время (от 30 минут до 24 часов). + +Как протестировать атаку грубой силы: Тестировщик должен убедиться, что какой-то механизм блокировки учетной записи доступен и работает правильно. Он должен попытаться войти в систему с недопустимыми идентификаторами пользователя и паролями, в качестве альтернативы, чтобы убедиться, что программное обеспечение блокирует учетные записи, если предпринимаются постоянные попытки входа с недопустимыми учетными данными. Если приложение делает это, оно защищено от атаки методом перебора. В противном случае тестировщик должен сообщить об этой уязвимости системы безопасности. Тестирование перебором также можно разделить на две части - тестирование черного ящика и тестирование серого ящика. При тестировании «черного ящика» метод аутентификации, используемый приложением, обнаруживается и тестируется. Тестирование серого ящика основано на частичном знании пароля и данных учетной записи, а также на атаках компромисса памяти ([подробнее](https://wiki.owasp.org/index.php/Testing\_for\_Brute\_Force\_\(OWASP-AT-004\)#Gray\_Box\_testing\_and\_example)). + +Вышеупомянутые три аспекта безопасности следует учитывать как для веб-приложений, так и для настольных приложений, в то время как **следующие моменты относятся только к веб-приложениям**. + +[**SQL-инъекции**](https://owasp.org/www-community/attacks/SQL\_Injection#Alternative\_Expression\_of\_.27or\_1\_.3D\_1.27) **и** [**XSS**](https://cheatsheetseries.owasp.org/cheatsheets/Cross\_Site\_Scripting\_Prevention\_Cheat\_Sheet.html) (межсайтовый скриптинг). С концептуальной точки зрения, темы обеих попыток взлома схожи, поэтому они обсуждаются вместе. В этом подходе вредоносный сценарий используется хакерами для манипулирования веб-сайтом. Есть несколько способов застраховаться от таких попыток. Для всех полей ввода веб-сайта длины полей должны быть достаточно малыми, чтобы ограничить ввод любого скрипта. Например, поле «Фамилия» должно иметь длину поля 30 вместо 255. Могут быть некоторые поля ввода, в которых требуется ввод больших данных, для таких полей необходимо выполнить правильную проверку ввода до сохранения этих данных в приложении. Более того, в таких полях должны быть запрещены любые HTML-теги или ввод тегов скрипта. Чтобы спровоцировать XSS-атаки, приложение должно отклонять перенаправления скриптов от неизвестных или ненадежных приложений. + +Как тестировать SQL-инъекцию и XSS: Тестер должен убедиться, что максимальная длина всех полей ввода определена и реализована. Он также должен гарантировать, что заданная длина полей ввода не соответствует вводу сценария, а также вводу тега. Оба они могут быть легко протестированы. Например, если 20 - максимальная длина, указанная для поля «Имя», а входная строка «\thequickbrownfoxjumpsoverthelazydog» можно проверить оба этих ограничения. Тестировщик также должен убедиться, что приложение не поддерживает методы анонимного доступа. Если какая-либо из этих уязвимостей существует, приложение находится в опасности. В основном, тестирование SQL-инъекции может быть выполнено следующими пятью способами: + +* Методы обнаружения; +* Стандартные техники SQL-инъекций; +* [Отпечаток базы данных](https://www.sqlinjection.net/database-fingerprinting/); +* Эксплойты; +* [Методы внедрения в сигнатуру SQL-инъекции](https://www.imperva.com/docs/IMPERVA\_HII\_SQL-Injection-Signatures-Evasion.pdf) (SQL Injection Signature Invasion Techniques); + +**Точки доступа к сервису** (закрытые и безопасные открытые). + +![https://www.softwaretestinghelp.com/wp-content/qa/uploads/2011/09/Service-Access-Points-Sealed-and-Secure-Open.jpg](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2011/09/Service-Access-Points-Sealed-and-Secure-Open.jpg) + +Сегодня компании зависят друг от друга и сотрудничают друг с другом, то же самое относится и к приложениям, особенно к веб-сайтам. В таком случае оба участника должны определить и опубликовать несколько точек доступа друг для друга. Пока сценарий кажется довольно простым и понятным, но для некоторых веб-продуктов, таких как торговля акциями, все не так просто и легко. Когда существует большое количество целевой аудитории, точки доступа должны быть достаточно открытыми, чтобы облегчить работу всех пользователей, достаточно приспособленными для выполнения всех запросов пользователей и достаточно безопасными, чтобы справиться с любой опасностью. + +Как протестировать точки доступа к сервису (Service Access Points): позвольте мне объяснить это на примере веб-приложения для торговли акциями; инвестор (желающий приобрести акции) должен иметь доступ к текущим и историческим данным о ценах на акции. Это требует, чтобы приложение было достаточно открытым. Под удобством и безопасностью я подразумеваю, что приложение должно облегчить инвесторам возможность свободно торговать (в соответствии с законом). Они могут покупать или продавать 24/7, и данные транзакций должны быть защищены от любых хакерских атак. Более того, большое количество пользователей будет взаимодействовать с приложением одновременно, поэтому приложение должно предоставлять достаточно точек доступа, чтобы удовлетворить всех пользователей. В некоторых случаях эти точки доступа могут быть закрыты для нежелательных приложений или людей. Это зависит от бизнес-домена приложения и его пользователей, например, настраиваемая веб-система управления офисом может распознавать своих пользователей на основе IP-адресов и отказывать в установлении соединения со всеми другими системами (приложениями), которые не попадают в диапазон допустимых IP-адресов для этого приложения. Тестировщик должен гарантировать, что весь межсетевой и внутрисетевой доступ к приложению осуществляется доверенными приложениями, машинами (IP) и пользователями. Чтобы убедиться, что открытая точка доступа достаточно безопасна, тестировщик должен попытаться получить к ней доступ с разных машин, имеющих как доверенные, так и ненадежные IP-адреса. Следует опробовать различные типы транзакций в реальном времени сразу, чтобы быть уверенным в производительности приложения. Таким образом, пропускная способность точек доступа приложения также будет четко отслеживаться. Тестировщик должен убедиться, что приложение обрабатывает все запросы связи от доверенных IP-адресов и приложений только тогда, когда все остальные запросы отклоняются. Точно так же, если в приложении есть открытая точка доступа, тестировщик должен убедиться, что она разрешает (при необходимости) загрузку данных пользователями безопасным способом. Под этим безопасным способом я имею в виду ограничение размера файла, ограничение типа файла и сканирование загруженного файла на вирусы или другие угрозы безопасности. + +**Управление сессией**. Веб-сеанс - это последовательность транзакций HTTP-запроса и ответа, связанных с одним и тем же пользователем. Тесты управления сеансом проверяют, как управление сеансом обрабатывается в веб-приложении. Вы можете проверить истечение срока действия сеанса после определенного времени простоя, завершение сеанса после максимального времени жизни, завершение сеанса после выхода из системы, проверить объем и продолжительность сеанса cookie, проверить, может ли один пользователь иметь несколько одновременных сеансов и т. д. + +**Обработка ошибок.** Тестирование на обработку ошибок включает: + +* проверку кодов ошибок, которые возвращаются с подробным сообщением. Эти сообщения не должны содержать критической информации, которая может быть использована для взлома; +* проверку трассировки стека: в основном это включает в себя передачу в приложение некоторых исключительных данных, так что возвращаемое сообщение об ошибке содержит трассировки стека, которые содержат интересную информацию для хакеров; + +**Конкретные опасные функции.** В основном, две рискованные функции - это платежи и загрузка файлов. Эти функции следует очень хорошо протестировать. Для загрузки файлов вам необходимо в первую очередь проверить, ограничена ли загрузка нежелательных или вредоносных файлов. Для платежей вам необходимо в первую очередь протестировать на наличие уязвимостей инъекций, небезопасного криптографического хранилища, переполнения буфера, подбора пароля и т. д. + +Источники: + +* [What is Security Testing? Types with Example](https://www.guru99.com/what-is-security-testing.html) +* [Security Testing (A Complete Guide)](https://www.softwaretestinghelp.com/how-to-test-application-security-web-and-desktop-application-security-testing-techniques/) + +Доп. материал: + +* [Список книг по наступательной информационной безопасности](https://habr.com/ru/company/vk/blog/282700/) +* [Топ-10 уязвимостей мобильных приложений и способы их устранения](https://habr.com/ru/company/ruvds/blog/537456/) +* [Безопасность веб-приложений: от уязвимостей до мониторинга](https://habr.com/ru/post/526878/) +* [Социотехническое тестирование: какое лучше выбрать в 2021 году?](https://habr.com/ru/company/group-ib/blog/535092/) +* [Анализ безопасности веб-проектов](https://www.youtube.com/playlist?list=PLrCZzMib1e9owORdnWTvZIkSCqRFFbHGA) +* [Безопасность интернет-приложений](https://www.youtube.com/playlist?list=PLrCZzMib1e9qiiSWgZ6pI5HiQzFc4hhdo) +* [Red Teaming - комплексная имитация атак. Методология и инструменты](https://habr.com/ru/company/varonis/blog/524308/) +* [cHack](https://www.youtube.com/channel/UCGfxztXUoBeGNVv6UTpUQHw/videos) +* [OWASP Top Ten](https://owasp.org/www-project-top-ten/) +* [SQL-инъекции' union select null,null,null --](https://habr.com/ru/post/542190/) +* [Чек-лист устранения SQL-инъекций](https://habr.com/ru/company/pentestit/blog/546232/) +* [Что такое XSS-уязвимость и как тестировщику не пропустить ее](https://www.software-testing.ru/library/testing/security/3398-ross-site-scripting) +* [What Is Database Security Testing - Complete Guide](https://www.softwaretestinghelp.com/database-security-testing/) +* [QA-митап Redmadrobot 19/11, QA vs Hackers: безопасность в web, Вика Бегенчева](https://www.youtube.com/watch?v=AXD0eyTGbBM) +* [Как я получил награду Facebook по баунти-программе дважды](https://habr.com/ru/company/timeweb/blog/549864/) +* [Безопасность REST API от А до ПИ](https://habr.com/ru/post/503284/) +* [Тестирование безопасности API - Катерина Овеченко. QA Fest 2019](https://www.youtube.com/watch?v=46N\_zodwzKA) +* [Как провести тестирование на безопасность: руководство для Manual QA](https://dou.ua/lenta/articles/security-testing-vulnerabilities/) +* [Типы атак и уязвимостей](https://docs.wallarm.ru/attacks-vulns-list/) +* [Open Web Application Security Project (OWASP) TOP 10 2017](https://owasp.org/www-project-top-ten/2017/#) +* [Что такое OWASP Top-10 и как использовать указанные риски и уязвимости](https://blog.themarfa.name/chto-takoie-owasp-top-10-i-kak-ispolzovat-ukazannyie-riski-i-uiazvimosti/) +* [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL\_Injection\_Prevention\_Cheat\_Sheet.html) +* [Web Authentication, Session Management, and Access Control Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Session\_Management\_Cheat\_Sheet.html) +* [Forgot Password Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Forgot\_Password\_Cheat\_Sheet.html) +* [Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication\_Cheat\_Sheet.html) +* [Password Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Password\_Storage\_Cheat\_Sheet.html) +* [Cross Site Scripting (XSS) Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross\_Site\_Scripting\_Prevention\_Cheat\_Sheet.html) +* [Unvalidated Redirects and Forwards Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated\_Redirects\_and\_Forwards\_Cheat\_Sheet.html) +* [Безопасность iOS-приложений: гайд для новичков](https://habr.com/ru/company/wrike/blog/544754/) +* [Уязвимости Android 2020](https://habr.com/ru/company/otus/blog/547160/) +* [Обман обманщиков: форк-бомба нового уровня](https://habr.com/ru/company/ruvds/blog/554158/) +* [Software security](https://www.synopsys.com/blogs/software-security/software-security/) +* [When might you need security testing?](https://www.softwaretestingnews.co.uk/when-might-you-need-security-testing/) +* [Иван Румак - Эффективный поиск XSS-уязвимостей](https://www.youtube.com/watch?v=EmJnUqFgaK8) +* [Тестирование безопасности / OWASP TOP 10 уязвимостей](https://www.youtube.com/watch?v=fgtuLbT4joI) +* [TOP 10 уязвимостей 2020 by HackerOne](https://habr.com/ru/company/otus/blog/526768/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-dokumentacii-documentation-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-dokumentacii-documentation-testing.md new file mode 100644 index 0000000..968a7d1 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-dokumentacii-documentation-testing.md @@ -0,0 +1,42 @@ +# Тестирование документации (Documentation testing) + +Плохая документация может повлиять на качество продукта. Тестирование артефактов, разработанных до, во время и после тестирования продукта, называется тестированием документации. Это нефункциональный тип тестирования программного обеспечения. Мы знаем, что дефекты, обнаруженные на этапе тестирования, более дорогостоящие, чем если бы они были обнаружены на этапе требований. Стоимость исправления ошибки увеличивается тем больше, чем позже вы найдете ее. Таким образом, тестирование документации может начаться с самого начала процесса разработки программного обеспечения, чтобы сэкономить большую сумму денег. Некоторые часто проверяемые артефакты: + +* Requirement documents +* Test Plan +* Test case +* Traceability Matrix (RTM) + +**Техники тестирования требований:** + +**Взаимный просмотр** (peer review). Взаимный просмотр («рецензирование») является одной из наиболее активно используемых техник тестирования требований и может быть представлен в одной из трех следующих форм (по мере нарастания его сложности и цены): + +* Беглый просмотр (walkthrough) может выражаться как в показе автором своей работы коллегам с целью создания общего понимания и получения обратной связи, так и в простом обмене результатами работы между двумя и более авторами с тем, чтобы коллега высказал свои вопросы и замечания. Это самый быстрый, дешевый и часто используемый вид просмотра. Для запоминания: аналог беглого просмотра - это ситуация, когда вы в школе с одноклассниками проверяли перед сдачей сочинения друг друга, чтобы найти описки и ошибки. +* Технический просмотр (technical review) выполняется группой специалистов. В идеальной ситуации каждый специалист должен представлять свою область знаний. Тестируемый продукт не может считаться достаточно качественным, пока хотя бы у одного просматривающего остаются замечания. Для запоминания: аналог технического просмотра - это ситуация, когда некий договор визирует юридический отдел, бухгалтерия и т.д. +* Формальная инспекция (inspection) представляет собой структурированный, систематизированный и документируемый подход к анализу документации. Для его выполнения привлекается большое количество специалистов, само выполнение занимает достаточно много времени, и потому этот вариант просмотра используется достаточно редко (как правило, при получении на сопровождение и доработку проекта, созданием которого ранее занималась другая компания). Для запоминания: аналог формальной инспекции - это ситуация генеральной уборки квартиры (включая содержимое всех шкафов, холодильника, кладовки и т.д.). + +**Вопросы**. Следующей очевидной техникой тестирования и повышения качества требований является (повторное) использование техник выявления требований, а также (как отдельный вид деятельности) - задавание вопросов. Если хоть что-то в требованиях вызывает у вас непонимание или подозрение - задавайте вопросы. Можно спросить представителей заказчика, можно обратиться к справочной информации. По многим вопросам можно обратиться к более опытным коллегам при условии, что у них имеется соответствующая информация, ранее полученная от заказчика. Главное, чтобы ваш вопрос был сформулирован таким образом, чтобы полученный ответ позволил улучшить требования; + +**Тест-кейсы и чек-листы**. Мы помним, что хорошее требование является проверяемым, а значит, должны существовать объективные способы определения того, верно ли реализовано требование. Продумывание чек-листов или даже полноценных тест-кейсов в процессе анализа требований позволяет нам определить, насколько требование проверяемо. Если вы можете быстро придумать несколько пунктов чек-листа, это ещё не признак того, что с требованием всё хорошо (например, оно может противоречить каким-то другим требованиям). Но если никаких идей по тестированию требования в голову не приходит - это тревожный знак. Рекомендуется для начала убедиться, что вы понимаете требование (в том числе прочесть соседние требования, задать вопросы коллегам и т.д.). Также можно пока отложить работу с данным конкретным требованием и вернуться к нему позднее - возможно, анализ других требований позволит вам лучше понять и это конкретное. Но если ничто не помогает - скорее всего, с требованием что-то не так. Справедливости ради надо отметить, что на начальном этапе проработки требований такие случаи встречаются очень часто - требования сформированы очень поверхностно, расплывчато и явно нуждаются в доработке, т.е. здесь нет необходимости проводить сложный анализ, чтобы констатировать непроверяемость требования. На стадии же, когда требования уже хорошо сформулированы и протестированы, вы можете продолжать использовать эту технику, совмещая разработку тест-кейсов и дополнительное тестирование требований. + +**Исследование поведения системы**. Эта техника логически вытекает из предыдущей (продумывания тест-кейсов и чек-листов), но отличается тем, что здесь тестированию подвергается, как правило, не одно требование, а целый набор. Тестировщик мысленно моделирует процесс работы пользователя с системой, созданной по тестируемым требованиям, и ищет неоднозначные или вовсе неописанные варианты поведения системы. Этот подход сложен, требует достаточной квалификации тестировщика, но способен выявить нетривиальные недоработки, которые почти невозможно заметить, тестируя требования по отдельности. + +**Рисунки (графическое представление)**. Чтобы увидеть общую картину требований целиком, очень удобно использовать рисунки, схемы, диаграммы, интеллект-карты и т.д. Графическое представление удобно одновременно своей наглядностью и краткостью (например, UML-схема базы данных, занимающая один экран, может быть описана несколькими десятками страниц текста). На рисунке очень легко заметить, что какие-то элементы «не стыкуются», что где-то чего-то не хватает и т.д. Если вы для графического представления требований будете использовать общепринятую нотацию (например, уже упомянутый UML), вы получите дополнительные преимущества: вашу схему смогут без труда понимать и дорабатывать коллеги, а в итоге может получиться хорошее дополнение к текстовой форме представления требований. + +**Прототипирование**. Можно сказать, что прототипирование часто является следствием создания графического представления и анализа поведения системы. С использованием специальных инструментов можно очень быстро сделать наброски пользовательских интерфейсов, оценить применимость тех или иных решений и даже создать не просто «прототип ради прототипа», а заготовку для дальнейшей разработки, если окажется, что реализованное в прототипе (возможно, с небольшими доработками) устраивает заказчика. + +Подробный разбор примера тестирования требований можно прочитать в книге Святослава Куликова “Тестирование программного обеспечения. Базовый курс” в разделе 2.2.7. “Пример анализа и тестирования требований”. + +Источники: + +* [What is Documentation Testing in Software Testing](https://www.softwaretestingmaterial.com/documentation-testing-in-software-testing/) +* [Святослав Куликов “Тестирование программного обеспечения. Базовый курс”](https://svyatoslav.biz/software\_testing\_book/). Глава 2. + +Доп. материал: + +* [Как тестировать документацию. Простой алгоритм](https://habr.com/ru/post/595773/) +* [Тестирование требований: как я нахожу ошибки в бизнес-логике фичи прежде, чем их закодят](https://habr.com/ru/company/plesk/blog/550550/) +* [Чек-лист тестирования требований](https://habr.com/ru/post/543340/) +* [Как тестировать документацию. Простой алгоритм](https://habr.com/ru/post/595773/) +* [Тестировщик с нуля / Урок 4 / Тестирование требований](https://www.youtube.com/watch?v=JY55bMex9Hw) +* [Не все проверки бесполезны или несколько способов ревизии требований](https://www.youtube.com/watch?v=hfYlf2XGoIw) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-dostupnosti-accessibility-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-dostupnosti-accessibility-testing.md new file mode 100644 index 0000000..01e9098 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-dostupnosti-accessibility-testing.md @@ -0,0 +1,63 @@ +# Тестирование доступности (Accessibility testing) + +_Тестирование доступности (accessibility testing): Тестирование, которое определяет степень легкости, с которой пользователи с ограниченными способностями могут использовать систему или ее компоненты (ISTQB)._ + +_Тестирование доступности (accessibility testing): Тип тестирования удобства использования, предназначенный для оценки степени возможности управления элементом тестирования пользователями с самыми разными характеристиками и способностями. (ГОСТ 56920)_ + +Тестирование доступности (accessibility testing) - это подмножество юзабилити-тестирования. Его цель - убедиться в том, что наш продукт удобен в использовании людям с различными видами ограничений, инвалидности или особенностями восприятия. Это могут быть проблемы со зрением, слухом или ограничения в подвижности рук. Что наиболее важно, существуют определенные законы и инструкции по тестированию доступности, которые также должны соблюдаться, например, Рекомендации по доступности веб-контента ([Web content accessibility guidelines](https://www.w3.org/TR/WCAG21/)). Ваш продукт должен правильно работать с соответствующим ПО. Примеры такого программного обеспечения: + +* Speech Recognition Software - ПО преобразует произнесенное слово в текст, который служит вводом для компьютера; +* Программа для чтения с экрана - используется для озвучивания текста, отображаемого на экране; +* Программное обеспечение для увеличения экрана - используется для увеличения масштаба элементов и облегчения чтения для пользователей с нарушениями зрения; +* Специальная клавиатура, облегчающая ввод для пользователей, у которых проблемы с двигательными функциями; + +Еще один из примеров - люди с цветовой слепотой (дальтонизмом). Эта особенность довольно широко распространена. Различными видами цветовой слепоты страдают около 8 % мужчин и 0,4 % женщин - не так уж мало! + +Цвет не должен быть единственным способом передачи информации. Если вы используете цвет для того, чтобы, допустим, отобразить статус, эту информацию стоит продублировать еще каким-то образом - геометрическими фигурами, иконками или текстовым комментарием.\ +Хорошая контрастность. Хорошая контрастность обеспечивает нормальную видимость элементов управления и текста даже для людей, не различающих те или иные оттенки.\ +Есть отличный инструмент для тестирования веб-сайтов на предмет доступности для людей с различными формами цветовой слепоты: Color Blind Web Page Filter. + +![https://az545221.vo.msecnd.net/skype-faq-media/faq\_content/skype/screenshots/fa3501/fa3501-a.png](https://az545221.vo.msecnd.net/skype-faq-media/faq\_content/skype/screenshots/fa3501/fa3501-a.png) + +Если вы хотите сократить количество тестов, можно ограничиться только тремя фильтрами: дейтеранопия, протанопия и тританопия. Это наиболее выраженные формы цветовой слепоты (не считая крайне редкого черно-белого зрения). Остальные люди с особенностями цветовосприятия видят больше оттенков, и если ваш UI достаточно хорошо виден с этими тремя фильтрами, то и для остальных будет отображаться корректно. + +Пример чек-листа: + +* Предоставляет ли приложение клавиатурные эквиваленты для всех действий мышью и окон? +* Предоставляются ли инструкции как часть пользовательской документации или руководства? Легко ли понять и использовать приложение, используя документацию? +* Упорядочены ли вкладки логически для обеспечения плавной навигации? +* Предусмотрены ли сочетания клавиш для меню? +* Поддерживает ли приложение все операционные системы? +* Четко ли указано время отклика каждого экрана или страницы, чтобы конечные пользователи знали, как долго ждать? +* Все ли надписи правильно написаны? +* Являются ли цвета подходящим для всех пользователей? +* Правильно ли используются изображения или значки, чтобы их было легко понять конечным пользователям? +* Есть ли звуковые оповещения? +* Может ли пользователь настроить аудио или видео элементы управления? +* Может ли пользователь переопределить шрифты по умолчанию для печати и отображения текста? +* Может ли пользователь настроить или отключить мигание, вращение или перемещение элементов? +* Убедитесь, что цветовое кодирование никогда не используется в качестве единственного средства передачи информации или указания на действие +* Видна ли подсветка с инвертированными цветами? +* Тестирование цвета в приложении путем изменения контрастности +* Правильно ли слышат люди с ограниченными возможностями все имеющее отношение к аудио и видео? +* Протестируйте все мультимедийные страницы без мультимедиа-оборудования. +* Предоставляется ли обучение пользователям с ограниченными возможностями, что позволит им ознакомиться с программным обеспечением или приложением? + +Источники: + +* [Accessibility Testing Tutorial (A Complete Step By Step Guide)](https://www.softwaretestinghelp.com/what-is-web-accessibility-testing/) +* [Accessibility Testing Tutorial: What is, Tools & Examples](https://www.guru99.com/accessibility-testing.html) + +Доп. материал: + +* [Чеклист на соответствие гайдлайнам по доступности (WCAG)](https://www.a11yproject.com/checklist/) +* [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/WAI/standards-guidelines/wcag/) +* [Understanding Accessibility: WCAG’s 13 Guidelines with Kasey Bonifacio](https://www.youtube.com/watch?v=RjpvOqZigao) +* [Accessibility Testing: Color Blindness](https://www.luxoft-training.com/news/accessibility-testing-color-blindness/) +* [QA и его роль в создании ресурсов для людей с ограниченными возможностями](https://habr.com/ru/company/redmadrobot/blog/504110/) +* [Чеклист по UX из 30 пунктов для мобильных приложений](https://habr.com/ru/company/edison/blog/474472/) +* [Web Content Accessibility Guidelines](https://cdn2.hubspot.net/hubfs/5358007/WCAG\_2.1\_Checklist.pdf) +* [Говорим о практике в области UX/UI-тестирования в Университете ИТМО - подкаст «ITMO Research»](https://habr.com/ru/company/spbifmo/blog/559964/) +* [Accessibility Testing Tutorial: What is, Tools & Examples](https://www.guru99.com/accessibility-testing.html) +* [Everything You Should Know About Accessibility Testing](https://blog.qatestlab.com/2021/08/18/accessibility-testing/) +* [Тестирование доступности. Теория, инструменты и чеклист.](https://testengineer.ru/chto-takoe-testirovanie-dostupnosti/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-emkosti-capacity-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-emkosti-capacity-testing.md new file mode 100644 index 0000000..ce4696c --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-emkosti-capacity-testing.md @@ -0,0 +1,35 @@ +# Тестирование емкости (Capacity testing) + +_Тестирование потенциальных возможностей (capacity testing): Тип тестирования уровня производительности для оценки уровня, при котором с увеличением нагрузки (числа пользователей, транзакций, элементов данных и т.д.) элемент тестирования подвергается угрозе не обеспечивать требуемую производительность. (ГОСТ 56920)_ + +Capacity - базовый тест, который обычно выполняется первым. Все последующие тесты на среднее время ответа, регенерацию системы, утилизацию ресурсов нужно выполнять с оглядкой на результаты Capacity. + +Тестирование емкости гарантирует, что приложение и среда могут беспрепятственно обрабатывать максимальное количество пользователей или транзакций в соответствии с требованиями к производительности, определенными в вашем соглашении об уровне обслуживания (SLA). Тестирование емкости нацелено на тестирование максимальной емкости вашей системы с точки зрения трафика, при этом обеспечивая оптимальное взаимодействие с пользователем. Общие примеры SLA по производительности включают время загрузки домашней страницы, время ответа веб-страницы, продолжительность транзакции (например, - время входа в учетную запись, время поиска и платежа). Общая цель состоит в том, чтобы идентифицировать «зону безопасности» системы и удерживать ее в максимально возможной степени. Тестирование емкости помогает определить, в какой степени она может быть расширена без ущерба для опыта конечного пользователя. + +Емкость системы измеряется в rps (requests per second). Используемый подход: ступенчато повышаем нагрузку до момента, когда время ответа начнет расти экспоненциально. Экспоненциальный рост времени ответа, как правило, связан с полной утилизацией одного из ресурсов, из-за которого запросы вместо моментальной обработки выстраиваются друг за другом и ждут своей очереди на обработку. + +![https://miro.medium.com/max/1344/1\*B3cAJ7GfwhpgxhUX-otz-g.png](https://miro.medium.com/max/1344/1\*B3cAJ7GfwhpgxhUX-otz-g.png) + +Обратите внимание: от 1 до 12 rps процентиль времени ответа практически не изменяется. Только на 13 и 14 rps мы видим незначительный рост, который не изменяется с течением времени. Это значит, что мы практически исчерпали ресурс, в который упремся, но очередь еще не образуется. На 15 rps время ответа начало расти экспоненциально, значит это и есть наш предел. Таким образом, можно сделать вывод, что емкость =14 rps. Следующий шаг - поиск ресурса который исчерпался и не дает системе обрабатывать больше 14 rps. + +![https://camo.githubusercontent.com/20dc14aa223c19464db011a8f71c8c61e426fee5849f1f2f36a3681901c7844e/68747470733a2f2f6c68352e676f6f676c6575736572636f6e74656e742e636f6d2f4e466265424f7a7139685f3531375a7730754b3536396571336b306b5759324242694f5251564b4b54613147716930457553334b65594e513259354e6649376670464a65786431436143345365446858447a344265396f535f727959524f4d624e486f4a2d434b4f46696e4f4878654e483472364f6835306c677848795944787855676172714777](https://camo.githubusercontent.com/20dc14aa223c19464db011a8f71c8c61e426fee5849f1f2f36a3681901c7844e/68747470733a2f2f6c68352e676f6f676c6575736572636f6e74656e742e636f6d2f4e466265424f7a7139685f3531375a7730754b3536396571336b306b5759324242694f5251564b4b54613147716930457553334b65594e513259354e6649376670464a65786431436143345365446858447a344265396f535f727959524f4d624e486f4a2d434b4f46696e4f4878654e483472364f6835306c677848795944787855676172714777) + +Capacity point - точка, где перестает расти пропускная способность и увеличивается время ответа. + +Исходя из этого тестирования выбираются значения для stress, load и soak/endurance тестов. Для stress берется значение близкое к capacity point, но немного меньше. Для load количество пользователей из зоны деградации. + +Важно, ваша цель - не получить кол-во rps, при котором все взрывается, а понять, какой именно ресурс станет узким местом при повышении нагрузки. Поэтому, если обстреливаемый вами сервер не покрыт мониторингом - можете даже не начинать тест. Общий подход к сбору телеметрии - чем больше метрик собирается, тем лучше. Начать стоит с минимального набора: + +* Основные физические, функциональные, компоненты сервера(железо): процессор, память, сеть, жесткий диск. +* Метрики операционной системы: прерывания, переключение контекстов, среднее значение загрузки системы за 1, 5 и 15 минут. +* Метрики программного обеспечения, используемого на сервере. +* По возможности постарайтесь определять в каких пропорциях ресурсы используются вашим программным обеспечением. + +Источники: + +* [All You Need to Know About Capacity Testing](https://www.radview.com/blog/all-you-need-to-know-about-capacity-testing/) +* [Тестируем производительность: как определить емкость системы](https://medium.com/@sheidaievkostiantyn/capacity-testing-273c87ff03b4) + +Доп. материал: + +* [Как оценить ёмкость сервиса и не упасть под нагрузкой](https://habr.com/ru/company/yandex/blog/481134/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-graficheskogo-interfeisa-vizualnoe-testirovanie-gui-graphical-user-interface-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-graficheskogo-interfeisa-vizualnoe-testirovanie-gui-graphical-user-interface-testing.md new file mode 100644 index 0000000..be28072 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-graficheskogo-interfeisa-vizualnoe-testirovanie-gui-graphical-user-interface-testing.md @@ -0,0 +1,67 @@ +# Тестирование графического интерфейса/визуальное тестирование (GUI - Graphical User Interface testing + +**Интерфейс** - это то, с помощью чего происходит “общение” между ПО и окружением. Существует два типа интерфейсов: + +* **Интерфейс командной строки** (CLI - Command Line Interface), где вы вводите текст в терминал, и компьютер отвечает на эту команду; +* **Графический интерфейс пользователя** (GUI - Graphical User Interface) , где вы взаимодействуете с компьютером, используя графическое представление, а не текст; + +**Тестирование графического интерфейса пользователя** (GUI) проводят с целью проверить функциональность и корректность отображения интерфейса пользователя (меню, панели инструментов, цвета, шрифты, размеры, значки, контент, кнопки и т. д., как они реагируют на ввод пользователя). + +**Техники тестирования GUI**: + +* **Manual testing**: При таком подходе тестеры вручную проверяют графические экраны в соответствии с требованиями, изложенными в документе бизнес-требований (business requirements document); +* **Capture & replay testing или Record and Replay**: Мы также можем провести тестирование графического интерфейса пользователя, используя некоторые инструменты автоматизации, разработанные специально для этого. Идея состоит в том, чтобы запустить приложение и записать взаимодействие, которое должно происходить между пользователем и самим приложением (движения мыши и т. д.), после чего эти тесты будут прогоняться, а фактический результат сравниваться с ожидаемым; +* **Model based testing**: Модель - это графическое описание поведения системы. Это помогает нам понять и спрогнозировать поведение системы. Модели помогают в создании эффективных тестовых примеров с использованием системных требований. Процесс: + + * Построение модели; + * Определение входных данных для модели; + * Расчет ожидаемых результатов для модели; + * Запуск тестов; + * Сравнение фактических результатов с ожидаемыми; + * Решение о дальнейших действиях по модели; + + Некоторые методы моделирования, на основе которых могут быть получены тестовые примеры: +* Графики - отображает состояние системы и проверяет состояние после некоторого ввода; +* Таблицы решений - таблицы, используемые для определения результатов для входных данных; + + Тестирование на основе моделей - это развивающийся метод создания тестовых примеров на основе требований. Его главное преимущество по сравнению с двумя вышеупомянутыми методами заключается в том, что он может определять нежелательные состояния, которых может достичь ваш графический интерфейс. + +**Примеры проверок**: + +* **Тип и размер шрифта**: шрифт одинаковый на всех экранах или хотя бы одного семейства, одинаковый размер шрифта заголовков, основного текста и т. д.; +* **Цвета**: должны быть сочетаемы. Придерживайтесь одних цветов и следуйте гайдлайнам. Вы не можете использовать 4 разных варианта оранжевого (если только он не является частью дизайна). Посмотрите на гиперссылки, фон, кнопки, основной текст и т. д.; +* **Стили значков**: вам не следует выбирать 5 разных стилей значков, если вы выбираете «плоские» значки, оставайтесь с плоскими значками; +* **Визуальные несоответствия**: постоянство всегда является ключевым моментом. Внешний вид во всем приложении должен быть одинаковым. Помимо внешнего вида, аббревиатуры также должны быть последовательными; +* **Несоответствия диалоговых окон**: если вы используете «выход» в одних диалоговых окнах, вы должны использовать «выход» в других; +* **Обязательные поля**: всегда лучше указать, что поле является обязательным, добавив к нему звездочку и предоставив пользователю своего рода предупреждение, если данные не указаны; +* **Ошибки типов данных**: всегда проверяйте, что указан правильный тип данных (даты, возраст, вес и т. д.); +* **Один и тот же документ, несколько открытий**: когда документ открывается / загружается более одного раза, вместо перезаписи вы можете переименовать его, добавив номер к имени файла; +* **Ширина полей**: очевидно, если разрешено определенное количество символов и введенные данные не должны превышать определенное число, вы должны прояснить это; +* **Экранные инструкции:** экраны (непонятные) должны содержать какие-то экранные инструкции, которые помогут / направят пользователя; +* **Индикаторы выполнения**: когда ждете результатов, индикаторы выполнения хороши, чтобы пользователи понимали, что им нужно чего-то ждать и что процесс все еще продолжается; +* **Подтверждение сохранения**: если вы можете вносить изменения в приложение без необходимости сохранения, всегда полезно убедиться, что пользователь не хочет сохранять, прежде чем перейти к другому экрану; +* **Подтверждение удаления**: поскольку мы подтверждаем сохранение, всегда полезно подтвердить, что пользователь хочет удалить элемент. Я уверен, что многие из вас (как и я) удаляли что-то на странице, не желая этого; +* **Ввод перед Drop down list**: когда у вас есть сотни вариантов на выбор в выпадающем меню, гораздо лучше иметь возможность сначала вводить текст, чем просматривать весь список; +* **Недопустимые параметры**: иногда чтобы выбрать какие-то параметры вам необходимо подтвердить другие. Эта опция должна отображаться как доступная, когда все требования выполнены; +* **Пункты меню**: показывать только те пункты меню, которые доступны в данный момент, вместо отображения всех пунктов, даже если они недоступны; +* **Сообщения об ошибках**: сообщения об ошибках должны быть информативными; +* **Рабочие шорткаты:** если в вашем приложении есть шорткаты, убедитесь, что все они работают, независимо от того, какие браузеры используются; +* **Разные разрешения**: проверить корректность верстки при масштабировании и на разных разрешениях; +* **Полосы прокрутки**; +* **Изображения**: сжатие, выравнивание и т.п.; +* **Проверка орфографии**; + +Источники: + +* [A Guide To GUI Testing](https://apiumhub.com/tech-blog-barcelona/ui-testing/) +* [GUI Testing Tutorial: User Interface (UI) TestCases with Examples](https://www.guru99.com/gui-testing.html) +* [GUI Testing Tutorial: A Complete User Interface (UI) Testing Guide](https://www.softwaretestinghelp.com/gui-testing/) + +Доп. материал: + +* [Эффективное тестирование верстки](https://habr.com/ru/company/oleg-bunin/blog/499638/) +* [#9 Артем, Сева и Визуальное тестирование](https://www.youtube.com/watch?v=d91Ca1Yz5q0\&ab\_channel=Heisenbug) +* [Кроссбраузерное визуальное тестирование - выбор подходящего инструмента для дизайн-системы NewsKit](https://telegra.ph/Krossbrauzernoe-vizualnoe-testirovanie---vybor-podhodyashchego-instrumenta-dlya-dizajn-sistemy-NewsKit-03-31) +* [О бедном мокапе замолвите слово](https://habr.com/ru/post/170549/) +* [A Pattern Library for Interaction Design](http://www.welie.com/patterns/index.php) +* [Основы IT для тестировщика / Виды интерфейсов / Что такое GUI, API, CLI?](https://www.youtube.com/watch?v=zs13PZhW9lM) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-kachestva-dannykh-data-quality-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-kachestva-dannykh-data-quality-testing.md new file mode 100644 index 0000000..f19ef92 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-kachestva-dannykh-data-quality-testing.md @@ -0,0 +1,34 @@ +# Тестирование качества данных (Data Quality Testing) + +_Качество данных (data quality): Атрибут данных, показывающий их корректность согласно некоторым предопределенным критериям: бизнес-ожиданиях, требованиям по полноте данных или их непротиворечивости. (ISTQB)_ + +Сегодняшний мир переживает очередную технологическую революцию, одним из аспектов которой является использование всевозможными компаниями накопленных данных для раскрутки собственного маховика продаж, прибылей и пиара. Представляется, что именно наличие хороших (качественных) данных, а также умелых мозгов, которые смогут из них делать деньги (правильно обработать, визуализировать, построить модели машинного обучения и т. п.), стали сегодня ключом к успеху для многих. Естественно, это потребовало технической организации этого процесса - подсоединиться к источнику данных, выкачать их, проверить, что они загружены в полном объёме и т. п. Количество таких процессов стало расти, и на сегодняшний день мы получили огромную потребность в Data Quality инженерах - тех, кто следил бы за потоком данных в системе (data pipelines), за качеством данных на входе и на выходе, делал бы выводы об их достаточности, целостности и прочих характеристиках. Обязанности Data Quality инженера не ограничиваются только рутинными ручными/автоматическими проверками на «nulls, count и sums» в таблицах БД, а требуют глубокого понимания бизнес нужд заказчика и, соответственно, способностей трансформировать имеющиеся данные в пригодную бизнес-информацию. + +Data Quality - один из этапов Data Management и первый пункт плана управления данными ([data management plan](https://dataladder.com/data-quality-management-plan/)). + +Аспекты качественных данных ([dimensions](https://smartbridge.com/data-done-right-6-dimensions-of-data-quality/)): + +* Точность (Accuracy): насколько хорошо информация отражает реальность? +* Полнота (Completeness). Соответствует ли вашим ожиданиям от того, что является всеобъемлющим? +* Согласованность (Consistency): соответствует ли информация, хранящаяся в одном месте, релевантным данным, хранящимся в другом месте? +* Своевременность (Timeliness): доступна ли ваша информация тогда, когда она вам нужна? +* Срок действия, соответствие (Validity aka Conformity): имеет ли информация определенный формат, тип или размер? Соответствует ли она бизнес-правилам / передовой практике? +* Целостность (Integrity): можно ли правильно объединить разные наборы данных, чтобы отразить общую картину? Хорошо ли определены и реализованы отношения? + +Сам процесс тестирования не подразумевает строгое копирование этих признаков в тест-кейсы и их проверку. В Data Quality, как и в любом другом виде тестирования, необходимо прежде всего отталкиваться от требований по качеству данных, согласованных с участниками проекта, принимающими бизнес-решения. + +Пример самого обобщенного перечня активностей Data Quality инженера: + +* Подготовить тестовые данные (валидные\невалидные\большие\маленькие) через автоматизированный инструмент. +* Загрузить подготовленный набор данных в исходный источник и проверить его готовность к использованию. +* Запустить ETL-процессы по обработке набора данных из исходного хранилища в окончательное или промежуточное с применением определённого набора настроек (в случае возможности задать конфигурируемые параметры для ETL-задачи). +* Верифицировать обработанные ETL-процессом данные на предмет их качества и соответствие бизнес-требованиям. + +При этом основной акцент проверок должен приходиться не только на то, что поток данных в системе в принципе отработал и дошёл до конца (что является частью функционального тестирования), а по большей части на проверку и валидацию данных на предмет соответствия ожидаемым требованиям, выявления аномалий и прочего. + +Источники + доп. материал: + +* [Тестировщик больших и маленьких данных: тренды, теория, моя история](https://habr.com/ru/company/epam\_systems/blog/495478/) +* [Data Quality Testing: Ways to Test Data Validity and Accuracy](https://lakefs.io/data-quality-testing/) +* [Data Quality Testing - A Quick Checklist to Measure and Improve Data Quality](https://dataladder.com/data-quality-test-checklist/) +* [Кто такой и чем занимается Data QA Engineer](https://habr.com/ru/company/skillfactory/blog/591061/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-khranilisha-storage-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-khranilisha-storage-testing.md new file mode 100644 index 0000000..e46aced --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-khranilisha-storage-testing.md @@ -0,0 +1,32 @@ +# Тестирование хранилища (Storage testing) + +Тестирование хранилища (Storage testing, Storage Performance testing) - это вид тестирования ПО, используемого для проверки того, как тестируемое ПО хранит данные в соответствующих каталогах и достаточно ли в них места для предотвращения неожиданного завершения работы из-за недостатка места на диске. ПО должно обрабатывать такие исключения и отображать предупреждающее сообщение для пользователя. + +**Зачем оно нужно?** + +* Медленное хранилище означает медленное время отклика, длительные запросы и более низкую доступность (availability) приложений; +* Медленное хранилище - это накладные расходы на обслуживание серверной инфраструктуры; +* Помогает найти практические ограничения хранилища перед развертыванием; +* Это помогает понять, как система отреагирует на замену или обновление оборудования; + +**Типы**: + +* Application testing: Тестирование приложений с примерами запросов в среде, похожей на боевую: + * Сравните время ответа [OLTP](https://www.oracle.com/database/what-is-oltp/); + * Сравните время выполнения batch; + * Сравните стабильные скорости потоковой передачи; +* Application Simulation: тестирование с использованием стандартного программного обеспечения, аналогичного целевому приложению: + * Протестировать на пиковые значения IOPS для баз данных + * Протестируйте на пиковые значения для среды потоковой передачи данных; + * Проверка задержек хранилища для обмена сообщениями или других однопоточных приложений; +* Benchmarking: Провести тестирование с использованием стандартного программного обеспечения; + * Проверка на повреждение данных; + +Источник: + +[Storage Testing Tutorial: What is, Type, Concepts](https://www.guru99.com/storage-testing.html) + +Доп. материал: + +* [Производительность распределенного хранилища: препродакшн тесты](https://habr.com/ru/company/selectel/blog/547314/) +* [Тестирование хранилищ данных (Data Warehouse)](https://habr.com/ru/company/tinkoff/blog/302670/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-klientskoi-chasti-i-servernoi-frontend-testing-vs.-backend-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-klientskoi-chasti-i-servernoi-frontend-testing-vs.-backend-testing.md new file mode 100644 index 0000000..cc23b3a --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-klientskoi-chasti-i-servernoi-frontend-testing-vs.-backend-testing.md @@ -0,0 +1,19 @@ +# Тестирование клиентской части и серверной (Frontend testing Vs. Backend testing) + +![https://www.guru99.com/images/1/111517\_1154\_FrontendTes1.png](https://www.guru99.com/images/1/111517\_1154\_FrontendTes1.png) + +**Frontend testing** - это тип тестирования, который проверяет уровень представления (Presentation layer) в 3-уровневой архитектуре (3 Tier Architecture). С точки зрения непрофессионала, вы проверяете GUI - все, что видно на экране, на стороне клиента. Для веб-приложения интерфейсное тестирование будет включать проверку функциональных возможностей, таких как формы, графики, меню, отчеты и т. д., а также связанный Javascript. Frontend testing - это термин, охватывающий различные стратегии тестирования, включая оценку производительности фронтенда, которая является хорошей практикой перед тестированием приложения с высокими пользовательскими нагрузками. Тестировщик должен хорошо понимать бизнес-требования для выполнения этого типа тестирования. Ранее оптимизация производительности означала оптимизацию на стороне сервера. Это было связано с тем, что большинство веб-сайтов были в основном статичными, а большая часть обработки выполнялась на стороне сервера. Однако сегодня веб-приложения становятся более динамичными и в результате код на стороне клиента нередко становится причиной низкой производительности. + +Тестирование клиентской части невозможно в некоторых случаях: бэкенд разрабатывают быстрее, чем фронтенд; очевидно, если клиентская часть отсутствует в принципе ( самодостаточное приложение, терминальная команда). + +**Backend testing** - это тип тестирования, который проверяет уровень приложений и базы данных 3-уровневой архитектуры. В сложном программном приложении, таком как ERP, внутреннее тестирование повлечет за собой проверку бизнес-логики на уровне приложений. Для более простых приложений бэкэнд-тестирование проверяет серверную часть или базу данных. Это означает, что данные, введенные в интерфейс, будут проверены в базе данных. Базы данных проверяются на наличие свойств ACID, операций CRUD, их схемы, соответствия бизнес-правилам. Базы данных также проверяются на безопасность и производительность. Производится проверка целостности данных, Проверка достоверности данных, Тестирование функций, процедур и триггеров. При внутреннем тестировании нет необходимости использовать графический интерфейс. Вы можете напрямую передавать данные с помощью браузера с параметрами, необходимыми для функции, чтобы получить ответ в некотором формате по умолчанию. Например, XML или JSON. Вы также подключаетесь к базе данных напрямую и проверяете данные с помощью SQL-запросов. + +Источник: + +[Frontend Testing Vs. Backend Testing: What’s the Difference?](https://www.guru99.com/frontend-testing-vs-backend-testing.html) + +Доп. материал: + +* [Как найти границы на клиенте и сервере](https://habr.com/ru/post/510458/) +* [Как Иван ошибку в бэкенде локализовывал](https://habr.com/ru/company/funcorp/blog/518248/) +* [Круглый стол "Почему не стоит тестировать бэкенд руками"](https://www.youtube.com/watch?v=XSeoWpSlcig\&feature=youtu.be\&ab\_channel=PodlodkaPodcast) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-lokalizacii-globalizacii-i-internacionalizacii-localization-globalization-internatio.md b/vidy-metody-urovni-testirovaniya/testirovanie-lokalizacii-globalizacii-i-internacionalizacii-localization-globalization-internatio.md new file mode 100644 index 0000000..72e75f0 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-lokalizacii-globalizacii-i-internacionalizacii-localization-globalization-internatio.md @@ -0,0 +1,52 @@ +# Тестирование локализации, глобализации и интернационализации (Localization/ globalization/internatio + +Глобализированное ПО - это ПО, функционирующее одинаково качественно независимо от географической, культурной и национальной среды. Тестирование глобализации концентрируется на выявлении потенциальных проблем в дизайне продукта, которые могут испортить глобализацию. Например, разработчик должен заложить в CSS основу для вертикального текста, если в будущем планируется локализовать продукт на язык с вертикальным письмом, обработку почтовых индексов для разных стран (где-то цифры, где-то цифры с буквами и т.п.). Оно гарантирует, что код может обрабатывать желаемую международную поддержку без нарушения какой-либо функциональности. А также, что не будет никакой потери данных и проблем с отображением. + +**Globalization = Internationalization + Localization**. + +**Интернационализация ПО** (Internationalization (I18N)) - это особый процесс, при котором веб-софт создается таким образом, чтобы оно было равноудаленным от какой-либо культуры и (или) специфики определенного географического региона. Например, одна из задач по интернационализации ПО - корректное редактирование логики всех подключенных параметров форматирования (формат даты, времени, цифровое и валютное форматирование). Также, тестировщики во время проверки на соответствие ПО требованиям I18N тестируют работу продукта на одинаковую работу в разных регионах и культурах мира. Основной задачей тестирования интернациональности является проверка того, может ли программный код работать со всей международной поддержкой без нарушения функциональности, что может привести к потере данных или проблемам целостности информации. В основном, фокус тестирования интернационализации направлен на: + +* Тестирование языковой совместимости: это включает проверку того, может ли продукт правильно работать в определенной языковой среде; +* Тестирование функциональности: это включает выполнение регрессионных тестов функциональности в различных языковых средах и ввод строк на родном языке. Это включает в себя проверку того, правильно ли отображается и принимается на ввод валюта, дата, время, индекс и т.п.; +* Проверка пользовательского интерфейса: пытается выявить любые визуальные проблемы, такие как проблемы с графикой, наложение текста, усечение текста и т. д.; +* Тестирование совместимости: это включает тестирование программного обеспечения на целевых кросс-платформах, операционных системах, версиях приложений и т. д.; +* Тестирование юзабилити: проверяет простоту использования приложения; +* Тестирование установки: это включает попытку установить приложение на разных родных языках и проверить, правильно ли отображаются все сообщения об установке в языковых настройках; + +**Локализация ПО** (Localization (L10N)) - деятельность по модификации ПО в соответствии с определенными региональными настройками (языком, географической территорией, культурными особенностями). В данный вид проверки входит необходимость выполнения работ по переводу всего контента программного обеспечения для конечного пользователя. Во время перевода должны учитываться иконки, информационная графика, справочные материалы, техническая документация и иные культурные особенности регионов (например, онлайн-сервис по заказу бургеров не будет показывать корову на главной странице в Индии или свинью в мусульманских странах). На что обратить внимание: + +* Длина переведенных слов; +* Параметры шрифта пользовательского интерфейса; +* Ввод текста в разных локализациях; +* RTL-языки (справа-налево) или вертикальные; +* Перевод сокращений или аббревиатур; +* Мета-теги (проблемы с SEO или отображением имени вкладки (title, description, keywords)); +* Соответствие мер исчисления, валюты, postal code и т.п.; + +**Примеры проверок**: + +* **Языковой словарь**: Глобализированный продукт поддерживает множество языков. Чем больше языков он поддерживает, тем больше потребность в тестировании. Вы можете использовать языковые переводчики и по одному проверять, использует ли приложение правильный словарный запас для каждого языка; +* **Пользовательский интерфейс:** Как вы знаете, у каждого языкового сценария свой стиль письма (некоторые пишутся слева направо, а некоторые - справа налево), и пространство, необходимое для слов, может варьироваться от одного языка к другому. Таким образом, необходимо протестировать макет пользовательского интерфейса на каждом языке, чтобы убедиться, что пользовательский интерфейс чистый и отсутствуют такие проблемы, как перекрытие текста, несовпадение текста, проблемы с навигацией и т. д.; +* **Обозначение даты и времени:** Форматы отображения даты и времени зависят от региона. Например, наиболее распространенный формат даты в США - мм / дд / гггг. В отличие от этого, наиболее распространенный формат даты в Европе - дд / мм / гггг. С другой стороны, Канада принимает как ДД / ММ / ГГГГ, так и ММ / ДД / ГГГГ. Точно так же некоторые страны используют 24-часовую нотацию, в то время как другие используют 12-часовую нотацию. Поэтому очень важно убедиться, что дата и время отображаются в соответствующем формате при переключении на другие регионы / страны; +* **Корректность даты / времени:** Это не только формат, но и фактическая дата и время варьируются от региона к региону в зависимости от часового пояса. Например, 11:53 субботы по индийскому стандартному времени (IST) - 1:23 субботы по восточному времени (ET). Значит, необходимо проверить правильность отображения даты и времени в приложении при переключении в разные страны; +* **Формат валюты и обработка курсов конвертации:** Если ваше приложение включает электронную коммерцию, проверка валюты становится критически важной. Числовые форматы валют варьируются от страны к стране. Итак, вам следует позаботиться о форматировании. Еще одна важная вещь - отображать правильный символ валюты вместе с единицами измерения. Например, если цена товара составляет 100 рупий, но в приложении он упоминается как «100», это может сбить с толку покупателя, так как это 100 рупий или 100 долларов. Следующим важным тестом должно быть подтверждение того, позаботились ли о коэффициентах конверсии. Также рекомендуется отображать обменный курс для пользователя, чтобы сделать его более удобным и полезным; +* **Формат номера телефона, адреса и почтового индекса:** Порядок отображения адресов зависит от языка. Например, на японском языке порядок адресов - это почтовый индекс, штат, город, а на английском языке порядок адресов - это имя, город, штат, почтовый индекс и т. д. Итак, вам необходимо проверить, нормально ли работает отображение порядка адресов при переключении между разными языками, поддерживаемыми вашим приложением. Точно так же длина и формат телефонного номера также различаются от страны к стране. В наши дни у нас также есть [рекомендация E.164](https://en.wikipedia.org/wiki/E.164) для форматирования чисел в соответствии с общей международной нотацией; + +Примечание автора: частный случай задачи на тестирование локализации в android/ios приложениях может быть и в контексте файлов strings, в которых приложение хранит все текстовые строки. Строки могут быть с динамически подставляемыми параметрами чтобы содержимое строки динамически изменялось в зависимости от чего-либо. Например: “Вы сможете запросить код повторно через %s” или “Закрыто. До открытия %1$d ч.”, В данном случае потребуется проверить переводы на предмет того, что динамические аргументы в строках не были сломаны переводчиками. Лично я для этого писал скрипт на python, он есть в другом репозитории. + +Источники: + +* [What Is Globalization Testing (A Complete Guide)](https://www.softwaretestinghelp.com/globalization-testing/) + +Доп. материал: + +* [Тестировщик с нуля / Урок 8 / Тестирование локализации](https://www.youtube.com/watch?v=VQC0bVopwXg) +* [Sample International Test Cases](https://docs.microsoft.com/en-us/globalization/testing/sample-international-test-cases) +* [Страх и ненависть локализации в больших проектах. Доклад Яндекса](https://habr.com/ru/company/yandex/blog/545698/) +* [Локализационное тестирование: зачем оно нужно приложению или сайту?](https://habr.com/ru/company/alconost/blog/521330/) +* [Почему интернационализация и локализация имеют значение](https://habr.com/ru/company/otus/blog/523112/) +* [Гайд по тестированию локализации и интернационализации, а также большой и полезный checklist](https://habr.com/ru/post/532836/) +* [Accelerate localization from code to delivery](https://lokalise.com) +* [Internationalization & localization testing](https://www.slideshare.net/Robin0590/internationalization-localization-testing) +* [Android Developers - Docs - Reference - Formatter](https://developer.android.com/reference/java/util/Formatter.html) +* [Тестирование локализации](https://www.software-testing.ru/library/testing/testing-for-beginners/3746-localization-testing) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-masshtabiruemosti-scalability-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-masshtabiruemosti-scalability-testing.md new file mode 100644 index 0000000..fc04fc0 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-masshtabiruemosti-scalability-testing.md @@ -0,0 +1,12 @@ +# Тестирование масштабируемости (Scalability testing) + +Тестирование масштабируемости проводится для определения способности приложения масштабироваться с точки зрения пользовательской нагрузки, количества транзакций, объема данных и т. д. Цель теста масштабируемости отличается от стрессового или нагрузочного тестирования. Например, компания ожидает шестикратного увеличения нагрузки на серверы в течение следующих двух месяцев. Им может потребоваться увеличить производительность сервера и сократить время обработки запроса, чтобы лучше обслуживать посетителей. Если приложение масштабируемое, вы можете сократить это время, обновив оборудование сервера, например, вы можете увеличить частоту ЦП и добавить больше ОЗУ. Также вы можете улучшить производительность запросов, изменив программное обеспечение сервера, например, заменив хранилища данных в текстовых файлах базами данных SQL Server. Чтобы найти лучшее решение, вы можете сначала протестировать изменения оборудования, затем изменения программного обеспечения, а затем сравнить результаты тестов. + +![https://3.bp.blogspot.com/-gPgmUKp\_Slo/WGpIluEQo5I/AAAAAAAAAiQ/SuqNljCUmt8237AJALoUpbH1UNyvIGhowCLcB/s1600/Scal.png](https://3.bp.blogspot.com/-gPgmUKp\_Slo/WGpIluEQo5I/AAAAAAAAAiQ/SuqNljCUmt8237AJALoUpbH1UNyvIGhowCLcB/s1600/Scal.png) + +Пример: если тестирование масштабируемости определяет максимальную нагрузку в 10 000 пользователей, то для обеспечения масштабируемости системы разработчикам необходимо принять меры по таким факторам, как уменьшение времени отклика после достижения лимита в 10 000 пользователей или увеличение размера ОЗУ для соответствия растущему количеству пользовательских данных. + +Источники: + +* [What Is Scalability Testing? How To Test The Scalability Of An Application](https://www.softwaretestinghelp.com/what-is-scalability-testing/) +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-metodom-belogo-yashika-white-box-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-belogo-yashika-white-box-testing.md new file mode 100644 index 0000000..f8d09a1 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-belogo-yashika-white-box-testing.md @@ -0,0 +1,64 @@ +# Тестирование методом белого ящика (White Box Testing) + +_Тестирование методом белого ящика (white-box testing): Тестирование, основанное на анализе внутренней структуры компонента или системы (ISTQB)._ + +_Тестирование на основе структуры (structure-based testing): Динамическое тестирование, для которого тесты являются результатом анализа структуры элемента тестирования. Примечание. Тестирование на основе структуры не ограничено использованием на уровне компонентов, а может использоваться на всех уровнях, например при покрытии пункта меню, как части тестирования системы. (ГОСТ 56920)_ + +Тестирование методом белого ящика (также: прозрачного, открытого, стеклянного ящика; основанное на коде или структурное тестирование) - метод тестирования ПО, который предполагает, что внутренняя структура/устройство/реализация системы известны тому, кто её тестирует. Мы выбираем входные значения, основываясь на знании кода, который будет их обрабатывать. Точно так же мы знаем, каким должен быть результат этой обработки. Знание всех особенностей тестируемой программы и ее реализации - обязательны для этой техники. Тестирование белого ящика - углубление во внутреннее устройство системы, за пределы ее внешних интерфейсов. + +Техника белого ящика применима на разных уровнях тестирования - модульном, интеграционном и системном, но чаще применяется для юнит-тестирования этого участка кода самим разработчиком или SDET. Тестирование белого ящика - это больше, чем тестирование кода: это **тестирование путей**. Обычно тестируемые пути находятся внутри модуля (модульное тестирование). Но мы можем применить эту же методику для тестирования путей между модулями внутри подсистем, между подсистемами внутри систем, и даже между целыми системами. + +**Тестирование белого ящика - это покрытие требований в коде**: + +* Code coverage; +* Segment coverage: каждый оператор кода выполняется один раз; +* Branch Coverage or Node Testing: покрытие каждой ветки кода из всех возможных было выполнено; +* Compound Condition Coverage: Для нескольких условий проверяется каждое условие с несколькими путями и комбинацией разных путей для достижения этого условия; +* Basis Path Testing: каждый независимый путь в коде взят на тестирование; +* Data Flow Testing (DFT): в этом подходе вы отслеживаете конкретные переменные посредством каждого возможного вычисления, тем самым определяя набор промежуточных путей через код. DFT имеет тенденцию отражать зависимости, но в основном это происходит через последовательности манипуляций с данными. Короче говоря, каждая переменная данных отслеживается, и ее использование проверяется. Этот подход имеет тенденцию обнаруживать ошибки, такие как переменные, которые используются, но не инициализируются, или объявлены, но не используются, и т.д. (компиляторы/линтеры/IDE уже вполне способны на это сами); +* Path Testing: тестирование пути - это определение и покрытие всех возможных путей прохождения через код; +* Loop Testing: эти стратегии относятся к тестированию одиночных циклов, составных (concatenated) циклов и вложенных циклов; + +Используя покрытие Statement и Branch, вы обычно достигаете 80-90% покрытия кода, что является достаточным. + +**Процесс** **White box testing**: + +* Анализируется реализация программы; +* В программе определяются возможные маршруты; +* Выбираются такие входные данные, чтобы программа выполнила выбранные пути. Это называется +* сенсибилизацией путей. Заранее определяются ожидаемые результаты для входных данных; +* Тесты выполняются; +* Результаты анализируются; + +**Преимущества White box testing**: + +* тестирование может производиться на ранних этапах: нет необходимости ждать создания пользовательского интерфейса; +* можно провести более тщательное тестирование, с покрытием большого количества путей выполнения программы; + +**Недостатки White box testing**: + +* Количество выполняемых путей может быть настолько большим, что не удастся проверить их все. Как правило, попытка протестировать все пути выполнения с помощью тестирования белого ящика так же невозможна, как и тестирование всех комбинаций всех входных данных при тестировании черного ящика; +* Выбранные тест-кейсы могут не содержать данные, которые будут чувствительны к ошибкам. Например: p=q/r; может выполняться корректно, за исключением случая, когда r=0. y=x^2; тест не выявит ошибок в случаях, когда x=0, y=0 и x=2, y=4; +* Тестирование белого ящика предполагает, что поток управления правильный (или близок к правильному). Поскольку эти тесты основаны на существующих путях, с помощью нельзя +* обнаружить несуществующие пути; +* Тестировщик должен обладать навыками программирования для того, чтобы понять и +* оценить тестируемое программное обеспечение; + +**White box testing нужно**: + +Чтобы убедиться, что: + +* Все независимые пути в модуле были проверены хотя бы один раз; +* Все логические решения проверены на их истинное и ложное значения; +* Все циклы выполняются на своих границах и в пределах своих рабочих границ валидности внутренних структур данных; + +Чтобы обнаружить следующие типы ошибок: + +* Логическая ошибка имеет тенденцию закрасться в нашу работу, когда мы разрабатываем и реализуем функции, условия или элементы управления, которые не входят в программу; +* Ошибки проектирования из-за разницы между логическим потоком программы и фактической реализацией; +* Типографические ошибки и проверка синтаксиса; + +Источники: + +* [White Box Testing: A Complete Guide With Techniques, Examples, & Tools](https://www.softwaretestinghelp.com/white-box-testing-techniques-with-example/) +* Ли Копланд - “A Practitioner's Guide to Software Test Design”, Секция II. Методы тестирования белого ящика diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-metodom-chernogo-yashika-black-box-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-chernogo-yashika-black-box-testing.md new file mode 100644 index 0000000..1727984 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-chernogo-yashika-black-box-testing.md @@ -0,0 +1,194 @@ +# Тестирование методом черного ящика (Black Box Testing) + +_Тестирование методом черного ящика (black box testing): Тестирование, функциональное или нефункциональное, без знания внутренней структуры компонента или системы (ISTQB)._ + +_Тестирование на основе спецификации (specification-based testing): Тестирование, основным базисом которого являются внешние вводы и выводы элемента тестирования, обычно на основе спецификации, а не ее реализация в исходном коде или исполнимом программном обеспечении. (ГОСТ 56920)_ + +Другие названия: Behavioral Testing, Specification-Based Testing, Input-Output Testing, непрозрачный ящик (opaque-box), закрытый ящик (closed-box), тестирование на основе спецификации (specification-based testing) или тестирование с глазу на глаз (eye-to-eye testing). + +**Тестирование методом «черного ящика»** - это стратегия, в которой тестирование основано исключительно на требованиях и спецификациях, при этом мы не знаем, как устроена внутри тестируемая система и работаем исключительно с внешними интерфейсами тестируемой системы или компонента. Тестирование черного ящика может быть применено на всех уровнях - модульном, интеграционном, системном и приемочном. + +**Functional Testing**: этот тип касается функциональных требований или спецификаций приложения (functional requirements or specifications). Здесь различные действия или функции системы тестируются путем предоставления входных данных и сравнения фактического выхода с ожидаемым выходом. Например, когда мы тестируем раскрывающийся список, мы нажимаем на него и проверяем, что он раскрывается и все ожидаемые значения отображаются. Вот несколько основных типов функционального тестирования: + +* Smoke Testing; +* Sanity Testing; +* Integration Testing; +* System Testing; +* Regression Testing; +* User Acceptance Testing; + +**Non-Functional Testing**: Помимо функциональности требований, есть несколько нефункциональных аспектов, которые необходимо протестировать, чтобы улучшить качество и производительность приложения. Несколько основных типов нефункционального тестирования включают: + +* Usability Testing; +* Load Testing; +* Performance Testing; +* Compatibility Testing; +* Stress Testing; +* Scalability Testing; + +**Преимущества Black box testing**: + +* Тестировщику не обязательно иметь технический опыт. Важно проводить тестирование, оказываясь на месте пользователя и думая с его точки зрения; +* Тестирование можно начинать после завершения разработки проекта / приложения. И тестировщики, и разработчики работают независимо, не мешая друг другу; +* Это более эффективно для больших и сложных приложений; +* Дефекты и несоответствия можно выявить на ранней стадии тестирования; + +**Недостатки Black box testing**: + +* Без каких-либо технических или программных знаний есть вероятность пропустить возможные условия тестируемого сценария; +* В оговоренное время есть вероятность протестировать не все входные и выходные значения; +* Полный Test Coverage невозможен для больших и сложных проектов; + +**Парадигмы тестирования методом черного ящика (Paradigms of Black Box Software Testing)** + +Парадигма создает основное направление мышления - она дает понимание и направление для дальнейших исследований или работы. Парадигма тестирования будет определять типы тестов, которые (для человека, работающего в рамках этой парадигмы) актуальны и интересны. Список парадигм: + +* **Domain driven** + * Ключевые идеи: + * «Попробуйте диапазоны и варианты»; + * «Разделите мир на классы»; + * Основной вопрос или цель: + * Стратегия стратифицированной выборки. Разделите большое пространство возможных тестов на подмножества. Выберите лучших представителей из каждого набора; + * Примеры кейсов: + * Анализ эквивалентности простого числового поля; + * Тестирование совместимости принтеров; + * Сильные стороны: + * Нахождение ошибок с наибольшей вероятностью с помощью относительно небольшого набора тестов; + * Интуитивно понятный подход, хорошо обобщает; + * Слепые зоны: + * Ошибки, выходящие за рамки границ, или в очевидных особых случаях; + * Кроме того, фактические домены часто остаются неизвестными; +* **Stress driven** + * Ключевые идеи: + * «Сокруши продукт»; + * «Проведи его через отказы; + * Основной вопрос или цель: + * Узнать о возможностях и слабых сторонах продукта, проведя его через отказ и за его пределами. Что сбои в экстремальных случаях говорят нам об изменениях, необходимых в работе программы в нормальных случаях? + * Примеры кейсов: + * Большие объемы данных, подключения устройств, длинные цепочки транзакций; + * Условия нехватки памяти, сбои устройств, вирусы и другие проблемы; + * Сильные стороны: + * Выявление слабых мест, в т.ч. дыр в безопасности; + * Слепые зоны: + * Слабости, которые не становятся более заметными из-за стресса; +* **Specification driven** + * Ключевые идеи: + * «Проверяйте каждое требование»; + * Основной вопрос или цель: + * Проверяйте соответствие (conformance) продукта каждому заявлению в каждой спецификации, документе с требованиями и т. д.; + * Примеры кейсов: + * Матрица прослеживаемости, отслеживает тестовые случаи, связанные с каждым элементом спецификации; + * Сильные стороны: + * Критическая защита от гарантийных претензий, обвинений в мошенничестве, потери доверия со стороны клиентов; + * Слепые зоны: + * Любые проблемы, не указанные в спецификациях или плохо решенные в спецификациях; +* **Risk driven** + * Ключевые идеи: + * «Сначала найди наибольшие ошибки»; + * Основной вопрос или цель: + * Расставьте приоритеты при тестировании с точки зрения относительного риска различных областей или проблем, которые мы могли бы проверить; + * Примеры кейсов: + * Переформулированный анализ классов эквивалентности; + * Тестируйте в порядке частоты использования; + * Стресс-тесты, тесты на обработку ошибок, тесты безопасности, тесты для поиска прогнозируемых или предполагаемых ошибок; + * Образец из списка предсказанных ошибок; + * Сильные стороны: + * Оптимальная приоритезация (при условии, что мы правильно идентифицируем и расставляем по приоритетам риски); + * Тесты высокой мощности; + * Слепые зоны: + * Риски, которые не были идентифицированы или которые на удивление более вероятны; +* **Random / statistical testing** + * Ключевые идеи: + * «Объемное тестирование с новыми кейсами»; + * Основной вопрос или цель: + * Пусть компьютер создает, выполняет и оценивает огромное количество тестов; + * Примеры кейсов: + * Валидация функции или подсистемы (например, тестирование эквивалентности функций) на основе оракулов (Oracle-driven); + * Стохастическое (переход между состояниями) тестирование для выявления конкретных сбоев (ассерты, утечки и т. д.); + * Оценка статистической надежности; + * Частичный или эвристический оракул, чтобы найти некоторые типы ошибок без общей проверки; + * Сильные стороны: + * Регрессия не зависит каждый раз от одного и того же старого теста; + * Частичные оракулы могут быстро и дешево находить ошибки в молодом коде; + * Меньше вероятность пропустить невидимые извне внутренние оптимизации; + * Может обнаруживать сбои, возникающие из-за длинных сложных цепочек, которые было бы трудно создать в соответствии с запланированными испытаниями; + * Слепые зоны: + * Нужно уметь отличать pass от failure. Слишком много людей думают: «Not crash = not fail»; + * Кроме того, эти методы часто охватывают многие типы рисков, но затемняют необходимость в других тестах, которые не поддаются автоматизации; +* **Function Testing** + * Ключевые идеи: + * «Модульное тестирование черного ящика»; + * Основной вопрос или цель: + * Тщательно проверяйте каждую функцию по очереди; + * Примеры кейсов: + * Таблица, тестируйте каждый элемент по отдельности; + * База данных, тестируйте каждый отчет по отдельности; + * Сильные стороны: + * Тщательный анализ каждого протестированного элемента; + * Слепые зоны: + * Упускает взаимодействия, пропускает исследование преимуществ предлагаемые программой; +* **Regression Testing** + * Ключевые идеи: + * «Повторить тестирование после изменений»; + * Основной вопрос или цель: + * Управляйте рисками, связанными с тем, что (а) исправление ошибки не устраняет ошибку или (б) исправление (или другое изменение) имело побочный эффект (side effect); + * Примеры кейсов: + * Регрессия ошибок, регрессия старых исправлений, общая функциональная регрессия; + * Наборы автоматизированной регрессии графического интерфейса; + * Сильные стороны: + * Обнадеживает, укрепляет доверие, удобен для регуляторов; + * Слепые зоны: + * Все, что не вошло в регрессионную серию. Кроме того, поддержание этого стандартного списка может быть очень дорогостоящим; +* **Scenario / use case / transaction flow** + * Ключевые идеи: + * «Делай что-нибудь полезное и интересное»; + * «Делайте одно за другим»; + * Основной вопрос или цель: + * Сложные случаи, отражающие реальное использование; + * Примеры кейсов: + * Оценивайте продукт на предмет соответствия бизнес-правилам, данным о клиентах и продукции конкурентов; + * Тестирование жизненного цикла / Life history testing ([Hans Buwalda’s “soap opera testing”](https://www.agileconnection.com/sites/default/files/presentation/file/2018/W11\_14.pdf)); + * Варианты использования (Use cases) - это более простая форма, часто основанная на возможностях продукта и пользовательской модели, а не на естественном наблюдении за системами такого типа; + * Сильные стороны: + * Сложные, реалистичные события. Может помогать справляться в ситуациях, которые слишком сложны для моделирования; + * Выявляет сбои, которые происходят (развиваются) с течением времени; + * Слепые зоны: + * Отказ одной функции может сделать этот тест неэффективным; + * Необходимо хорошо подумать, чтобы добиться хорошего покрытия; +* **User testing** + * Ключевые идеи: + * Стремитесь к реализму; + * Давайте попробуем это с настоящими людьми (для разнообразия); + * Основной вопрос или цель: + * Выявить сбои, которые могут возникнуть по вине человека, то есть сбои в общей системе человек / машина / программное обеспечение; + * Примеры кейсов: + * Бета-тестирование; + * Собственные эксперименты с использованием стратифицированной выборки целевого рынка; + * Сильные стороны: + * Проблемы дизайна более достоверны; + * Может продемонстрировать, что некоторые аспекты продукта непонятны или приводят к высокому проценту ошибок при использовании; + * Внутренние тесты можно контролировать с помощью логов, видео, отладчиков и других инструментов; + * Внутренние тесты могут быть сосредоточены на областях / задачах, которые, по вашему мнению, являются (или должны быть) спорными; + * Слепые зоны: + * Покрытие не гарантировано (серьезные пропуски бета-тестирования, других пользовательских тестов); + * Тестовые примеры могут быть плохо спроектированы, тривиальны, вряд ли выявляют малозаметные ошибки; + * Бета-тестирование стоит денег; +* **Exploratory testing** + * Ключевые идеи: + * «Интерактивное, одновременное исследование, разработка тестов и тестирование»; + * Основной вопрос или цель: + * ПО поступает тестировщику без документации. Тестировщик должен одновременно узнавать о продукте и о тестовых примерах / стратегиях, которые позволят выявить продукт и его дефекты; + * Примеры кейсов: + * Полное тестирование test-it-today; + * Сторонние компоненты; + * Горилла-тестинг; + * Сильные стороны: + * Продуманная стратегия получения результата в неизвестности; + * Стратегия выявления несоответствия ожиданиям клиентов; + * Слепые зоны: + * Чем меньше мы знаем, тем больше рискуем упустить. + +Источники: + +* [Black Box Testing: An In-Depth Tutorial With Examples And Techniques](https://www.softwaretestinghelp.com/black-box-testing/) +* [Cem Kaner, James Bach - “Paradigms of Black Box Software Testing”](http://kaner.com/pdfs/swparadigm.pdf) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-metodom-serogo-yashika-grey-box-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-serogo-yashika-grey-box-testing.md new file mode 100644 index 0000000..cc5a62d --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-metodom-serogo-yashika-grey-box-testing.md @@ -0,0 +1,14 @@ +# Тестирование методом серого ящика (Grey Box Testing) + +Тестирования методом серого ящика вообще нет в ISTQB, тем не менее много где можно встретить упоминания этого типа тестирования. В целом оно определяется как метод тестирования ПО, который предполагает комбинацию White Box и Black Box подходов или как дополненный черный ящик. Т.е., внутреннее устройство/код известны/используется лишь частично, и, например, имея доступ к внутренней структуре и алгоритмам работы ПО, можно написать более эффективные тест-кейсы, но само тестирование проводится с помощью техники черного ящика, то есть, с позиции пользователя. + +Примеры: тестирование с проверкой корректности записей в БД; работа с логами и метриками для поиска root cause проблем. + +**Техники**: + +* **Матричное тестирование (Matrix Testing)**: разработчики предоставляют все переменные в программе, а также связанные с ними технические и бизнес-риски. Методика матричного тестирования проверяет риски, определенные разработчиками. Матричный метод устанавливает все используемые переменные в программе. Этот метод помогает идентифицировать и удалять переменные, которые не используются в программе, и, в свою очередь, помогает увеличить скорость работы программного обеспечения; +* **Регрессионное тестирование (Regression Testing)**: регрессионное тестирование выполняется, когда в программное обеспечение вносятся какие-либо изменения или исправляется какой-либо дефект. Это делается для того, чтобы новое изменение или исправление не повлияло на существующие функциональные возможности программного обеспечения; +* **Тестирование ортогональных массивов или OAT (Orthogonal Array Testing or OAT)**: этот метод тестирования больше используется для сложных функций или приложений, когда требуется максимальное покрытие кода с минимальным количеством test cases и имеет большие тестовые данные с n числом комбинаций; +* **Pattern testing**: тестирование по образцу выполняется на основе предыдущих дефектов, обнаруженных в ПО. Записи о дефектах анализируются на предмет причин дефектов, и создаются test cases на основе этих дефектов и их причин; + +Источник: [Grey Box Testing Tutorial With Examples, Tools And Techniques](https://www.softwaretestinghelp.com/grey-box-testing-tutorial/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-na-otkaz-i-vosstanovlenie-failover-and-recovery-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-na-otkaz-i-vosstanovlenie-failover-and-recovery-testing.md new file mode 100644 index 0000000..f29d8eb --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-na-otkaz-i-vosstanovlenie-failover-and-recovery-testing.md @@ -0,0 +1,26 @@ +# Тестирование на отказ и восстановление (Failover and Recovery testing) + +_Тестирование отказоустойчивости (failover testing): Тестирование при помощи эмуляции отказов системы или реально вызываемых отказов в управляемом окружении. После вызванного отказа проверяется механизм отказоустойчивости с целью удостовериться, что данные не потеряны или не испорчены, и достигнут оговоренный уровень обслуживания (например, доступности функций или время отклика) (ISTQB)._ + +Тестирование на отказ и восстановление (Failover and Recovery testing, Disaster Recovery Testing) - подвид тестирования производительности, проверяет тестируемый продукт с точки зрения способности противостоять и успешно восстанавливаться после возможных сбоев, возникших в связи с ошибками ПО, отказами оборудования или проблемами связи/сети. Failover - проверка систем восстановления (или дублирующих основной функционал систем), которые, в случае возникновения сбоев, обеспечат сохранность и целостность данных тестируемого продукта. Методика подобного тестирования заключается в симулировании различных условий сбоя, последующем изучении и оценке реакции защитных систем. В процессе подобных проверок выясняется, была ли достигнута требуемая степень восстановления системы после возникновения сбоя. В отличие от тестирования надежности (Reliability Testing), которое проводится, чтобы найти отказ в конкретной точке, где он происходит, Recovery Testing проводится для проверки того, насколько хорошо система восстанавливается после сбоя или аварии. + +Для наглядности рассмотрим некоторые варианты подобного тестирования и общие методы их проведения. Объектом тестирования в большинстве случаев являются весьма вероятные эксплуатационные проблемы, такие как: + +* Проблемы с сетью; +* Сбой питания; +* Внешний сервер недоступен (External server not reachable); +* Сервер не отвечает (Server not responding); +* Отсутствует файл dll; +* Перегрузка базы данных; +* Остановленные сервисы/службы; +* Физические условия; +* Внешнее устройство не отвечает; +* Потеря сигнала беспроводной сети; + +Источники: + +* [What Is Recovery Testing In Software Testing](https://www.softwaretestinghelp.com/recovery-testing-tutorial/) + +Доп. материал: + +* [Importance of Failover Testing during Test Planning of Safety Critical Systems](https://www.softwaretestinggenius.com/importance-of-failover-testing-during-test-planning-of-safety-critical-systems/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-na-sootvetstvie-conformance-compliance-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-na-sootvetstvie-conformance-compliance-testing.md new file mode 100644 index 0000000..66ab260 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-na-sootvetstvie-conformance-compliance-testing.md @@ -0,0 +1,15 @@ +# Тестирование на соответствие (Conformance/Compliance testing) + +_Соответствие (compliance): Способность программного продукта соответствовать стандартам, соглашениям или правилам законодательства и другим подобным предписаниям. (ISTQB)_ + +Compliance - официальное соответствие ПО различным стандартам, законам, сертификация и т.п. + +Conformance - неофициальные, внутренние стандарты организации, добровольное обязательство делать что-либо признанным образом, либо стремление к Compliance, но которое не закончено / не подтверждено формально. + +Источники: + +* [Compliance Vs. Conformance](https://visionintegrity.ca/compliance-vs-conformance/) + +Доп. материал: + +* [Невидимый регулятор. Как подстроить систему под закон?](https://www.youtube.com/watch?v=y7wspIeTD1k) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-nadezhnosti-reliability-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-nadezhnosti-reliability-testing.md new file mode 100644 index 0000000..9f0c01e --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-nadezhnosti-reliability-testing.md @@ -0,0 +1,26 @@ +# Тестирование надежности (Reliability Testing) + +_Надежность (reliability): Способность программного продукта функционировать при заданных условиях на протяжении определенного периода времени, или для определенного количества операций. (ISO 9126)_ + +Надежность (Reliability) - это «вероятность безотказной работы программного обеспечения в течение определенного периода времени в определенной среде», т.е. это результат, к которому стремятся разработчики, способом достижения которого является устойчивость. Тестирование надежности связано с качеством программного обеспечения и стандартизацией продуктов. Если мы можем повторять тест-кейсы и постоянно получать один и тот же результат, то продукт считается «надежным». Тестирование надежности выполняется, чтобы убедиться, что программное обеспечение надежно, соответствует цели, для которой оно создано, и в течение определенного периода времени в данной среде способно обеспечить безотказную работу. Тестирование надежности может включать в себя Feature Testing, Security testing, Load Testing, Regression Testing и др. + +**Основные варианты для оценки надежности**: + +* Надежность повторного тестирования (Test-retest Reliability): при тестировании функционала одинаковыми тест-кейсами в разное время каждый раз мы получаем высокую корреляцию результатов. Тогда мы можем сказать, что тест «надежен». Обычно надежность 0,8 или более означает, что систему можно рассматривать как высоконадежный продукт; +* Параллельная или альтернативная форма надежности (Parallel or Alternate form of Reliability): разные версии одного теста должны давать одинаковый результат; +* Надежность между оценщиками (Inter-Rater Reliability): Надежность между оценщиками иначе известна как надежность между наблюдателями (Inter-Observer) или кодировщиками (Inter-Coder). Это особый тип надежности, состоящий из нескольких оценщиков или судей. Он касается согласованности рейтинга, выставляемого разными оценщиками / наблюдателями; + +**План тестирования надежности**: + +Имея правильную модель, мы можем предсказать качество продукта. К двум типам моделей относятся: + +* Модель прогноза (Prediction Model): В прогнозном тестировании (Predictive testing) мы прогнозируем результат на основе исторических данных, статистики, машинного обучения. Все, что нам нужно, это написать отчет. В прогнозной модели мы получаем только некоторую историческую информацию. Используя эту информацию, мы можем экстраполировать имеющиеся данные на будущее; +* Модель оценки (Estimation Model): Этот тип модели выполняется перед самой стадией разработки или тестирования. В оценочном тестировании (Estimation Testing), помимо использования исторических данных, мы будем использовать текущие данные. Здесь мы можем спрогнозировать надежность продукта в настоящее время или в будущем. Этот тип тестирования выполняется на последних этапах жизненного цикла разработки программного обеспечения. + +Источники: + +* [What Is Reliability Testing: Definition, Method And Tools](https://www.softwaretestinghelp.com/reliability-testing/) +* [Reliability Series #1: Reliability vs. resilience](https://www.microsoft.com/security/blog/2014/03/24/reliability-series-1-reliability-vs-resilience/) +* [Approaches to Reliability Testing and Setting of Reliability Test Objectives](https://www.softwaretestinggenius.com/approaches-to-reliability-testing-and-setting-of-reliability-test-objectives/) +* [Reliability Testing and Assessment of Risks due to Poor Reliability](https://www.softwaretestinggenius.com/reliability-testing-and-assessment-of-risks-due-to-poor-reliability/) +* [Fail-Fast vs. Fail-Safe: What is the Most Reliable Software Strategy?](https://hackernoon.com/fail-fast-vs-fail-safe-what-is-the-most-reliable-software-strategy) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-osnovannoe-na-riskakh-risk-based-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-osnovannoe-na-riskakh-risk-based-testing.md new file mode 100644 index 0000000..be3f6bd --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-osnovannoe-na-riskakh-risk-based-testing.md @@ -0,0 +1,34 @@ +# Тестирование, основанное на рисках (Risk-Based Testing) + +_Тестирование, основанное на рисках (risk-based testing): Подход к тестированию с целью минимизирования уровня рисков продукта и информирования заинтересованных лиц о текущем состоянии рисков с начальных стадий проекта. Подразумевает под собой управление процессом тестирования, исходя из идентифицированных рисков продукта и использования уровней риска. (ISTQB)_ + +Риск - это возникновение неопределенного события, которое положительно или отрицательно влияет на измеримые критерии успеха проекта. Это могут быть события, которые произошли в прошлом или текущие события, или что-то, что может произойти в будущем. Эти неопределенные события могут повлиять на стоимость, бизнес, технические и качественные цели проекта. Позитивные риски упоминаются как возможности и помощь в устойчивости бизнеса. Например, инвестирование в новый проект, изменение бизнес-процессов, разработка новых продуктов. Отрицательные риски называются угрозами, и для успеха проекта должны быть реализованы рекомендации по их минимизации или устранению. + +Тестирование на основе рисков помогает обнаруживать наиболее важные и критические ошибки на ранней стадии. Это тип тестирования, основанный на вероятности риска. Он включает в себя оценку риска на основе сложности, критичности бизнеса, частоты использования, видимых областей, областей, подверженных дефектам, и т. д. Он включает определение приоритетов тестирования модулей и функций тестируемого приложения на основе влияния и вероятности отказов. Если вовремя не выявить какой-либо риск, это может помешать завершению проекта. Самым первым шагом является определение рисков, а затем их оценка, т.е. определение приоритетов, а затем обработка рисков. После того, как риски идентифицированы, необходимо оценить риск, чтобы определить риски с точки зрения их воздействия, то есть того, какой ущерб он может нанести. + +Приоритет любого риска зависит от вероятности возникновения и его воздействия на продукт, то есть от того, насколько серьезным является воздействие: Priority = Probability \* Severity. + +* Управление рисками (Risk Management) должно начинаться на ранней стадии жизненного цикла, чтобы с рисками можно было справиться на ранней стадии. Категории рисков: + * Project Risks: бюджет, ресурсы, график, проблемы, связанные с клиентами и т. д. + * Technical Risks: Технический риск включает риски на этапах проектирования, внедрения, тестирования и разработки. Большинство технических рисков возникает либо на этапе требований, либо во время кодирования, поскольку неясность требований может привести к серьезным рискам во время разработки. Во-вторых, на этапе разработки, если разработчики недостаточно хорошо знакомы с Продуктом, это также может привести к серьезным рискам. + * Business Risks: Бизнес-риски включают проблемы с бюджетом и созданием проекта, который не соответствует требованиям заказчика, потерю клиента. +* Оценка рисков (Risk Assessment): риск оценивается на основе того, насколько серьезным является воздействие. +* Контроль рисков (Risk Control): Риском можно управлять с помощью трех стратегий: + * Предотвращение риска (Risk Avoidance): избежание риска - это избежание риска проекта с согласия клиента. Например. Чтобы избежать риска задержки реализации проекта из-за нехватки ресурсов, ресурсы можно оставить на скамейке запасных для замены, если какой-либо ресурс уйдет в отпуск. Объем работ можно сократить, чтобы избежать рисковУ + * Снижение риска (Risk Reduction): снижение риска включает в себя планирование управления рисками и минимизации их последствий. Например. Чтобы снизить риск, для реализации Проекта следует использовать инкрементальный подход; + * Передача риска (Risk Transfer): эта стратегия включает покупку страховки или любого компонента, разработанного третьей стороной, чтобы избежать возникновения рисков; + +Процесс Risk-based Testing: + +![https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/06/risk.png](https://www.softwaretestinghelp.com/wp-content/qa/uploads/2018/06/risk.png) + +Риск идентифицируется и анализируется, т. е. рассчитывается влияние (impact) и серьезность (severity) риска, и принимаются меры в соответствии с приоритетом риска. Как только приоритет определен, начинается тестирование, т. е. создаются объем (test scope) и план тестирования, а затем выполняется тесты. + +Доп. материал: + +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013 Часть 1: “Понятия и определения”](https://docs.cntd.ru/document/1200134996) 5.4 Тестирование на базе рисков +* [Stages of Risk Management Encountered by the Software Testing Managers](https://www.softwaretestinggenius.com/stages-of-risk-management-encountered-by-the-software-testing-managers/) +* [Risk Based Testing: Approach, Matrix, Process & Examples](https://www.guru99.com/risk-based-testing.html) +* [Leadership in test: risk-based testing](https://theqalead.com/topics/risk-based-testing/) +* [Как управлять объемами тестирования на основе рисков](https://www.performance-lab.ru/blog/testirovanie-na-osnove-riskov) +* [Что такое риск-тестирование?](https://testengineer.ru/chto-takoe-risk-testirovanie/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-podderzhki-maintenance-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-podderzhki-maintenance-testing.md new file mode 100644 index 0000000..ead96cd --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-podderzhki-maintenance-testing.md @@ -0,0 +1,74 @@ +# Тестирование поддержки (Maintenance testing) + +_Сопровождение (maintenance): Модификация программного продукта после его поставки с целью исправления дефектов, улучшения производительности или других характеристик или для адаптации продукта к изменившемуся окружению. (IEEE 1219)_ + +_Сопровождаемость (maintainability): Легкость изменения программного продукта для исправления дефектов, для соответствия новым требованиям, с целью облегчения последующего сопровождения или для адаптации к изменившемуся окружению. (ISO 9126)_ + +_Тестирование сопровождаемости (maintainability testing): Тип тестирования, проводимого для оценки степени эффективности и продуктивности возможных изменений элемента тестирования. (ГОСТ 56920)_ + +**Maintenance** является последней стадией SDLC. По мнению многих экспертов, по мере того, как изменения после релиза вносятся в существующее приложение, каждое изменение может рассматриваться как начало нового цикла SDLC, но точнее будет сказать, что проект в это время находится в жизненном цикле обслуживания программного обеспечения (SMLC - Software Maintenance Life Cycle). Многие проекты проводят большую часть своего времени именно в SMLC после релиза, а не в SDLC перед ним. + +**Maintenance testing** (тестирование поддержки/обслуживания/эксплуатации/сопровождения) - это модификация программного продукта после его выпуска с целью исправления дефектов, улучшения производительности или других характеристик или для адаптации продукта к изменившемуся окружению. (IEEE 1219). После того, как программное обеспечение или приложение задеплоены, оно начинает эксплуатироваться годами и даже десятилетиями. В это время система и ее операционная среда часто исправляются, изменяются или расширяются. Пользователю могут потребоваться некоторые добавленные или новые функции в текущем программном обеспечении, которые требуют внесения изменений в текущее программное обеспечение, и эти изменения должны быть протестированы. Конечным пользователям может потребоваться миграция программного обеспечения на другую самую последнюю аппаратную платформу или изменение среды, например версии ОС, варианта базы данных и т. д., что требует тестирования всего приложения на новых платформах и в новой среде. После того, как продукт релизится, он время от времени требует некоторого обслуживания в целях профилактики сбоев. + +**Основные активности** (principal activities): + +* Динамическое обслуживание (Dynamic maintenance) +* Корректирующее обслуживание (Corrective maintenance) +* Адаптивное обслуживание (Adaptive maintenance) + +Задача выполнения Maintenance testing становится более эффективной, когда программное обеспечение имеет хорошую характеристику обслуживаемости (maintainability). + +**Reliability, maintainability** в ISO 9126 определяется как «легкость, с которой программный продукт может быть изменен для исправления дефектов, модифицирован для соответствия новым требованиям, модифицирован для облегчения будущего обслуживания или адаптирован к изменившейся среде». + +Maintainability состоит из: + +* Анализируемость: это относится к усилиям, требуемым (обычно разработчиками) для диагностики дефектов или выявления частей программной системы, требующих изменений; +* Изменяемость: это касается усилий, необходимых для фактического исправления дефектов или внесения улучшений; +* Стабильность: вероятность возникновения непредвиденных побочных эффектов в результате внесения изменений в программное обеспечение. Это то, что мы имеем в виду, когда иногда говорим, что программное обеспечение хрупкое (brittle); +* Тестируемость: описывает усилия, необходимые для тестирования измененного программного обеспечения. Это один из основных атрибутов качества программного обеспечения, который напрямую влияет на нашу работу; + +**Причины плохой Maintainability:** + +| Основные риски (Maintainability Risks) | Последствия | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Усилия, необходимые для исправления дефектов и внесения изменений, могут быть больше, чем планировалось | Если размер группы поддержки (maintenance team), выполняющей эти задачи, будет фиксированным (обычная ситуация), это также приведет к увеличению временных затрат | +| Время, затрачиваемое на задачи обслуживания, превышает фиксированные окна обслуживания (maintenance windows) | Это может отрицательно сказаться на производстве (например, сотрудники, прибывающие на работу, обнаруживают, что сервер приложений недоступен из-за проскальзывания окна планового ночного обслуживания) | +| Поддержка (Maintainers) могут быть вынуждены сокращать сроки, чтобы не выходить за рамки согласованных периодов обслуживания. Им может потребоваться сделать предположения относительно реализации необходимых изменений (возможно, из-за плохой документации) | | +| Если применяются Соглашения об уровне обслуживания, могут налагаться штрафы | | +| Долгосрочное накопление плохой поддерживаемости в результате кумулятивного эффекта плохой практики разработки программного обеспечения | Уровень надежности постепенно снижается | +| Увеличивается количество функциональных дефектов, вносимых изменениями (регрессии) | | +| На исправление дефектов уходит больше времени | | +| На персонал поддержки оказывается все большее давление, что может даже привести к дальнейшему ухудшению ситуации | | + +**Виды Maintenance testing**: + +* **Подтверждающее** тестирование (Confirmation Maintenance Testing): тестирование измененной функциональности. Вы должны тщательно протестировать все модификации (небольшие или большие), внесенные в программное обеспечение, и убедиться, что нет проблем с функциональностью и простоев. Тестовая среда должна быть копией реальной среды вместе с тестовыми данными; +* **Регрессионное** тестирование (Regression Maintenance Testing): тестирование существующей функциональности на предмет регрессии. Это делается после фазы подтверждающего тестирования. Вы должны протестировать всю систему, чтобы убедиться, что измененная функциональность (работы по обслуживанию) не должна влиять на функциональность существующего программного обеспечения; + +Для поддерживающего релиза (maintenance release) может потребоваться поддерживающее тестирование на нескольких уровнях тестирования с использованием различных типов тестов в зависимости от его объема. **Объем технического обслуживания зависит от**: + +* Степень риска изменения, например, степень, в которой измененная область программного обеспечения общается с другими компонентами или системами; +* Размер существующей системы; +* Размер изменения; + +**Триггеры для Maintenance**. Существует несколько причин, по которым проводится обслуживание программного обеспечения, а значит, и тестирование обслуживания, как для запланированных, так и для незапланированных изменений. Мы можем классифицировать триггеры для обслуживания следующим образом: + +* Модификации, такие как запланированные улучшения (например, на основе выпуска), корректирующие и срочные изменения, изменения операционной среды (например, плановые обновления операционной системы или базы данных), обновления программного обеспечения COTS и исправления для дефектов и уязвимостей; +* Миграция, например, с одной платформы на другую, которая может потребовать операционных тестов новой среды, а также измененного программного обеспечения, или тестов преобразования данных, когда данные из другого приложения будут перенесены в поддерживаемую систему; +* Вывод из эксплуатации, например, когда срок поддержки приложения подходит к концу. Когда приложение или система выводятся из эксплуатации, это может потребовать тестирования миграции или архивирования данных, если требуются длительные периоды хранения данных; +* Также может потребоваться тестирование процедур восстановления / извлечения после архивирования в течение длительного периода хранения; +* Регрессионное тестирование может потребоваться, чтобы убедиться, что все функциональные возможности, которые остаются в эксплуатации, по-прежнему работают; + +Например, для систем Интернета вещей (IoT) тестирование обслуживания может быть инициировано введением в общую систему совершенно новых или модифицированных вещей, таких как аппаратные устройства и программные услуги. При тестировании обслуживания таких систем особое внимание уделяется интеграционному тестированию на разных уровнях (например, уровень сети, уровень приложений) и аспектам безопасности, в частности, тем, которые относятся к персональным данным. + +**Impact Analysis** для Maintenance. Анализ воздействия оценивает изменения, которые были внесены в поддерживающую версию, чтобы определить предполагаемые последствия, а также ожидаемые и возможные побочные эффекты (side effects) изменения, а также определить области в системе, на которые это изменение повлияет. Анализ влияния также может помочь определить влияние изменения на существующие тесты. Побочные эффекты и затронутые области в системе необходимо протестировать на предмет регрессии, возможно, после обновления любых существующих тестов, затронутых изменением. Анализ воздействия может быть проведен до внесения изменения, чтобы помочь решить, следует ли вносить изменение, исходя из возможных последствий в других областях системы. + +Источники: + +* [Importance of Maintainability to a Good Software & Role of Maintenance Testing](https://www.softwaretestinggenius.com/importance-of-maintainability-to-a-good-software-role-of-maintenance-testing/) +* [Maintenance Testing Guide](https://www.softwaretestingmaterial.com/maintenance-testing/) +* [Maintenance Testing](https://betterqa.co/software-testing-services/maintenance-testing/) + +Доп. материал: + +* [IEEE Guide to the Software Engineering Body of Knowledge](https://ieeecs-media.computer.org/media/education/swebok/swebok-v3.pdf). Chapter 5. diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-proizvoditelnosti-performance-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-proizvoditelnosti-performance-testing.md new file mode 100644 index 0000000..ea80117 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-proizvoditelnosti-performance-testing.md @@ -0,0 +1,124 @@ +# Тестирование производительности (Performance testing) + +Тестирование производительности - это нефункциональный вид тестирования программного обеспечения, используемый для проверки скорости, времени отклика, стабильности, надежности, масштабируемости и использования ресурсов программного приложения при определенной рабочей нагрузке, обычно регрессионным образом, когда в приложение ежедневно или еженедельно вносятся небольшие изменения. Основная цель тестирования производительности - выявить и устранить узкие места производительности в программном приложении. Это подмножество performance engineering, также известное как «Perf Testing». Само по себе оно не призвано находить дефекты, но оно помогает в обнаружении узких мест в системе. + +Обычно продолжительность теста производительности составляет 1 час (устойчивое состояние) на средней / ожидаемой нагрузке; это может варьироваться в зависимости от вашего SLA / требований. + +![https://1.bp.blogspot.com/-Dk68xOvpYWM/WGo-EGuLf3I/AAAAAAAAAhg/DlpTlDWNZzc5\_H1EWh0kr4Q2QJXNdK3pgCEw/s1600/PT.JPG](https://1.bp.blogspot.com/-Dk68xOvpYWM/WGo-EGuLf3I/AAAAAAAAAhg/DlpTlDWNZzc5\_H1EWh0kr4Q2QJXNdK3pgCEw/s1600/PT.JPG) + +Примечание 1: все подвиды тестирования производительности отличаются, грубо говоря, только параметрами (тип возрастания нагрузки, ее количество, длительность и т.п.) и собираемыми метриками (без которых это тестирование бессмысленно). Точкой отсчета для всех подвидов принято брать результаты Capacity testing. + +![https://lh6.googleusercontent.com/XNuV1\_4ya69jlZ7lkW-Dovc1xycy-zvrcGAKyoQxni7AITleD6eO4lsHsIp2PVA-CzpHCFrCX0MX9vBZRMHroN9i1YfDD70rIL0VdNq2593APZqVDkF-cVpLSByaOXR8XXTFuvgB](https://lh6.googleusercontent.com/XNuV1\_4ya69jlZ7lkW-Dovc1xycy-zvrcGAKyoQxni7AITleD6eO4lsHsIp2PVA-CzpHCFrCX0MX9vBZRMHroN9i1YfDD70rIL0VdNq2593APZqVDkF-cVpLSByaOXR8XXTFuvgB) + +Примечание 2: несмотря на необходимость понимания многих математических и статистических концепций, многие тестировщики и менеджеры либо не имеют достаточных знаний в области математики и статистики, либо не пользуются ими. Это приводит к значительным искажениям и неверной интерпретации результатов тестирования производительности (те же перцентили). + +**Общие проблемы с производительностью**. + +Большинство проблем с производительностью связаны со скоростью, временем отклика, временем загрузки и плохой масштабируемостью. Скорость часто является одним из самых важных атрибутов приложения. Медленно работающее приложение потеряет потенциальных пользователей. Тестирование производительности проводится для того, чтобы убедиться, что приложение работает достаточно быстро, чтобы удерживать внимание и интерес пользователя. Взгляните на следующий список распространенных проблем с производительностью и обратите внимание на то, что скорость является общим фактором во многих из них: + +* Длительное время загрузки - обычно время загрузки - это начальное время, необходимое приложению для запуска. Обычно оно должно быть сведено к минимуму. Хотя некоторые приложения невозможно загрузить менее чем за минуту, время загрузки должно быть меньше нескольких секунд, если это возможно; +* Плохое время отклика. Время отклика - это время, которое проходит с момента ввода пользователем данных в приложение до того, как приложение выдаст ответ на этот ввод. Как правило, это должно происходить очень быстро. Опять же, если пользователю приходится ждать слишком долго, он теряет интерес; +* Плохая масштабируемость - программный продукт страдает от плохой масштабируемости, когда он не может обрабатывать ожидаемое количество пользователей. +* Узкие места (Bottlenecking)- это препятствия в системе, которые ухудшают общую производительность системы. Узкое место - это либо ошибки в коде, либо проблемы с оборудованием, которые вызывают снижение пропускной способности при определенных нагрузках. Узкие места обычно устраняются путем исправления плохо работающих процессов или добавления дополнительного оборудования. Некоторые общие узкие места производительности: + * Загрузка ЦП; + * Использование памяти; + * Использование сети; + * Ограничения операционной системы; + * Использование диска; + +**Как проводить тестирование производительности?** + +* Определите необходимую среду тестирования (testing environment): перед тем, как начать процесс тестирования, изучите детали аппаратного, программного обеспечения и сетевых конфигураций, используемых во время тестирования. Это поможет тестировщикам создавать более эффективные тесты. Это также поможет определить возможные проблемы, с которыми тестировщики могут столкнуться во время процедур тестирования производительности; +* Определите критерии приемки: сюда входят цели и ограничения по пропускной способности, времени отклика и распределению ресурсов. Также необходимо определить критерии успеха проекта, выходящие за рамки этих целей и ограничений. Тестировщики должны иметь право устанавливать критерии и цели производительности, потому что часто спецификации проекта не включают достаточно широкий спектр тестов производительности. Иногда их может и вовсе не быть. Если возможно, найти похожее приложение для сравнения - это хороший способ установить цели производительности; +* Планирование и проектирование тестов производительности: Определите, как использование может варьироваться среди конечных пользователей, и определите ключевые сценарии для тестирования всех возможных вариантов использования. Необходимо смоделировать различных конечных пользователей, спланировать данные тестирования производительности и наметить, какие метрики будут собраны; +* Настройка тестовой среды: Подготовьте тестовую среду перед выполнением. Также подготовьте инструменты и другие ресурсы; +* Имплементирование тест-дизайна: Создайте тесты производительности в соответствии с вашим тест-дизайном; +* Запуск тестов: Выполнить и промониторить тесты; +* Анализ, настройка и повторное тестирование: объединяйте, анализируйте и делитесь результатами тестирования. Затем выполните точную настройку и снова проверьте, есть ли улучшение или снижение производительности. Поскольку улучшения обычно становятся меньше с каждым повторным тестом, остановитесь, когда узкое место вызвано ЦП. Тогда вы можете рассмотреть вариант увеличения мощности процессора. + +**Метрики тестирования производительности (Performance Testing Metrics):** + +* **Использование процессора** (Processor Usage): время, затрачиваемое процессором на выполнение non-idle потоков; +* **Использование памяти** (Memory use): объем физической памяти, доступной процессам на компьютере; +* **Время диска** (Disk time): время, в течение которого диск занят выполнением запроса на чтение или запись; +* \*\*Время отклика \*\*(Response time): время с момента ввода пользователем запроса до получения первого символа ответа. Подробнее: [раз](https://www.guru99.com/response-time-testing.html), [два](https://www.tutorialspoint.com/what-is-response-time-testing); +* **Задержка** (Latency): временной интервал между запросом и ответом; +* **Пропускная способность** (Throughput): фактическое количество запросов (или пользователей), которое может обработать система за определенное время. В то время как время задержки говорит вам только о времени, метрика пропускной способности информирует об объеме данных, полученных и обработанных в момент времени. Важно не отделять показатели времени задержки от пропускной способности, т.к. высокий показатель времени задержки часто прямо связан с увеличением показателей метрики пропускной способности. Пропускная способность обычно измеряется в rps - (кол-во) запросов в секунду (requests per second). +* **Ширина пропускания канала** (Bandwidth): максимальное число запросов (или пользователей), которое может обработать система. В отличие от пропускной способности ширина пропускания канала измеряет максимальный объем, который может обработать приложение. +* **Частные байты** (Private bytes): количество байтов, выделенных процессом, которые не могут использоваться другими процессами. Они используются для измерения утечек и использования памяти; +* **Выделенная память** (Committed memory) - объем используемой виртуальной памяти; +* **Страниц памяти в секунду** (Memory pages/second) - количество страниц, записываемых на диск или считываемых с диска для устранения аппаратных ошибок страниц. Сбои аппаратной страницы - это когда код не из текущего рабочего набора вызывается из другого места и извлекается с диска; +* **Ошибок страниц в секунду** (Page faults/second) - общая скорость, с которой страницы ошибок обрабатываются процессором. Это происходит, когда процессу требуется код из-за пределов своего рабочего набора; +* **Число прерываний процессора в секунду** (CPU interrupts per second): это среднее количество аппаратных прерываний, которые процессор принимает и обрабатывает каждую секунду; +* **Длина дисковой очереди** (Disk queue length): среднее количество запросов на чтение и запись, поставленных в очередь для выбранного диска в течение интервала выборки; +* **Длина сетевой выходной очереди** (Network output queue length): длина очереди выходных пакетов в пакетах. Значение больше двух означает, что необходимо убрать задержку и возникновение узких мест; +* **Всего сетевых байтов в секунду** (Network bytes total per second): скорость, с которой байты отправляются и принимаются интерфейсом, включая символы кадрирования; +* **Количество пулов соединений** (Amount of connection pooling): количество запросов пользователей, которые удовлетворяются объединенными соединениями. Чем больше запросов будет выполнено подключениями в пуле, тем выше будет производительность; +* **Максимальное количество активных сессий** (Maximum active sessions): максимальное количество сессий, которые могут быть активны одновременно; +* **Коэффициент хитов** (Hit ratios): это связано с количеством операторов SQL, которые обрабатываются кэшированными данными вместо дорогостоящих операций ввода-вывода. Это хорошее начало для решения проблем, связанных с узкими местами; +* **Хитов в секунду** (Hits per second): количество хитов веб-сервера в течение каждой секунды нагрузочного теста; +* **Сегмент отката** (Rollback segment): объем данных, который можно откатить в любой момент времени; +* **Блокировки баз данных** (Database locks) - блокировки таблиц и баз данных необходимо отслеживать и тщательно настраивать; +* **Максимальное время ожидания** (Top waits) - отслеживаются, чтобы определить, какое время ожидания можно сократить при работе с тем, насколько быстро данные извлекаются из памяти; +* **Количество потоков** (Thread counts): состояние приложения можно измерить по количеству потоков, которые работают и в настоящее время активны; +* **Сборка мусора** (Garbage collection): это связано с возвратом неиспользуемой памяти обратно в систему. Сборку мусора необходимо отслеживать на предмет эффективности; +* \*Процент ошибок рассчитывается как отношение невалидных ответов к валидным за промежуток времени. Про Average, медианы, перцентили и т.п. углубляться в рамках этой статьи не буду, есть в гугле. + +**Тестирование производительности клиентской части и серверной, в чем разница?** + +Оценка скорости работы клиентской и серверной частей веб-приложения осуществляется двумя разными видами тестирования: для Frontend применяется тестирование клиентской части, или Client-Side testing, а для Back-end - тестирование серверной части. + +Основная цель тестирования клиентской части состоит в измерении времени, необходимого браузеру для загрузки HTML-страницы. Наиболее важными показателями здесь являются количество загружаемых данных, их объем, а также количество выполненных запросов. + +Собрать данную статистику можно как с использованием встроенных инструментов браузера (DevTools), так и с помощью специализированных инструментов и онлайн-сервисов, которые позволяют замерить необходимые показатели с учетом интересующего региона. + +Помимо общего веса страницы, инструменты предоставляют детализированную информацию по каждому из компонентов. Изучив параметры запросов, можно обнаружить ряд проблем, приводящих к ухудшению скорости отображения страницы. К примеру, подгружается слишком большая картинка, медленный Javascript, или отправляется значительное количество запросов. + +Другая необходимая проверка направлена на анализ заголовков кэширования, поскольку корректность его выполнения при повторном посещении страницы позволяет повысить скорость загрузки страницы до 80%. + +Тестирование серверной части направлено на анализ выполнения запросов и получения соответствующего ответа от Back-end. + +Цели данного вида тестирования: + +* Измерить время отклика самых важных бизнес-транзакций; +* Определить предельный уровень допустимой нагрузки; +* Выявить «узкие» места в производительности системы; +* Составить рекомендации по улучшению производительности; +* Найти возможные дефекты, проявляющиеся только при одновременной работе большого количества пользователей. + +**Примеры проверок**: + +* Время отклика не превышает 4 секунды при одновременном доступе к сайту 1000 пользователей; +* Время отклика приложения под нагрузкой находится в допустимом диапазоне при медленном сетевом подключении; +* Проверьте максимальное количество пользователей, с которыми приложение может справиться, прежде чем оно выйдет из строя; +* Проверить время выполнения базы данных при одновременном чтении / записи 500 записей; +* Проверьте использование ЦП и памяти приложением и сервером базы данных в условиях пиковой нагрузки; +* Проверьте время отклика приложения в условиях низкой, нормальной, средней и высокой нагрузки; + +Во время фактического выполнения теста производительности расплывчатые термины, такие как допустимый диапазон, большая нагрузка и т. д., Заменяются конкретными цифрами. Инженеры по производительности устанавливают эти числа в соответствии с бизнес-требованиями и техническим ландшафтом приложения. + +Источники: + +* [Performance Testing Tutorial: What is, Types, Metrics & Example](https://www.guru99.com/performance-testing.html) +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) + +Доп. материал: + +* [General system performance](https://load.qa) +* [ГОСТ Р 56920-2016/ISO/IEC/IEEE 29119-1:2013](https://docs.cntd.ru/document/1200134996) “D.5 Подпроцесс тестирования производительности” +* [Анализ результатов нагрузочного тестирования](https://habr.com/ru/company/tinkoff/blog/514314/) +* [Нагрузочное тестирование выполнять сложно, а инструменты далеки от совершенства. Почему?](https://habr.com/ru/company/vdsina/blog/536304/) +* [Нагрузочное тестирование: особенности профессии](https://tproger.ru/articles/nagruzochnoe-testirovanie-osobennosti-professii/) +* [Андрей Акиньшин - Анализируем перформанс с пользой для себя и окружающих](https://www.youtube.com/watch?v=jZ0quqA1Fn8\&ab\_channel=Heisenbug) +* [Антон Поцюс - Нагрузочное тестирование игрового сервера](https://www.youtube.com/watch?v=Migve-fhHAY\&ab\_channel=Heisenbug) +* [Сергей Махетов - Воркшоп (часть 1): Стартуем в тестировании производительности](https://www.youtube.com/watch?v=wuFRw-NzeSk\&ab\_channel=Heisenbug) +* [Сергей Махетов - Воркшоп (часть 2): Стартуем в тестировании производительности](https://www.youtube.com/watch?v=Cr0zfnSz7rk\&ab\_channel=Heisenbug) +* [Инструментарий для нагрузочного тестирования и не только](https://habr.com/ru/post/554266/) +* [Представляем RAIL: модель оценки производительности сайта](https://habr.com/ru/company/webo/blog/308026/) +* [30+ Performance Testing Interview Questions And Answers](https://www.softwaretestingmaterial.com/performance-testing-interview-questions/) +* [Leadership in test: managing performance testing](https://theqalead.com/topics/managing-performance-testing/) +* [Введение в тестирование производительности](https://www.youtube.com/watch?v=vyo1fuB7NJQ) +* [Тестирование производительности веб-сервисов - теория и инструменты](https://testengineer.ru/testirovanie-proizvoditelnosti-veb-servisov/) +* [Performance testing for beginners (Анна Клюева, Grid Dynamics)](https://www.youtube.com/watch?v=-6Pm74nz8Lo\&list=PLhhTXwj6\_Fl0xbR1Msto-zvCsWVoASRCd\&index=6) +* [Тестирование производительности](http://okiseleva.blogspot.com/2021/08/blog-post\_25.html) +* [Подходы к тестированию производительности MQ-сервисов](https://www.youtube.com/watch?v=ZoUSXL8D\_4c) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-rabochego-processa-vorkflou-workflow-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-rabochego-processa-vorkflou-workflow-testing.md new file mode 100644 index 0000000..947b03c --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-rabochego-processa-vorkflou-workflow-testing.md @@ -0,0 +1,21 @@ +# Тестирование рабочего процесса/воркфлоу (Workflow testing) + +Это тип тестирования программного обеспечения, который проверяет, что каждый software workflow точно отражает данный бизнес-процесс путем тестирования Software Workflows в документе с бизнес-требованиями (BRD - Business Requirements Document). Workflow - это серия задач для получения желаемого результата, которая обычно включает несколько этапов или шагов. Тестирование рабочего процесса также будет включать в себя части системных и интеграционных тестов. Test Model включает тестирование таких артефактов, как: test cases, test procedures, test components, test sub-system, etc. + +Процесс Workflow testing: + +* Начальная фаза (Inception phase): эта фаза включает начальное планирование испытаний и тестирование прототипа; +* Фаза разработки (Elaboration phase): эта фаза включает baseline архитектуры тестирования; +* Фаза строительства (Construction phase): эта фаза включает в себя значительные испытания в каждой сборке; +* Фаза перехода (Transition phase): эта фаза включает в себя регрессионные тесты и повторные тесты исправлений; + +Кто проводит Workflow testing: + +* Test engineer: планирует цели теста и график. Определяет Test case и процедуры. Оценивает результаты теста; +* Component engineer: Разработка тестовых компонентов. Автоматизирует некоторые тестовые процедуры; +* Integration Tester: Выполнение интеграционных тестов и выявление дефектов +* System Testers: Выполнение системных тестов и отчеты о дефектах; + +Источник: + +[What is Workflow Testing in Software Testing? with Examples](https://www.guru99.com/workflow-testing.html) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-servisa-service-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-servisa-service-testing.md new file mode 100644 index 0000000..64aa63b --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-servisa-service-testing.md @@ -0,0 +1,26 @@ +# Тестирование сервиса (Service Testing) + +Качество обслуживания, предоставляемого веб-приложением, может быть определено включением всех его атрибутов, таких как функциональность, производительность, надежность, удобство использования, безопасность и так далее. Однако для наших целей здесь мы выделяем три конкретные задачи обслуживания (?service objectives), которые подвергаются тщательной проверке в рамках того, что мы называем «?тестированием услуг»: + +* Performance; +* Reliability; +* Manageability; + +Во всех трех случаях нам необходимо моделировать пользовательскую нагрузку для эффективного проведения тестов. Цели производительности, надежности и управляемости существуют в контексте реальных клиентов, использующих сайт для бизнеса. Скорость отклика (в данном случае время, необходимое одному системному узлу для ответа на запрос другого) сайта напрямую зависит от ресурсов, доступных в технической архитектуре. Чем больше клиентов используют эту услугу, тем меньше технических ресурсов доступно для обслуживания запросов каждого пользователя, и время отклика сокращается. Очевидно, что слабо загруженная служба с меньшей вероятностью выйдет из строя. Большая часть сложности программного и аппаратного обеспечения существует для удовлетворения требований к ресурсам в рамках технической архитектуры, когда сайт сильно загружен. Когда сайт загружен (или перегружен), конфликтующие запросы ресурсов должны управляться различными компонентами инфраструктуры, такими как серверные и сетевые операционные системы, системы управления базами данных, продукты веб-серверов, брокеры объектных запросов, промежуточное ПО и т. д. Эти компоненты инфраструктуры обычно более надежны, чем код специально созданного приложения, которому требуются ресурсы, но сбои могут произойти в одном из следующих случаев: + +* Компоненты инфраструктуры выходят из строя, потому что код приложения (из-за плохой разработки или реализации) предъявляет чрезмерные требования к ресурсам. +* Компоненты приложения могут выйти из строя, потому что требуемые им ресурсы не всегда могут быть доступны (вовремя). + +Моделируя типичные и необычные производственные нагрузки в течение длительного периода, тестировщики могут выявить недостатки в конструкции или реализации системы. Когда эти недостатки будут устранены, те же тесты продемонстрируют устойчивость системы. Для всех служб обычно существует ряд критических процессов управления, которые необходимо выполнить для обеспечения бесперебойной работы службы. Можно было бы закрыть службу для выполнения планового обслуживания в нерабочее время, но большинство онлайн-служб работают 24 часа в сутки. Рабочий день сервиса никогда не заканчивается. Неизбежно, что процедуры управления должны выполняться, пока служба работает и пользователи находятся в системе. Эти процедуры необходимо тестировать при наличии нагрузки на систему, чтобы убедиться, что они не оказывают отрицательного воздействия на живую службу, известную как тестирование производительности. + +**Тестирование управления услугами** (Service Management Testing). Когда служба развертывается в производственной среде, ею необходимо управлять. Для поддержания работоспособности службы необходимо, чтобы ее отслеживали, обновляли, создавали резервные копии и быстро исправляли, когда что-то пойдет не так. Процедуры, которые менеджеры служб используют для выполнения обновлений, резервного копирования, выпусков и восстановлений после сбоев, критически важны для обеспечения надежной службы, поэтому им необходимо тестирование, особенно если служба претерпит быстрые изменения после развертывания. Необходимо решить следующие конкретные проблемы: + +* Процедуры не дают желаемого эффекта; +* Процедуры неработоспособны или непригодны; +* Процедуры нарушают прямую трансляцию; + +По возможности тесты должны проводиться реалистично. + +Источник: + +[Leadership in test: service testing](https://theqalead.com/topics/service-testing/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-sovmestimosti-vzaimodeistviya-compatibility-interoperability-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-sovmestimosti-vzaimodeistviya-compatibility-interoperability-testing.md new file mode 100644 index 0000000..60ba148 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-sovmestimosti-vzaimodeistviya-compatibility-interoperability-testing.md @@ -0,0 +1,52 @@ +# Тестирование совместимости/взаимодействия (Compatibility/Interoperability testing) + +_Тестирование совместимости (compatibility testing): Тип тестирования, который измеряет степень того, насколько удовлетворительно элемент тестирования может функционировать параллельно с другими независимыми продуктами в общей среде (сосуществование) и, по мере необходимости, обменивается информацией с другими системами или компонентами (функциональная совместимость). (ГОСТ 56920)_ + +Взаимодействие (**Interoperability**) - это способность одной системы взаимодействовать с другой системой. Это взаимодействие между двумя разными системами или двумя разными приложениями вместе. Часто взаимодействие путают с интеграцией, совместимостью и портируемостью. + +**Interoperability = Inter + operable** + +Inter - означает «между собой», «друг между другом», «взаимно». + +Operable - означает «способный выполнить поставленную задачу». + +Пример №1: Возьмем пример бронирования вашего рейса. Считайте, что вам нужно поехать из Нью-Дели в Нью-Йорк. Сейчас у вас нет прямого рейса. Вы должны лететь из Нью-Дели в Лондон, а затем лететь стыковочным рейсом из Лондона в Нью-Йорк. Поскольку у вас есть некоторые ограничения по времени, вы бронируете свой рейс из Нью-Дели в Лондон на авиалинии «Jet Airways» и из Лондона в Нью-Йорк на «Virgin Atlantic». Это означает, что все данные о ваших пассажирах были переданы от Jet Airways до Virgin Atlantic. Итак, здесь Jet Airways и Virgin Atlantic, оба являются независимыми приложениями вместе, и при бронировании вашего рейса ваши данные о бронировании передаются от Jet Airways в Virgin Atlantic в полном объеме, без предварительного уведомления. + +Пример №2. Аналогичным образом представьте себе систему управления больницей, где записи пациентов обмениваются между одним отделением и другим отделением. Итак, здесь можно связать отдел с приложением. Информация о пациенте передается из одного приложения в другое без предварительного уведомления. + +**Уровни Interoperability testing:** + +* Физический (Physical Interoperability); +* Типы данных (Data-type Interoperability); +* Уровень спецификации (Specification level Interoperability); +* Семантический (Semantic Interoperability); + +**Как провести Interoperability testing?** + +Мы можем следовать колесу Деминга (Deming wheel или цикл PDCA), чтобы провести Interoperability testing: + +**Plan**: планирование - это самый важный этап определения стратегии выполнения практически любых задач при разработке программного обеспечения. Прежде чем мы на самом деле спланируем определение процедуры выполнения IOT, необходимо понять каждое приложение или систему, развернутую в сети. Мы должны знать обо всех приложениях - их функциональность, поведение, вводимые данные и раскрываемые результаты вывода. Я также рекомендовал бы, чтобы каждое приложение было полностью функционально протестировано и было без дефектов, прежде чем готовить его к interoperability testing. Поэтому, когда вы планируете, не думайте только об одном или двух приложениях, думайте обо всех приложениях как о едином блоке. Планируя этот метод тестирования, вы должны смотреть с высоты птичьего полета. Излишне говорить - задокументируйте свой план. Мы можем использовать план тестирования и немного адаптировать его в соответствии с требованиями к документированию планирования IOT. После того, как ваш план тестирования составлен, переходите к определению условий тестирования (test conditions). Основное внимание при получении условий тестирования не должно ограничиваться отдельными приложениями; вместо этого он должен быть основан на потоке данных через все приложения. Условия должны быть спроектированы таким образом, чтобы проходились если не все, но большинство приложений в сети. После определения условий тестирования переходите к разработке или написанию сценария (в случае, если вы планируете автоматизировать) ваших тест-кейсов. Вы можете создать RTM (матрицу прослеживаемости требований), чтобы сопоставить ваши тест-кейсы с условиями тестирования и ваши условия тестирования с условиями / требованиями приемочного тестирования. Когда вы работаете в сети, также важно спланировать нефункциональное тестирование. Это может быть нигде не записано или не задокументировано, но обязательно для проверки нефункциональных аспектов системы в целом. Эти нефункциональные области будут включать производительность и безопасность. При необходимости вы можете составить отдельный план для функционального тестирования, тестирования производительности и тестирования безопасности; или создайте единый план и разные документы с условиями тестирования для каждого из этих типов тестирования; + +**Do:** это промежуток времени, в течение которого вы прогоняете тест-кейсы. Соответственно планируйте свое время для выполнения функционального и нефункционального тестирования. Мы следуем циклу тестирования (testing cycle) на этом этапе выполнения кейсов, логируем дефекты, команда разработчиков их устраняет, после чего мы выполняем повторное тестирование и регрессионное тестирование системы в целом, и предоставляем отчет о результатах тестирования; + +**Check** - это этап, на котором мы пересматриваем результаты наших тестов и пытаемся сопоставить их с RTM и проверить, выполнены ли все ожидаемые требования и все ли приложения пройдены. Мы проверяем, что данные передаются и обмениваются правильно и плавно между приложениями / системами. Нам также нужно будет убедиться, что данные, которые мы просматриваем, не изменяются. Также подумайте о том, чтобы сделать ретроспективу всего процесса interoperability testing. Определите области, которые хорошо сработали, те, которые не удались, и любые элементы действий, о которых необходимо позаботиться. + +**Act** - действовать по ретроспективным элементам. Пункты, которые были определены как «good practices», продолжают выполняться, а для пунктов, над которыми можно было бы лучше поработать, определяются шаги по их исправлению. Имейте в виду одну вещь: области или шаги, которые не сработали, НЕ должны повторяться. В конце концов, мы должны учиться на своих ошибках, а не повторять их. + +**Совместимость (Compatibility, Coexistence)** - это метод, с помощью которого проверяется совместимость 2 или более приложений в одной среде. MS Word и Калькулятор - это два разных приложения, и они показывают ожидаемое поведение независимо в одной и той же операционной системе. Итак, мы говорим, что эти 2 приложения совместимы друг с другом. Другой пример: если сайт Google.com совместим, он должен открываться во всех браузерах и операционных системах. Тестирование совместимости - это нефункциональное тестирование для обеспечения удовлетворенности клиентов. Оно предназначено для определения того, может ли программное обеспечение или продукт работать в различных браузерах, базах данных, оборудовании, операционной системе, мобильных устройствах и сетях. На приложение также может влиять различные версии, разрешения, скорости интернета, конфигурации и т. д. Следовательно, важно тестировать приложение всеми возможными способами, чтобы уменьшить сбои и избежать затруднений, связанных с утечкой ошибок (bug’s leakage). Тест на совместимость всегда должен выполняться в реальной среде, а не в виртуальной. Протестируйте совместимость приложения с различными браузерами и операционными системами, чтобы гарантировать 100% покрытие. + +**Типы тестирования совместимости**: + +* Тестирование совместимости браузера (Browser compatibility testing): очень популярно при тестировании совместимости. Это необходимо для проверки совместимости программного приложения с различными браузерами, такими как Chrome, Firefox, Internet Explorer, Safari, Opera и т. д.; +* Аппаратное обеспечение (Hardware): Это необходимо для проверки совместимости приложения / программного обеспечения с различными конфигурациями оборудования; +* Сети (Networks): Это для проверки приложения в разных сетях, таких как 3G, WIFI и т. д.; +* Мобильные устройства (Mobile Devices): Это необходимо для проверки совместимости приложения с мобильными устройствами и их платформами, такими как android, iOS, windows и т. д.; +* Операционная система (Operating System): Это необходимо для проверки совместимости приложения с различными операционными системами, такими как Windows, Linux, Mac и т. д.; +* Версии (Versions): Важно тестировать программные приложения в разных версиях программного обеспечения. Существует два разных типа проверки версии: + * Тестирование обратной совместимости (Backward Compatibility Testing) - тестирование приложения или программного обеспечения со старыми или предыдущими версиями. Это также известно как обратная совместимость (downward compatible); + * Тестирование прямой совместимости (Forward Compatibility Testing) - тестирование приложения или программного обеспечения с новыми или будущими версиями. Это также известно как прямая совместимость (forward compatible); + +Источники: + +* [A Simple Guide To Interoperability Testing (With Examples)](https://www.softwaretestinghelp.com/interoperability-testing/) +* [What Is Software Compatibility Testing?](https://www.softwaretestinghelp.com/software-compatibility-testing/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-udobstva-polzovaniya-usability-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-udobstva-polzovaniya-usability-testing.md new file mode 100644 index 0000000..5991e05 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-udobstva-polzovaniya-usability-testing.md @@ -0,0 +1,54 @@ +# Тестирование удобства пользования (Usability testing) + +_Тестирование практичности (usability testing): Тестирование с целью определения степени понятности, легкости в изучении и использовании, привлекательности программного продукта для пользователя при условии использования в заданных условиях эксплуатации (ISO 9126)_ + +Тестирование удобства пользования - это нефункциональный вид тестирования программного обеспечения, являющийся подмножеством тестирования пользовательского опыта - UX, “Ю-Экс”, user experience. В целом оно подразделяется на понятность, обучаемость, работоспособность, привлекательность и соответствие (understandability, learnability, operability, attractiveness, and compliance). Юзабилити-тестирование предназначено для определения того, насколько программный продукт понятен, легок в освоении, прост в эксплуатации и привлекателен для пользователей при определенных условиях и требованиях. Этот тип тестирования обычно выполняется реальными пользователями. + +**Категории юзабилити-тестирования**: + +* **Исследовательская**: обычно мы рассматриваем эту категорию на ранних этапах процесса тестирования программного обеспечения. Чем раньше выполняется тестирование юзабилити в процессе тестирования, тем меньше риски в продукте. На этом этапе обычно рассматривается дизайн продукта и концепции, относящиеся к продукту или услуге; +* **Оценочная**: эта категория описывает оценку выполнения Е2Е теста, а также анализирует эффективность продукта и удовлетворенность пользователей; +* **Сравнительная**: в этой категории два или более схожих продукта сравниваются по разным атрибутам, таким как дизайн продукта, преимущества и недостатки, что помогает выбрать продукт, который обеспечивает лучший пользовательский опыт; + +**Методы юзабилити-тестирования**: + +* **Промежуточное** (? hallway) тестирование. Этот метод является одним из наиболее эффективных и экономичных по сравнению с другими доступными методами. При использовании этого метода веб-сайт или продукт для тестирования получают несколько случайных людей, а не обученные специалисты. Поскольку случайные люди тестируют службу без предварительного знания продукта, они тестируют ее более эффективно и предоставляют более точные результаты и честную обратную связь для улучшения, если таковые имеются; +* **Удаленное** тестирование. Как следует из названия, удаленное тестирование юзабилити проводится людьми, которые находятся в удаленных местах. Обратная связь может быть записана и отправлена случайными людьми, а не экспертом по технологиям. Иногда удаленное тестирование выполняется с помощью видеоконференцсвязи. Этот тип юзабилити-тестирования снижает стоимость по сравнению с другими типами тестирования; +* **Экспертная оценка**. Эксперта в данной области просят протестировать продукт или услугу и предоставить отзыв, а затем представить результаты. Обычно это быстро, но и стоит дорого. Эксперт находит лазейки и обнаруживает недостатки в продукте или услуге; +* **Бумажный прототип**. Тестирование бумажных прототипов - один из самых традиционных подходов к тестированию юзабилити. Этот метод включает в себя пробный запуск теста, ручной набросок, рисование моделей или прототипа. Обсуждение последовательности операций и их рисование на бумаге, а также рассмотрение всех возможных исходных данных, сценариев и условий - вот цель этого типа тестирования. Это один из основных типов тестирования, который чаще всего применяется во всех проектах для устранения основных проблем. Выполняя тестирование бумажного прототипа, можно получить больше ясности в процессе выполнения. Тестирование бумажного прототипа обычно проводится в проектной группе. Следовательно, это рассматривается на ранних этапах процесса тестирования. Это относительно более дешевый метод тестирования юзабилити, но не самый эффективный способ тестирования, поскольку он временами занимает больше времени, и существует более высокая вероятность того, что даже после тестирования мы можем пропустить несколько проблем; +* **Автоматизированное**. Как следует из названия, этот метод тестирования выполняется путем написания сценариев автоматизации. После выполнения теста результаты записываются и отправляются. Для этого типа метода тестирования компании необходимо нанять ресурс, который хорошо знаком с написанием сценариев и построением среды автоматизации. Это один из наиболее часто используемых методов тестирования; + +Тестирование удобства пользования дает оценку уровня удобства использования приложения по следующим пунктам: + +* производительность, эффективность (efficiency) - сколько времени и шагов понадобится пользователю для завершения основных задач приложения, например, размещение новости, регистрации, покупка и т. д.? (меньше - лучше) +* правильность (accuracy) - сколько ошибок сделал пользователь во время работы с приложением? (меньше - лучше) +* активизация в памяти (recall) - как много пользователь помнит о работе приложения после приостановки работы с ним на длительный период времени? (повторное выполнение операций после перерыва должно проходить быстрее чем у нового пользователя) +* эмоциональная реакция (emotional response) - как пользователь себя чувствует после завершения задачи - растерян, испытал стресс? Порекомендует ли пользователь систему своим друзьям? (положительная реакция - лучше) + +Проверка удобства использования может проводиться как по отношению к готовому продукту, посредством тестирования черного ящика (black box testing), так и к интерфейсам приложения (API), используемым при разработке - тестирование белого ящика (white box testing). В этом случае проверяется удобство использования внутренних объектов, классов, методов и переменных, а также рассматривается удобство изменения, расширения системы и интеграции ее с другими модулями или системами. Использование удобных интерфейсов (API) может улучшить качество, увеличить скорость написания и поддержки разрабатываемого кода, и как следствие улучшить качество продукта в целом. + +Отсюда становится очевидно, что тестирование удобства пользования может производиться на разных уровнях разработки ПО: модульном, интеграционном, системном и приемочном. + +Источники: + +* [Usability Testing Tutorial: A Complete Getting Started Guide](https://www.softwaretestinghelp.com/usability-testing-guide/) +* [What is Usability Testing? UX(User Experience) Testing Example](https://www.guru99.com/usability-testing-tutorial.html#3) +* [Usability Testing : How To Perform, Test Cases, Checklist, Methods](https://www.softwaretestingmaterial.com/usability-testing/#h-usability-testing-test-cases) + +Доп. материал: + +* [Вкусный и здоровый гайд по юзабилити-тестированиям](https://vc.ru/marketing/200995-vkusnyy-i-zdorovyy-gayd-po-yuzabiliti-testirovaniyam) +* [Юзабилити-тестирование на удаленке. Выводы и лайфхаки по итогам года работы](https://habr.com/ru/company/ncloudtech/blog/547956/) +* [User Interface Elements](https://www.usability.gov/how-to-and-tools/methods/user-interface-elements.html) +* [Design for Fingers, Touch, and People, Part 1](https://www.uxmatters.com/mt/archives/2017/03/design-for-fingers-touch-and-people-part-1.php) +* [Дизайн-системы](https://tilda.education/courses/web-design/designsystem/#rec43493282) +* [Виталий Фридман - От birthday selector до inline validation: Всё, что нужно знать о веб-формах (ч.1)](https://www.youtube.com/watch?v=SuCz4gWvhiY\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=23) +* [Виталий Фридман - От birthday selector до inline validation: все, что нужно знать о веб-формах (ч.2)](https://www.youtube.com/watch?v=Vs\_TCmY1IGI\&list=PLsVTVVvrKX9td9Zm\_4nF6Ywlz6gC5\_e7K\&index=24) +* [Коридорное тестирование: получаем быстрый фидбек по макетам](https://habr.com/ru/post/219699/) +* [Usability and UX reviews as part of QA](https://theqalead.com/topics/usability-ux-reviews-in-qa/) +* [Игра терминов: UX, UXD, CX, UI, IxD](https://medium.com/%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B5%D0%BC%D1%83-cx-%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80%D1%83/%D0%B8%D0%B3%D1%80%D0%B0-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%B2-ux-uxd-cx-ui-ixd-96f637e6223e) +* [Тестируем интерфейс без юзеров и регистраций, но с эвристической оценкой Нильсена](https://dou.ua/forums/topic/35289/) +* [Gamification In UX - 3 Examples Of Using Gamification In UX](https://uxstudioteam.com/ux-blog/gamification-ux/) +* [Почему хорошее ТЗ еще не означает хороший UI?](https://www.youtube.com/watch?v=xjLwq-gVaiU) +* [Как обосновать usability баг без придирок и вкусовщины](https://www.youtube.com/watch?v=ocDqHsFWxBo) +* [Наука о пользовательском опыте. Использование когнитивных искажений в разработке качественных продуктов](https://habr.com/ru/post/512842/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-ustoichivosti-resilience-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-ustoichivosti-resilience-testing.md new file mode 100644 index 0000000..cf341dc --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-ustoichivosti-resilience-testing.md @@ -0,0 +1,20 @@ +# Тестирование устойчивости (Resilience testing) + +Тестирование устойчивости направлено на обеспечение хорошей работы приложений в реальных или хаотичных условиях. Другими словами, оно проверяет отказоустойчивость приложения или способность противостоять стрессовым или сложным факторам, а также включает в себя тестирование на соответствие (compliance), выносливость (endurance), нагрузочное тестирование и тестирование восстановления (recovery testing). Эту форму тестирования иногда также называют chaos engineering. Поскольку отказов невозможно избежать, тестирование устойчивости гарантирует, что программное обеспечение может продолжать выполнять основные функции и избежать потери данных даже в критических условиях, например, при сбое сети, отказе базы данных, при необходимости выдавая соответствующие сообщения об ошибках. При тестировании на устойчивость запланированным результатом является надежность (Reliability). Устойчивость также известна как восстанавливаемость (recoverability). Тестирование устойчивости можно рассматривать как часть плана обеспечения непрерывности бизнеса (BCP - business continuity plan) организации. + +**Шаги**: + +* Определение метрик: Разработчики должны выбрать, какие показатели следует измерять, чтобы отразить производительность программного обеспечения. Это может включать скорость ввода и вывода, пропускную способность, время восстановления, задержку и взаимосвязь между метриками; +* Определение базового уровня производительности; +* Ввести и измерить сбои: шаг, на котором вводятся проблемы, чтобы попытаться сломать систему. Взлом системы может быть осуществлен различными способами, например, нарушением связи с внешними зависимостями, введением злонамеренного ввода, манипулированием управлением трафиком, ограничением полосы пропускания, отключением систем сопряжения, удалением источников данных и потреблением системных ресурсов. После завершения этих сценариев следует измерить показатели и построить график в соответствии с тем, как каждый из них влияет на производительность; +* Делайте выводы и реагируйте на результаты: результаты следует использовать для начала обсуждения, исправления программного обеспечения и оценки практики команды разработчиков. Команды также должны использовать эти результаты для улучшения последующих сценариев тестирования; + +Источники: + +* [software resilience testing](https://searchsoftwarequality.techtarget.com/definition/software-resilience-testing) + +Доп.материал: + +* [Хаос на практике: зачем ломать production?](https://habr.com/ru/company/domclick/blog/542264/) +* [Resilience testing: Which tool to choose?](https://www.nagarro.com/en/blog/chaos-engineering-resilience-testing-tools) +* [The Importance of Resilience Testing](https://www.softwaretestingnews.co.uk/the-importance-of-resilience-testing/) diff --git a/vidy-metody-urovni-testirovaniya/testirovanie-vynoslivosti-stabilnosti-endurance-soak-stability-testing.md b/vidy-metody-urovni-testirovaniya/testirovanie-vynoslivosti-stabilnosti-endurance-soak-stability-testing.md new file mode 100644 index 0000000..e2ec5f2 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/testirovanie-vynoslivosti-stabilnosti-endurance-soak-stability-testing.md @@ -0,0 +1,11 @@ +# Тестирование выносливости/стабильности (Endurance/Soak/Stability testing) + +_Тестирование износостойкости (endurance testing): Тип тестирования уровня производительности для определения того, может ли элемент тестирования постоянно выдерживать требуемую нагрузку в течение установленного периода времени. (ГОСТ 56920)_ + +Тестирование на выносливость ([Endurance Testing](https://www.softwaretestinghelp.com/endurance-testing/), оно же [Stability Testing](https://www.softwaretestinghelp.com/stability-testing-tutorial/), [Soak Testing](https://www.softwaretestinghelp.com/soak-testing-tutorial/), [Longevity Testing](https://www.softwaretestinghelp.com/longevity-testing/)) включает в себя тестирование системы со значительной нагрузкой в течение длительного периода времени, чтобы выяснить, как система ведет себя при длительном использовании. То есть для обеспечения того, чтобы производительность и / или время отклика после некоторого длительного периода устойчивой активности были не хуже, чем в начале теста. В основном используется для проверки утечек памяти, времени отклика, правильности подключения и закрытия подключения к модулям (например, БД) и т.п. Обычно продолжительность испытания на выносливость составляет 6-8 часов; может отличаться в зависимости от вашего SLA / требований. + +![https://2.bp.blogspot.com/-KbnavvSmd6c/WGpHUSwXs7I/AAAAAAAAAiI/vHbqTrq1QQUd6cGBdNZdz4yn2nbBS2ZEgCLcB/s1600/ET.JPG](https://2.bp.blogspot.com/-KbnavvSmd6c/WGpHUSwXs7I/AAAAAAAAAiI/vHbqTrq1QQUd6cGBdNZdz4yn2nbBS2ZEgCLcB/s1600/ET.JPG) + +Источники: + +* [Do you really know all types of Performance Tests (Non-Functional Tests)?](https://perfmatrix.blogspot.com/2017/01/type-of-performance-test.html) diff --git a/vidy-metody-urovni-testirovaniya/vyborochnoe-khaoticheskoe-testirovanie-random-monkey-testing.md b/vidy-metody-urovni-testirovaniya/vyborochnoe-khaoticheskoe-testirovanie-random-monkey-testing.md new file mode 100644 index 0000000..87488f4 --- /dev/null +++ b/vidy-metody-urovni-testirovaniya/vyborochnoe-khaoticheskoe-testirovanie-random-monkey-testing.md @@ -0,0 +1,44 @@ +# Выборочное/хаотическое тестирование (Random/monkey testing) + +В ISTQB и некоторых других источниках эти понятия разделяются: + +* _Выборочное тестирование (random testing): Разработка тестов методом черного ящика, при котором тестовые сценарии выбираются для соответствия функциональному разрезу, обычно с помощью алгоритма псевдослучайного выбора. Этот метод может использоваться для тестирования таких нефункциональных атрибутов, как надежность и производительность._ +* _Хаотическое тестирование (monkey testing): Тестирование случайным выбором из большого диапазона входов, случайным нажатием кнопок, без соотнесения с тем, как в реальности будет использоваться система._ + +В других же источниках они используются как синонимы. В любом случае, отдельно по Random testing мне не удалось найти хорошего большого материала, так что оставлю пока как есть. + +Monkey Testing - это метод тестирования черного ящика, при котором тестировщик предоставляет случайные входные данные и применяет случайные действия в программном приложении для проверки поведения системы. Это помогает нам оценить, дает ли система сбой при получении таких неожиданных входных данных. Здесь входными данными могут быть данные, которые вводятся в приложение, или нажатие кнопки для следующего действия, или нажатие на ссылку для перехода на другую страницу. + +В Monkey testing тестировщиком (иногда и разработчиком) считается «Обезьяна». Если обезьяна использует компьютер, она будет произвольно выполнять любую задачу в системе из своего понимания. Точно так же, как тестировщик будет применять случайные Test case в тестируемой системе, чтобы находить bugs/errors без предварительного определения тестового примера. В некоторых случаях Monkey testing также посвящен модульному тестированию или GUI-тестированию. Основная задача: попытаться сломать систему. + +Типы Обезьян: + +* Тупая обезьяна (Dumb Monkey): тестировщики не имеют представления о системе и ее функциональных возможностях, флоу, валидности ввода. Затруднено воспроизведение ошибок; +* Умная обезьяна (Smart Monkey): тестировщик имеет четкое представление о системе, ее назначении и функциональности. Тестировщик перемещается по системе и предоставляет действительные данные для выполнения тестирования. Всё это полезно при воспроизведении ошибок. Также умная обезьяна больше сосредоточена на попытках сломать приложение, чем на поиске случайных ошибок. +* Выдающаяся обезьяна (Brilliant Monkey): тестировщики обладают глубокими знаниями о приложении, выполняют тестирование в соответствии с поведением пользователя и могут указать некоторые вероятности возникновения ошибок в будущем; + +Gorilla testing проводится в соответствии с методом ручного тестирования, при котором тестировщик многократно тестирует модуль, чтобы проверить его надежность. Здесь разработчик и тестировщик объединяются, чтобы протестировать конкретный модуль во всех аспектах. При тестировании Gorilla каждый модуль приложения берется по одному, и для проверки этих модулей вводится диапазон допустимых и недопустимых входных данных. Эти входные значения берутся случайным образом. Тестирование Gorilla направлено на изучение возможностей отдельных модулей. При тестировании Gorilla каждый второстепенный код приложения проверяется до тех пор, пока он не начнет разваливаться или не даст ожидаемых результатов. + +* Поскольку Gorilla testing фокусируется на тестировании отдельных модулей, оно может обнаруживать ошибки на ранней стадии, тем самым снижая затраты при высоком покрытии; +* Gorilla testing гарантирует, что даже заблудший пользователь не столкнется с какими-либо сбоями; +* Gorilla testing помогает команде понять уровень толерантности системы. + +| **Monkey Testing** | **Gorilla Testing** | +| --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Не использует никаких тестовых примеров для тестирования приложения, это просто случайные входные данные | Гарантирует, что у модуля нет проблем, выполняя повторяющиеся задачи по вставке случайных входных данных в модуль | +| Синоним Random testing | Также известно как повторяющееся тестирование или Тестирование на пытки или Тестирование на отказоустойчивость (repetitive testing or Torture Testing or Fault Tolerance Testing) | +| Проверяет выполнение всего приложения, используя случайные входные данные, чтобы гарантировать, что система не выйдет из строя из-за неожиданных значений | стремится тщательно протестировать отдельный модуль | +| Может быть выполнено любым стейкхолдером проекта | Для проведения тестирования gorilla требуется разработчик или тестировщик с хорошим знанием приложения | +| Фокусируется на сбое (crashing) всей системы из-за случайного ввода | фокусируется на тестировании функциональности конкретного модуля | + +| **Monkey Testing** | **Ad-hoc Testing** | +| --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Фокусируется на ломании приложения случайным вводом | Фокусируется на поиске ошибок, которые не были обнаружены существующими кейсами | +| Ошибки обнаруживаются на основе случайных входных значений | Ошибки обнаруживаются на основе неисследованных областей приложения | +| Тестировщики не знают приложение, они тестируют приложение, случайным образом щелкая или вводя данные, чтобы проверить, не приводит ли это к ошибке | Тестировщик должен хорошо разбираться в приложении и понимать его функции | +| От тестировщика не требуется быть экспертом в данной области или иметь какие-либо глубокие знания о приложении. | Тестировщик будет знать точный рабочий процесс приложения вместе со знанием предметной области | +| Может быть выполнено любым стейкхолдером | Обычно выполняется тестировщиком, который знает приложение | + +Если мы говорим о ручном тестировании, он может быть менее эффективным, чем другие методы черного ящика. Но если мы добавим тулы автоматизации, она станет мощным инструментом. Просто представьте, что кейсы с различными наборами входных данных генерируются, выполняются и оцениваются автоматически в непрерывном цикле, что позволяет вам запускать тысячи и миллионы кейсов в течение разумного времени. + +Источник: [Monkey Testing Guide](https://www.softwaretestingmaterial.com/monkey-testing/)