Чем отличается функциональное тестирование от нефункционального
Перейти к содержимому

Чем отличается функциональное тестирование от нефункционального

  • автор:

Чем отличается функциональное тестирование от нефункционального

События

  • Тестирование
    • Основы
      • Откуда берутся ошибки в ПО?
      • Почему тестирование необходимо?
      • Мифы о тестировании
      • Психология тестирования
      • Когда начинать и заканчивать тестирование?
      • Фундаментальный процесс тестирования
      • Принципы тестирования
      • Верификация и валидация
      • QA, QC и тестирование
      • Кто занимается тестированием?
      • Цели тестирования
      • Что такое тестирование программного обеспечения?
      • Роль тестирования в процессе разработки ПО
      • Сколько стоят дефекты?
      • Качество программного обеспечения (ISO/IEC 25010)
      • Матрица соответствия требований (Requirements Traceability Matrix)
      • Тестирование веб-проектов: основные этапы и советы.
      • Мобильное и веб-приложение. В чем разница?
      • Тест дизайн (Test Design)
      • Agile
      • Словарь тестировщика
      • 75 популярных вопросов на собеседовании QA (+ примеры и ответы)
      • HTML и CSS для тестировщиков
      • Итеративная модель (Iterative model)
      • Спиральная модель (Spiral model)
      • V-модель (V-model)
      • Каскадная модель (Waterfall model)
      • Стадии цикла разработки ПО
      • Жизненный цикл ПО
      • Приемочное тестирование
      • Системное тестирование
      • Интеграционное тестирование
      • Модульное тестирование
      • White/Black/Grey Box-тестирование
      • Статическое и динамическое тестирование
      • Ручное и автоматизированное
      • Тестирование документации
      • Интернационализация и локализация
      • Стресс тестирование
      • Тестирование установки
      • Конфигурационное тестирование
      • Тестирование на отказ и восстановление
      • Юзабилити
      • Тестирование сборки
      • Тестирование взаимодействия
      • Тестирование безопасности
      • Дымное тестирование
      • Регрессионное тестирование
      • Тестирование производительности
      • Функциональное тестирование
      • Нефункциональное тестирование
      • Спецификация требований
      • Test Plan
      • Checklists для тестировщика
      • Test Case
      • Bug report
      • Жизненный цикл дефектов
      • Классификация дефектов
      • Тестирование мобильных приложений
      • Протоколы
        • Протокол TCP/IP или как работает Интернет (для новичков)
        • Автоматизация
          • Автоматизированное тестирование
          • Теория по X-Path локаторам
          • Как написать X-Path локатор.
          • Использование tagname
          • Вложенность родительского элемента.
          • Как выбрать инструмент автоматизации?
          • Базы данных в тестировании
            • Зачем нужен SQL для тестирования?
            • Общее
              • Интерфейс в коде ПО
              • Что такое микросервисная архитектура ПО?
              • Что такое монолитная архитектура?
              • Что такое API?
              • Процесс коммуникации с помощью API
              • Что такое JSON
              • Что не так с Android?
              • Android Studio 2.0
                • RxJava
                • Основы
                  • Внутренний мир компьютера: что там внутри

                  В отличии от функционального тестирования, целью которого является проверка соответствия реальных функций продукта с функциональными требованиями, как Вы уже наверное догадались, целью нефункционального тестирования является проверка соответствия свойств приложения с его нефункциональными требованиями.

                  Соответственно: нефункциональное тестирование – тестирование свойств, которые не относятся к функциональности системы. Данные свойства определяются нефункциональными требованиями, которые характеризуют продукт с таких сторон, как:

                  Надежность (реакция системы на непредвиденные ситуации).

                  Производительность (Работоспособность системы под разными нагрузками).

                  Удобство (Исследование удобности работы с приложением с точки зрения пользователя).

                  Масштабируемость (Требования к горизонтальному или вертикальному масштабированию приложения).

                  Безопасность (Защищенность пользовательских данных).

                  Портируемость (Переносимость приложения на различные платформы).

                  И много других качеств.

                  Данные свойства системы можно исследовать, используя следующие виды тестирования:

                  Тестирование установки (Installation testing) – проверка успешности установки приложения, его настройки и удаления. Снижает риски потери пользовательских данных, потери работоспособности приложения и пр.

                  Тестирование удобства использования (Usability testing) – характеризует систему с точки зрения удобства использования конечного пользователя.

                  Конфигурационное тестирование (или тестирование портируемости) – исследование работоспособности программной системы в условиях различных программных конфигураций.

                  Тестирование на отказ и восстановление (Failover and Recovery Testing) – исследование программной системы на предмет восстановления после ошибок, сбоев. Оценивание реакции защитных свойств приложения.

                  Как видите, хотя нефункциональное тестирование и не проверяет систему на выполнение тех функций, которые хочет от него заказчик, оно позволяет контролировать более глобальные свойства: безопасность, производительность, надежность и другие. Данные требования характеризуют качество программной системы в целом, что позволяет тем или иным образом оставлять у пользователя впечатления, которые повлияют на популярность и рейтинг компании-разработчика.

                  • Выбери курс для обучения
                    • Тестирование
                      • Базовый модуль тестирования
                      • Тестирование ПО
                      • Тестирование WEB-сервисов
                      • Тестирование мобильных приложений
                      • Тестирование нагрузки с JMeter
                      • Расширенный модуль автоматизации тестирования
                      • Автоматизация тестирования с Selenium WebDriver (Python)
                      • Автоматизация тестирования с Selenium WebDriver (Java)
                      • Автоматизация тестирования с Selenium WebDriver (C#)
                      • Автоматизация тестирования на JavaScript
                      • Java для автоматизаторов
                      • Fullstack Web Developer
                      • Java
                      • Python
                      • JavaScript
                      • HTML5 И CSS3
                      • Полный стек разработки на фреймворке Laravel
                      • Разработка CMS на основе PHP
                      • Git для автоматизаторов
                      • Практический SQL
                      • Основы Unix и сети
                      • WEB-серверы и WEB-сервисы
                      • Создание проекта автоматизации и написания UI тестов
                      • Составление комбинированных тестов UI и API. Написание BDD тестов
                      • IT Project Manager
                      • HR-менеджер в ИТ-компании
                      • Как правильно составить резюме и пройти собеседование
                      • Подготовка к сертификации ISTQB Foundation Level на основе Syllabus Version 2018
                      • Тестирование
                        • Базовый модуль тестирования

                        Функциональное и нефункциональное тестирование: обзор аспектов и сравнение

                        В современном мире программного обеспечения качество продукта играет ключевую роль в успехе любой организации. Тестирование — это один из основных этапов разработки программного обеспечения, который помогает обеспечить высокое качество продукта. В этой статье мы рассмотрим два основных типа тестирования: функциональное и нефункциональное, а также их характеристики, примеры, предоставим чек-лист тестирования и многое другое.

                        Виды функционального и нефункционального тестирования

                        Функциональное тестирование — это процесс проверки различных функций программного обеспечения для выявления ошибок и убеждения в том, что они работают согласно спецификациям. Обычно к этапам функционального тестирования можно отнести следующие виды и уровни тестирования:

                        1. Юнит-тестирование
                        2. Интеграционное тестирование
                        3. Системное тестирование
                        4. Регрессионное тестирование
                        5. Тестирование приемлемости для пользователя (UAT)

                        Нефункциональное тестирование относится к аспектам программного обеспечения, которые не связаны с конкретными функциями, включая следующие аспекты:

                        1. Тестирование производительности
                        2. Тестирование безопасности
                        3. Тестирование совместимости
                        4. Тестирование надежности
                        5. Тестирование юзабилити и GUI
                        6. Тестирование локализации и интернализации

                        Примеры функционального и нефункционального тестирования

                        Функциональное тестирование обычно сосредоточено на следующих аспектах:

                        1. Проверка форм на сайте: валидация данных, обязательные поля, правильность сообщений об ошибках.
                        2. Тестирование навигации: переход между страницами, гиперссылки, кнопки, меню и другие элементы управления.
                        3. Тестирование функционала поиска: алгоритмы фильтрации, сортировки, пагинация.

                        Нефункциональное тестирование может включать такие аспекты:

                        1. Тестирование производительности: измерение времени отклика сервера, обработки запросов и времени загрузки страниц.
                        2. Тестирование безопасности: проверка на уязвимости, атаки на отказ в обслуживании (DDoS), SQL-инъекции, перехват данных.
                        3. Тестирование совместимости: проверка работы программного обеспечения на разных платформах, браузерах и устройствах.

                        Чек-лист функционального тестирования

                        Чек-лист функционального тестирования — это список контрольных вопросов, которые помогают сосредоточиться на ключевых аспектах функциональности программного обеспечения.

                        Чек-лист может быть адаптирован под конкретный продукт или проект, но некоторые общие элементы, которые можно включить, включают:

                        1. Соответствие требованиям:
                        • Проверить, соответствует ли каждая функция требованиям, указанным в спецификациях
                        • Проверить, является ли документация проекта актуальной и полной
                        1. Юнит-тестирование:
                        • Проверить, есть ли тесты для всех модулей и компонентов
                        • Проверить, пройдены ли все юнит-тесты
                        1. Интеграционное тестирование:
                        • Проверить, правильно ли взаимодействуют модули и компоненты
                        • Проверить, пройдены ли все интеграционные тесты
                        1. Системное тестирование:
                        • Проверить, соответствует ли система всем требованиям спецификаций
                        • Проверить, пройдены ли все системные тесты
                        1. Регрессионное тестирование:
                        • Проверить, не влияют ли новые изменения на уже существующие функции
                        • Проверить, пройдены ли все регрессионные тесты
                        1. Тестирование на приемлемость (UAT):
                        • Проверить, соответствует ли программное обеспечение ожиданиям и потребностям пользователей
                        • Проверить, пройдены ли все тесты на приемлемость
                        1. Графический интерфейс пользователя (GUI):
                        • Проверить, работают ли все элементы интерфейса должным образом
                        • Проверить, соответствует ли дизайн интерфейса стандартам и спецификациям
                        1. Валидация ввода данных:
                        • Проверить, правильно ли обрабатываются введенные данные
                        • Проверить, соответственно ли система реагирует на некорректные входные данные
                        1. Интернационализация и локализация:
                        • Проверить, поддерживает ли система разные языки и региональные настройки
                        • Проверить, соответствуют ли переводы и форматы данных местным стандартам
                        1. Интеграция со сторонними системами:
                        • Проверить, правильно ли взаимодействует программное обеспечение со сторонними системами и сервисами
                        • Проверить, пройдены ли все тесты интеграции со сторонними системами.

                        Автоматизированное и ручное функциональное тестирование

                        Автоматизированное тестирование заключается в использовании специального программного обеспечения для написания и выполнения тестовых сценариев. Оно может значительно сократить время, затраченное на тестирование, и обеспечить большую надежность результатов.

                        Ручное тестирование предполагает непосредственную проверку программного обеспечения тестировщиками без использования автоматизации. Это может быть эффективным для выявления нетипичных ошибок, а также для тестирования пригодности для пользователей, где важен элемент человеческого восприятия.

                        Выводы

                        Как функциональное, так и нефункциональное тестирование являются важными элементами процесса разработки программного обеспечения. Эти типы тестирования помогают обеспечить высокое качество продукта и удовлетворить потребности пользователей.

                        При разработке программного обеспечения лучше использовать комбинацию функционального и нефункционального тестирования для выявления разнообразных проблем и обеспечения высокого качества продукта. Автоматизация тестирования может помочь сократить время и затраты, но ручное тестирование все еще имеет свое место в процессе, особенно для тестирования на пригодность и проверки нетипичных сценариев.

                        Понимание разницы между функциональным и нефункциональным тестированием и использование их в сочетании поможет командам разработчиков создавать качественные, надежные и эффективные продукты, которые удовлетворят потребности пользователей. Правильное планирование, тщательный анализ требований, надлежащее выполнение тестовых сценариев и постоянное усовершенствование процесса тестирования способствуют успеху проекта и удовлетворению клиентов.

                        Если вы интересуетесь тестированием, рекомендуем пройти наш курс QA с трудоустройством — в нем вы на практике сможете освоить профессию.

                        Как проверить качество кода: функциональное и нефункциональное тестирование

                        Как проверить качество кода: функциональное и нефункциональное тестирование главное изображение

                        Представьте, что вы собираетесь купить машину. Вы обращаетесь в автосалон и записываетесь на тест-драйв — хотите проверить, как машина покажет себя на дороге. Люди часто заранее изучают товар или продукт, перед тем как купить его. Так мы проверяем, соответствует ли продукт нашим ожиданиям, выполняет ли свои функции.

                        Многие вещи проходят этап тестирования не только перед покупкой, но и на производстве.

                        Прежде чем вашу будущую машину отправили в салон, ее тщательно протестировали на заводе: изучили, как работают все системы в разных условиях. Это важно, чтобы бренд не выпустил на рынок некачественный товар — а значит сохранил свою репутацию и предотвратил убытки.

                        В разработке программ всё работает похожим образом. Перед тем, как выпустить приложение на рынок, компания проводит тестирование — проверяет готовый продукт и выясняет, соответствует ли он требованиям. Если на этом этапе найдутся ошибки, команда сможет вовремя их исправить.

                        Машину, приложение или любой другой большой продукт сложно тестировать без четких технических требований. Обычно они записаны в документ, о котором мы поговорим ниже.

                        Документация и технические требования

                        Рассмотрим еще один пример. Предположим, вам нужно поменять обычный чайник на электрический. Еще до покупки вы определились, что новый чайник должен:

                        • Работать от электричества
                        • Вмещать полтора литра воды
                        • Быстро греть воду до 99-100 градусов
                        • Автоматически отключаться после кипения

                        Вы открываете интернет-магазин и изучаете разные предложения. Открыв описание очередной карточки, вы видите список технических требований:

                        • Работа от электросети
                        • Объем более 1,5 литра
                        • Нагрев воды до 99-100 градусов
                        • Автоматическое отключение

                        Именно такой чайник вы и искали — все технические требования подходят.

                        Как у бытовых приборов, у программ тоже есть характеристики. Обычно они записаны в документе, который называется техническое задание или документация.

                        Тестировщики в своей работе часто обращаются к документации. Она помогает выяснить качество продукта и провести оба вида тестирования: функциональное и нефункциональное. В первую очередь начинающий тестировщик сталкивается именно с этими видами тестирования. Поэтому мы разберемся в них подробнее.

                        Функциональное тестирование

                        Первый вид тестирования — это функциональный. В этом случае тестировщик проверяет, выполняет ли продукт свои функции так, как это заявлено в требованиях.

                        Рассмотрим функциональное тестирование на знакомом примере. Мы распаковываем чайник, вставляем его в розетку, наливаем воду и нажимаем кнопку. Если он включился, подогрел воду до 100 градусов и выключился — функциональное тестирование пройдено. Чайник выполняет все основные функции из документации.

                        Иногда требований может и не быть — тогда проводится функциональное тестирование без документации. Большинство микроволновок начинают греть еду, если нажать на кнопку «Старт», в некоторых моделях надо еще выставить мощность и время. Зная всё это на личном опыте, мы можем провести функциональное тестирование, не уточняя требования в документации.

                        Нефункциональное тестирование

                        Первый вид тестирования отвечает на вопрос «Что умеет делать наш продукт?», но на этом проверки не заканчиваются. Еще надо понять, насколько приятным, удобным и безопасным получился продукт. Чтобы выяснить, как продукт выполняет свои задачи, нужно провести нефункциональное тестирование.

                        Продолжим пример с чайником. Какие еще требования надо проверить?

                        • Безопасность. Важно, чтобы пользователь не пострадал. Поэтому у чайника не должно быть оголенных проводов или щелей в корпусе
                        • Скорость. Согласитесь, пользователи останутся недовольны, если чайник будет нагревать воду дольше десяти минут
                        • Удобство. Нужно проверить, насколько удобным получился продукт. Хватает ли его объема? Комфортно ли его держать одной рукой?

                        С тестированием чайников мы разобрались, но как эти знания применить для программ и приложений?

                        Как тестируют программы и приложения

                        Представьте, что вы работаете тестировщиком приложения в банке и хотите проверить форму ввода логина и пароля. Это важный этап: если пользователь не сможет залогиниться, у него не откроется доступ к остальным функциям.

                        Читайте также: Гид по профессии тестировщик: чем занимается специалист в сфере QA, сколько зарабатывает, что надо знать и где учиться

                        Начнём с функционального тестирования. С точки зрения пользователя важно, чтобы форма выполняла основные функции:

                        • Позволяла ввести логин (номер телефона, email-адрес или никнейм)
                        • Позволяла ввести пароль
                        • Успешно обрабатывала информацию и позволяла пользователю войти

                        Если эти функции работают, пользователь сможет зайти в свой аккаунт и воспользоваться всеми остальными возможностями банка.

                        Перейдем к проверке нефункциональных требований.

                        В первую очередь пользователи мобильного банка обращают внимание на безопасность. Поэтому тестировщику нужно проверить форму логина и пароля, найти слабые места в ее защите и рассказать об этом разработчикам. Они устранят проблемы и сведут риски к минимуму.

                        Еще важно, чтобы форма авторизации загружалась быстро, потому что клиенты банка будут пользоваться формой с мобильного устройства. Вряд ли они захотят подолгу стоять с телефоном в руках в ожидании загрузки, ведь медленная работа приложения будет раздражать пользователей.

                        Третий важный критерий — удобно ли пользователю вводить свои данные. Нужно проверить, вдруг:

                        • Поля для логина и пароля находятся слишком близко друг к другу, поэтому сложно выбрать нужное поле на сенсорном экране
                        • Текст пароля не закрывается звездочками, поэтому пользователю придется прикрывать экран рукой

                        Тестировать продукт или программу важно, и можно делать это очень по-разному. Пока мы познакомились только с двумя видами, которые отличаются по цели:

                        • Цель функционального тестирования — проверить, верно ли реализованы запланированные функции в продукте
                        • Цель нефункционального тестирования — проверить, как продукт работает с точки зрения удобства, скорости, безопасности и других важных параметров.

                        Разговоры о качестве продукта не ограничиваются двумя видами тестирования. В классификации есть еще много важных видов и типов. На практике с ними сталкиваются также часто, как с функциональным и нефункциональным тестированием.

                        Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях

                        Функциональное и нефункциональное тестирование

                        При разработке ПО тестирование позволяет выявить ошибки, дефекты и недостатки в программном продукте, и, соответственно, разработчикам — исправить их и создать стабильное и надежное решение. Одним из ключевых аспектов тестирования является разделение на функциональное (фокусируется только на проверке основных функций программы) и нефункциональное тестирование (оценивает производительность, надежность, безопасность и другие аспекты).

                        Функциональное тестирование

                        Данный тип тестирования проверяет основные функции программы, то есть то, что она должна делать.

                        Допустим, у нас есть программа для редактирования фотографий. Основные функции этой программы могут быть такими, как изменение размера фото, добавление фильтров или ретушь. Так вот, функциональное тестирование будет проверять, выполняются ли эти функции правильно. Например, мы можем проверить, что при изменении размера фото оно действительно меняется в соответствии с указанными размерами. Или мы можем убедиться, что применение фильтров к фото дает ожидаемый результат.

                        Цель и задачи функционального тестирования состоят в том, чтобы выявить ошибки и дефекты, связанные с функциональностью программы и включают проверку правильности работы основных функций, обработку ошибок и исключительных ситуаций, а также взаимодействие с другими компонентами системы.

                        �� Приглашаем Вас на курс QA Automation от компании Foxminded!

                        Что вы получите:

                        �� 7-дневный тестовый период: Оцените эффективность обучения перед окончательным решением.

                        ��️ Насыщенную программу: Работа с Selenium Webdriver, SQL, Java и другими ключевыми инструментами.

                        Наши преимущества:

                        �� Индивидуальный менторинг: Получите поддержку и ответы на ваши вопросы от опытных экспертов.

                        ❄️ Бесплатная заморозка: Обучайтесь, учитывая свой график и обстоятельства.

                        Ваш путь к успеху:

                        �� Начните с Java Start: Для тех, кто только начинает.

                        �� Достигайте уровня Strong Junior: На программах Менторинг и Менторинг+

                        Виды функционального тестирования

                        Существуют разные виды функционального тестирования:

                        Вид тестирования Описание
                        Модульное Проверка отдельных модулей программы для убеждения в их корректной работе в изоляции от других компонентов.
                        Интеграционное Тестирование взаимодействия и интеграции различных модулей программы для проверки их совместной работы.
                        Системное Оценка работы всей системы в целом, включая взаимодействие между ее компонентами и функциональность в различных сценариях использования.
                        Регрессионное Проверка, не повлияло ли внесение изменений в программу на уже ранее протестированную функциональность, чтобы убедиться, что она продолжает работать корректно.

                        Каждый вид имеет свои особенности и цели:

                        Виды функционального тестирования

                        • Модульное: представьте, что у вас есть программный проект, разделенный на отдельные модули. Модульное тестирование позволяет проверить каждый модуль программы отдельно, чтобы убедиться, что он работает правильно. Например, если это модуль для вычисления суммы чисел, то модульное тестирование позволит убедиться, что этот модуль правильно складывает числа без ошибок.
                        • Интеграционное: когда модули программы уже протестированы отдельно, наступает момент проверки их взаимодействия. Интеграционное тестирование позволяет убедиться, что модули работают вместе корректно. Например, модуль для чтения данных из базы данных и модуль для отображения этих данных на веб-странице, — мы можем убедиться, что данные правильно передаются из базы данных на страницу и отображаются корректно.
                        • Системное: это проверка всей системы в целом. Включает проверку работы всех компонентов программы и взаимодействия между ними. Например, в случае онлайн-магазина системное тестирование проверит, что покупка товара, оплата и доставка происходят без проблем и взаимодействие между базой данных, корзиной покупок и системой оплаты работает корректно.
                        • Регрессионное: при внесении изменений в программу, оно помогает убедиться, что уже ранее протестированная функциональность не была нарушена. Например, при внесении изменений в программу, связанные с обработкой платежей, регрессионное тестирование поможет убедиться, что после изменений платежи продолжают обрабатываться правильно, а предыдущая функциональность не нарушена.

                        Все эти виды функционального тестирования имеют свою важность и помогают гарантировать качество программного продукта, проверяя его функциональность в различных аспектах.

                        Нефункциональное тестирование

                        Это такое тестирование, которое не только проверяет, что программа делает свою основную работу, но и оценивает ее качество с точки зрения различных аспектов, не связанных непосредственно с ее функциями.

                        Давайте представим, у нас есть приложение для потоковой передачи видео. Его основной функцией является воспроизведение видео. Однако, нефункциональное тестирование будет оценивать и другие аспекты, такие как производительность, безопасность и удобство использования.

                        Целью нефункционального тестирования является проверка и оценка характеристик ПО, которые влияют на пользовательский опыт, выявление проблемы с производительностью, безопасностью и удобством использования программы.

                        Виды нефункционального тестирования

                        Нефункциональные виды тестирования Примеры и объяснение
                        Производительности Проверяет, как хорошо программа работает в условиях ожидаемой нагрузки и определенных показателей. Например, можно тестировать время отклика веб-приложения при одновременном доступе к нему большого количества пользователей.
                        Нагрузки Оценивает способность программы справиться с экстремальными условиями нагрузки. Например, можно проверить, как программа работает при одновременном выполнении большого числа транзакций или запросов к базе данных.
                        Безопасности Проверяет уязвимости программы и ее способность защитить данные от несанкционированного доступа или атак. Например, можно провести тесты на проникновение, чтобы выявить слабые места в системе безопасности и защитить их.
                        Удобства использования Оценивает, насколько легко и удобно пользователи могут работать с программой. Например, можно провести тестирование юзабилити для оценки понятности интерфейса, удобства навигации и соответствия программы потребностям пользователей.

                        Каждый вид оценивает соответствующую характеристику программного обеспечения.

                        Приведем пример к каждому из них:

                        Пример: измерение времени отклика программы при обработке запросов.

                        Объяснение: позволяет оценить, насколько быстро и эффективно программа обрабатывает задачи и отвечает на запросы пользователей. Это может включать измерение времени выполнения определенных операций или сравнение производительности различных версий программы.

                        Пример: проверка производительности программы при одновременном доступе большого числа пользователей.

                        Объяснение: позволяет определить, как программа справляется с интенсивной активностью пользователей или большим объемом данных. Это может включать симуляцию работы сотен или тысяч пользователей одновременно для проверки стабильности и производительности программы.

                        �� Подпишись на наш Ютуб-канал! ��Полезные видео для программистов уже ждут тебя!

                        �� Выбери свой курс программирования! �� Путь к карьере программиста начинается здесь!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *