Тестирование — важная практика в разработке программного обеспечения. Оно помогает создавать надежное и качественное программное обеспечение и повышает уверенность команды в коде, делая приложение более гибким и подверженным меньшему количеству ошибок при внедрении или изменении функций.
Высокоэффективные команды делают тестирование основной практикой в своей повседневной работе, и никакие функции не выпускаются до того, как будут внедрены автоматизированные тесты. Некоторые разработчики даже пишут тесты перед написанием функций, следуя процессу, называемому TDD (разработка через тестирование).
В этой статье мы протестируем приложения React с помощью Jest и React Testing Library, популярного сочетания среды тестирования JavaScript и утилиты React для тестирования компонентов. Это также официальная рекомендация по документации React.
Что такое тестирование?
Тестирование — это процесс автоматизации утверждений между результатами, которые производит код, и ожидаемыми результатами.
Создание тестов в MS Word
При тестировании приложений React наши утверждения определяются тем, как приложение отображает и реагирует на действия пользователя.
Есть много разных типов парадигм и философий тестирования. В этой статье основное внимание будет уделено созданию модульных и компонентных тестов (или интеграционных тестов).
Введение в библиотеку тестирования Jest и React
Что такое Jest?
Jest — это среда тестирования JavaScript, которая позволяет разработчикам запускать тесты на коде JavaScript и TypeScript и хорошо интегрируется с React.
Это фреймворк, разработанный с учетом простоты и предлагающий мощный и элегантный API для создания изолированных тестов, сравнения снимков, фиксации, покрытия тестами и многого другого.
Что такое React Testing Library?
Библиотека тестирования React — это утилита для тестирования JavaScript, созданная специально для тестирования компонентов React. Он имитирует взаимодействие пользователя с изолированными компонентами и утверждает их выходные данные, чтобы гарантировать правильное поведение пользовательского интерфейса.
Настройка вашей тестовой среды
Начнем с установки необходимых библиотек и настройки проекта. Самый простой способ запустить и запустить приложение React — использовать Create React App, которое поставляется с уже предустановленным Jest.
Сначала создайте приложение React:
npx create-react-app react-jest-tutorial
Теперь установите React Testing Library:
Наконец, установите дополнительные библиотеки:
npm install axios
Разработка React приложения для тестирования
Далее мы создаем минимальное приложение, которое будет отображать пользователей из API. Поскольку мы фокусируемся только на интерфейсе, мы будем использовать пользовательский API JSONPlaceHolder. Это приложение создано исключительно для построения тестов.
Замените содержимое файла App.js следующим:
Затем создайте файл с именем utils.js в папке src и напишите следующую функцию:
Мастер-класс. Создание тестов в программе MyTestXPro.
export function formatUserName(username)
Теперь вы можете запустить приложение с помощью этой команды:
npm start
После этого вы должны увидеть на экране следующее:
Создание модульного теста
Модульные тесты тестируют отдельные модули или компоненты программного обеспечения по отдельности. Единицей может быть функция, процедура, метод, модуль или объект, и цель тестирования — определить, выдает ли модуль ожидаемые результаты для заданного входного начения.
Тестовый модуль включает в себя серию методов, предоставляемых Jest для описания структуры тестов. Мы можем использовать такие методы, как describe или test , следующим образом:
describe(‘my function or component’, () => < test(‘does the following’, () =>< // Magic happens here >); >);
Блок describe — это набор тестов, а test — это тестовый кейс. В наборе тестов может быть несколько тестовых кейсов, и тестовый кейс не обязательно должен быть в тестовом наборе, хотя это обычная практика.
Внутри тестового примера мы пишем утверждения (например, expect в Jest), которые проверяют успешность (зеленый) или ошибочность (красный) утверждения. В каждом тестовом примере может быть несколько утверждений.
Вот несколько тривиальный пример утверждения, которое оказывается успешным:
describe(‘true is truthy and false is falsy’, () => < test(‘true is truthy’, () =>< expect(true).toBe(true); >); test(‘false is falsy’, () => < expect(false).toBe(false); >); >);
Затем давайте напишем наш первый тестовый пример, ориентированный на функцию formatUserName из модуля utils .
Нам нужно создать новый файл: utils.test.js . Обратите внимание, что все тестовые файлы используют шаблон .test.js , где — имя файла модуля для тестирования.
Вот код тестового файла:
Как создать онлайн тест на php
Иногда людям не знающим программирования, нужно создать онлайн тест на php для своего сайта, на самом деле все очень просто, постараюсь наглядно объяснить.
Для решения данной задачи мы будем использовать простую HTML форму и POST запросы. И так приступим.
1. Нам потребуется создать файл php, в общем по сути не важно, если вы используете CMS, то пишете там, где можно вставить php код.
2. Создадим простую форму с полями «radio», то есть для выбора вариантов ответа и кнопкой для результатов.
В результате получим:
3. Отлично мы создали форму. Теперь в неё нужно внести изменения, чтобы она работала.
Добавим атрибуты к форме.
method=»POST» — метод отправки php форм.
action=»result.php» — файл, в который будут отправляться результаты формы.
4. Присвоим уникальное имя вариантам ответов, чтобы объединить их между собой, для одного вопроса — name = «имя»:
5. А теперь пропишем имя ответов к каждому варианту, например ‘value = «a»‘
В результате получим:
6. Создадим файл result.php в том же каталоге, в котором создадим скрипт теста на php для обработки и вывода результата правильных и не правильных ответов.
Правильных ответов:
Неправильных ответов:
7. Перед html кодом добавим скрипт php:
else <$not++;>if ($_POST[q2] == a) <$ot++;>else <$not++;>?>
Описание: Здесь все довольно просто, мы создаем простое условие для каждого вопроса. Если в вопросе [q1] вариант «a», то прибавляем к переменной «$ot» + 1 ($ot — количество правильных ответов), если другой вариант то записываем в переменную $not «неправильных ответов» + 1.
8. Теперь выводим на страницу в html коде правильные и неправильные ответы:
Правильных ответов:
Неправильных ответов:
Заключение. Теперь у вас есть простой тест на php и html, теперь можно и запустить его для онлайн. Вы можете добавить сколько угодно вариантов ответов по аналогии. Добавить стилей и улучшить код. Можно было все сделать намного грамотней, но проще этого не придумаешь.
Работа у теста такая: выбрали варианты, нажали на кнопку «результат», нас перекидывает на вторую страницу, где выводится подсчет правильных и неправильных ответов. Удачи!
С помощью POST-запроса можно реализовать обратную форму, о том, как это делается читайте в статье — Форма обратной связи php без спама.
Источник: daruse.ru
Как провести юнит-тестирование приложений с БД
Рассказываем про разные способы юнит-тестирования приложения с БД, в том числе о том, что мы используем при разработке продуктов Selectel.
Рассказываем про разные способы юнит-тестирования приложения с БД, в том числе о том, что мы используем при разработке продуктов Selectel.
В современном мире множество приложений используют трехуровневую архитектуру с базой данных в слоях данных. Наличие юнит-тестов обычно упрощает поддержку продукта, но присутствие базы данных в архитектуре заставляет разработчиков применять смекалку.
Статья посвящена Python 3, pytest и ORM-фреймворку SQLAlchemy, но методы переносимы и на другие инструменты.
Окружение
Сперва определим контекст повествования. Примеры могут выглядеть синтетическими и неправдоподобными. Это сделано намеренно, чтобы не отвлекаться на детали реализации приложения. Более того, так код будет более понятным для читателей, незнакомых с Python.
from sqlalchemy import Column, Integer, String, Boolean from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class Server(Base): __tablename__ = ‘example_server’ primary_key=True) ip = Column(String, nullable=False) hostname = Column(String, nullable=False) power_on = Column(Boolean, server_default=’False’)
В качестве тестируемой функции предложим ту, что выключает сервер. Сделаем ее простой и странной:
from sqlalchemy.orm import Session def power_off(session: Session, server: Server) -> bool: «»» Method tries to power off server :param server: :return: True if success, False otherwise «»» if server.id % 2 != 0: success = True else: success = False if success: server.power_on = False session.commit() return success
Итак, у нас есть небольшой отрывок приложения, которое совершает какую-то полезную работу и использует данные из базы. Как его можно протестировать?
Отсутствие тестирования
Самый простой способ. В начале проекта обычно самый выгодный с точки зрения затрат времени, но в дальнейшем может вызвать множество проблем.
Достоинства:
- не требует умений;
- экономит время на старте проекта.
Недостатки:
- негативные последствия в долгосрочной перспективе.
Не стоит принимать этот пункт как решение.
Имитация базы данных
Приведенный пример достаточно простой, и обращение к ORM-фреймворку только одно при коммите у объекта сессии, так как информация о сервере передается в виде объекта. При такой архитектуре можно передать модифицированный объект Session. Например:
class MockSession(Session): def commit(self): pass def test_mock(): mock = MockSession() server = Server() server.id = 1 server.power_on = True assert power_off(mock, server) is True assert server.power_on is False
Такой подход позволяет не использовать базу данных, а значит, тесты будут работать быстрее.
Достоинства:
- требует минимальной настройки;
- наиболее быстрое выполнение тестов.
Недостатки:
- неприменим или крайне сложен для некоторых архитектурных подходов;
- код инициализации начальных данных растет с наличием связей в объекте;
- запись в БД не производится, следовательно ORM не проверяет ограничения (constraint), заданные в модели.
Последнее не является критичной проблемой, но, если проверка будет производиться, это повысит доверие к результатам тестов.
Резидентная база данных
Когда нужна временная база данных, вспоминается несколько решений, умеющих хранить данные в памяти. Мне приходят на ум минимум два решения:
- встраиваемая БД — SQLite;
- легковесная БД, о которой я слышал от Java-разработчиков, — H2.
Очевидно, что SQLite во многом уступает «полноценным» базам данных, но это самый простой в настройке вариант, поэтому начнем с него. Теперь в тестах необходимо создать подключение к БД и сессию. Создаем соответствующие фикстуры.
Фикстура engine принудительно сбрасывает информацию в БД, которая может помешать тесту, и создает «чистую» схему в соответствии с описанием ORM-моделей. По завершении тестирования схема сбрасывается.
Обратите внимание, что схема подключения к БД передается через переменную окружения HABR_TEST_DB_URL. Фикстура engine предусматривает отсутствие данной переменной окружения и корректно обрабатывает эту ситуацию: отмечает тесты как пропущенные с говорящим сообщением об ошибке. Таким образом все тесты, использующие базу данных, будут пропускаться при ее отсутствии.
Теперь создаем фикстуру, которая представляет сервер.
В отличие от предыдущего пункта, здесь необходимо указать все поля, которые не могут быть null. Иначе база данных просто не примет наш запрос. Эта фикстура однажды определяется и может быть переиспользована, например, в тестах редактирования записи. Напишем два простейших теста:
def test_presence(server): assert server.ip == ‘127.0.0.1’ def test_embedded_db(session, server): assert power_off(session, server) is True assert server.power_on is False