Autotesting Flashcards

1
Q

По степени изолированности тестируемых частей кода функциональные тесты принято делить на три типа:

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Хорошие тесты

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

пограничные случаи — ситуации, в которых код может вести себя по-особенному:

A
  • Работа с пустой строкой
  • Обработка None
  • Деление на ноль (в большинстве языков вызывает ошибку)
  • Специфические ситуации для конкретных алгоритмов
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

цикломатической сложностью

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

нужно ли внутри capitalize() обрабатывать число вместо строки?

A

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

Ответственность за передачу правильных данных в функцию capitalize() лежит не на самой функции, а на коде, который вызывает эту функцию.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Сколько нужно тестов?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Можно ли сказать, что протестированный код точно не содержит ошибок?

A

Нет, тесты проверяют код только с определенными параметрами, другие входные параметры могут привести к ошибкам

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Выберите идеальный способ работы с тестами при возникновении багов в коде

A

Пишем тест, в котором баг воспроизводится, потом правим код и проводим тест еще раз

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что важно для тестов в большинстве ситуаций?

A

Выполняет ли код свою задачу

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как правильно проверить функцию is_none()?

A

assert is_none(None)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Какое утверждение подойдет, если нужно проверить, что 3 — это простое число?

A

assert is_prime(3)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какое утверждение лучше подходит для ситуации, когда надо проверить длину строки?

A

assert len(‘str’) == 3

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Печать при запуске Pytest

A

Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:

poetry run pytest -s

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Структура теста

A
def test_reverse():
    assert reverse('Hexlet') == 'telxeH'
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

В какой директории должны лежать тесты Pytest?

A

tests

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Как правильно запускать Pytest на выполнение?

A

poetry run pytest
pytest

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Какой флаг отключает подавление вывода на экран при вызове pytest?

A

-s

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое модульное тестирование?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что проверяет первый тест?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

несколько проверок в рамках одного теста

A

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

21
Q

Какие сценарии для отдельного теста?

A

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

22
Q

Нужно ли пытаться найти все варианты?

A

Не нужно. Каждая написанная строчка кода в проекте — потенциальное место для изменения в случае правок. Если есть сомнения, нужно ли писать проверку или нет, то лучше не пишите. Так вы найдете тот минимум, который стоит писать. Редкие ситуации требуют покрытия тестами только тогда, когда они критичны для работоспособности.

23
Q

Как вызвать исключение IndexError в PyTest?

A

Проверить что вызывается конкретное исключение можно с помощью конструкции
~~~
with pytest.raises(IndexError):
stack.pop()
~~~

24
Q

Действия при возникновении ошибки, для которой не было теста

A

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

25
Q

Сколько утверждений можно использовать в одном тесте?

A
26
Q

Сколько утверждений можно использовать в одном тесте?

A

Столько, сколько нужно для проверки

27
Q

Что будет если хотя бы одна из тестовых функций поменяет эту коллекцию?
(фикстуры)

A

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

28
Q

синтаксис фикстуры

A

Имя параметра совпадает с именем фикстуры

@pytest.fixture
def coll(): # имя фикстуры выбирается произвольно
    return ['One', True, 3, False]

Pytest сам прокидывает результат вызова функции там, где функция указана в аргументе
def test_compact(coll):
    result = compact(coll)
    assert result == # Тут ожидаемое значение

# Не важно, что предыдущий тест сделал с коллекцией
# Здесь коллекция будет новая, так как pytest вызывает coll() заново

29
Q

Описание фикстуры

A

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

30
Q

Почему нужно использовать фикстуры при работе со временем?

A
now = datetime.now()
def test_foo():
    print(now)

def test_bar():
    print(now)

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

31
Q

Пример фикстур для работы со временем

A
@pytest.fixture
def current_time():
    return datetime.now()

def test_foo(current_time):
    print(current_time)

def test_bar(current_time):
    print(current_time)
32
Q

Как использовать фикстуру в тестовой функции?

A

Передать через параметр, имя которого совпадает с именем фикстуры

33
Q

Как создать фикстуру?

A

С помощью декоратора @pytest.fixture

34
Q

Как должны выполняться тесты?

A

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

35
Q

Где можно размещать утверждения?

A

Внутри самого теста

36
Q

В каких случаях стоит разбить один тест на два разных?

A

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

37
Q

В чем состоит особенность doctest?

A

Это идея, когда документация выполняет роль тестов

38
Q

Можно ли писать тесты без тестовых фреймворков?

A

Да, в Python есть встроенная возможность тестировать через документацию

39
Q

Почему важно измерять покрытие кода тестами?

A

Оно позволяет найти места, которые не покрыты тестами

40
Q

Как проверка покрытия кода влияет на скорость выполнения тестов?

A

Скорость падает

41
Q

Как изменится покрытие кода, если во время прогона тесты упали с ошибкой?

A

Покрытие уменьшится

42
Q

Зачем писать тесты до кода?

A

Чтобы ускорить работу, ведь написанный тест помогает при последующих изменениях
Чтобы посмотреть на код с точки зрения удобства пользователей

43
Q

Что нужно знать, чтобы написать тесты на функцию до реализации этой функции?

A

Какая сигнатура будет у этой функции

44
Q

Какой код сложнее тестировать?

A

Недетерминированный код
Код с побочными эффектами

45
Q

Как называется механизм, реализующий непрерывную интеграцию на GitHub?

A

GitHub Actions

46
Q

Стоит ли использовать непрерывную интеграцию?

A

Да, ведь локального запуска тестов или линтера недостаточно

47
Q

Какие операции выполняются при непрерывной интеграции?

A

Запуск линтера, тестов, утилит безопасности и проверки зависимостей

48
Q
A