Тестирование — это процесс, во время которого приложение проводится с разных точек зрения, чтобы:
- Найти список вопросов
- Найти различия между ожидаемым и фактическим результатом, выходом, состояниями и т. Д.
- Понять этап реализации.
- Найдите приложение полезным для реалистичных целей.
Целью тестирования является не ошибка разработчика, а предоставление инструментов и повышение качества для оценки работоспособности приложения в данный момент времени.
Тестирование необходимо планировать заранее. Это требует определения цели тестирования, понимания объема тестовых случаев, составления списка бизнес-требований и понимания рисков, связанных с различными фазами проекта.
Тестирование определяется как ряд аспектов, которые должны быть проверены в системе или приложении. Ниже приведен список общих подходов к тестированию:
-
Модульное тестирование — это обычно выполняется самими разработчиками. Это нацелено на проверку того, работает ли единица кода как ожидалось или нет.
-
Юзабилити-тестирование. Разработчики обычно могут забыть, что они пишут приложение для конечных пользователей, которые не имеют знаний о системе. Юзабилити-тестирование проверяет плюсы и минусы продукта.
-
Функциональное / приемочное тестирование. В то время как юзабилити-тестирование проверяет работоспособность приложения или системы, функциональное тестирование обеспечивает реализацию всех указанных функциональных возможностей.
-
Тестирование нагрузки и производительности — это делается для того, чтобы понять, может ли система адаптироваться к нагрузочным и тестам производительности, которые необходимо провести. Это может привести к изменениям в оборудовании, оптимизации запросов SQL и т. Д.
-
Регрессионное тестирование — оно проверяет, что последовательные выпуски продукта не нарушают ни одну из предыдущих функций.
-
Проверка надежности и устойчивости — Проверка надежности помогает при проверке системного приложения с разбивкой одного или нескольких компонентов.
Модульное тестирование — это обычно выполняется самими разработчиками. Это нацелено на проверку того, работает ли единица кода как ожидалось или нет.
Юзабилити-тестирование. Разработчики обычно могут забыть, что они пишут приложение для конечных пользователей, которые не имеют знаний о системе. Юзабилити-тестирование проверяет плюсы и минусы продукта.
Функциональное / приемочное тестирование. В то время как юзабилити-тестирование проверяет работоспособность приложения или системы, функциональное тестирование обеспечивает реализацию всех указанных функциональных возможностей.
Тестирование нагрузки и производительности — это делается для того, чтобы понять, может ли система адаптироваться к нагрузочным и тестам производительности, которые необходимо провести. Это может привести к изменениям в оборудовании, оптимизации запросов SQL и т. Д.
Регрессионное тестирование — оно проверяет, что последовательные выпуски продукта не нарушают ни одну из предыдущих функций.
Проверка надежности и устойчивости — Проверка надежности помогает при проверке системного приложения с разбивкой одного или нескольких компонентов.
Модульное тестирование
Приложения фотоблога постоянно используют модульные тесты для проверки следующего:
- Новые функции работают правильно и как и ожидалось.
- Существующие функциональные возможности не нарушаются новым выпуском кода.
- Дефекты исправлены и остаются исправленными.
Python поставляется со стандартным модулем unittest, предлагающим другой подход к модульному тестированию.
Модульный тест
unittest основан на JUnit, пакете модульных тестов Java, разработанном Кентом Беком и Эрихом Гаммой. Модульные тесты просто возвращают определенные данные. Ложные объекты могут быть определены. Эти объекты позволяют проводить тестирование на интерфейсе нашего проекта, не полагаясь на общее приложение. Они также предоставляют способ запуска тестов в режиме изоляции, включая другие тесты.
Давайте определим фиктивный класс следующим образом —
import unittest class DummyTest(unittest.TestCase): def test_01_forward(self): dummy = Dummy(right_boundary=3) self.assertEqual(dummy.forward(), 1) self.assertEqual(dummy.forward(), 2) self.assertEqual(dummy.forward(), 3) self.assertRaises(ValueError, dummy.forward) def test_02_backward(self): dummy = Dummy(left_boundary=-3, allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3) self.assertRaises(ValueError, dummy.backward) def test_03_boundaries(self): dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.forward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3)
Объяснение кода следующее:
-
Модуль unittest должен быть импортирован, чтобы обеспечить возможности модульного тестирования для данного класса.
-
Класс должен быть создан путем подкласса unittest.
-
Каждый метод в приведенном выше коде начинается со слова test. Все эти методы вызываются обработчиком unittest.
-
Методы assert / fail вызываются тестовым примером для управления исключениями.
Модуль unittest должен быть импортирован, чтобы обеспечить возможности модульного тестирования для данного класса.
Класс должен быть создан путем подкласса unittest.
Каждый метод в приведенном выше коде начинается со слова test. Все эти методы вызываются обработчиком unittest.
Методы assert / fail вызываются тестовым примером для управления исключениями.
Рассмотрим это как пример для запуска тестового примера —
if __name__ == '__main__': unittest.main()
Результат (выход) для запуска контрольного примера будет следующим:
---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
Функциональное тестирование
Как только функциональные возможности приложения начинают формироваться в соответствии с требованиями, набор функционального тестирования может подтвердить правильность приложения в отношении спецификации. Тем не менее, тест должен быть автоматизирован для повышения производительности, что потребует использования сторонних продуктов, таких как Selenium.
CherryPy предоставляет вспомогательные классы, такие как встроенные функции, для облегчения написания функциональных тестов.
Нагрузочное тестирование
В зависимости от приложения, которое вы пишете, и ваших ожиданий с точки зрения объема, вам может потребоваться выполнить нагрузочное тестирование и тестирование производительности, чтобы обнаружить потенциальные узкие места в приложении, которые мешают ему достичь определенного уровня производительности.
В этом разделе не будет подробно описано, как проводить тестирование производительности или нагрузку, поскольку оно выходит из пакета FunkLoad.
Самый простой пример FunkLoad выглядит следующим образом:
from funkload.FunkLoadTestCase import FunkLoadTestCase class LoadHomePage(FunkLoadTestCase): def test_homepage(self): server_url = self.conf_get('main', 'url') nb_time = self.conf_getInt('test_homepage', 'nb_time') home_page = "%s/" % server_url for i in range(nb_time): self.logd('Try %i' % i) self.get(home_page, description='Get gome page') if __name__ in ('main', '__main__'): import unittest unittest.main()
Вот подробное объяснение приведенного выше кода —
Тестовый пример должен наследоваться от класса FunkLoadTestCase, чтобы FunkLoad мог выполнять свою внутреннюю работу по отслеживанию того, что происходит во время теста.
Имя класса важно, так как FunkLoad будет искать файл на основе имени класса.
Разработанные тестовые наборы имеют прямой доступ к файлам конфигурации. Методы Get () и post () просто вызываются против сервера, чтобы получить ответ.