Как протестировать приложение «Калькулятор»?

«Как протестировать приложение «Калькулятор»?» — вопрос из категории Практические задания, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные категории тестов:

  1. Функциональное тестирование арифметических операций:

    • Базовые операции: Сложение (+), вычитание (-), умножение (*), деление (/).
    • Типы чисел: Целые, отрицательные, десятичные дроби, очень большие числа.
    • Последовательность операций: Цепочка вычислений (например, 2 + 3 * 4). Проверка приоритета операций.
  2. Тестирование специальных функций и логики:

    • Очистка: Кнопки C (Clear) и CE (Clear Entry).
    • Процент (%), изменение знака (+/-).
    • Память: Кнопки M+, M-, MR, MC.
    • Равенство (=): Повторное нажатие после получения результата.
  3. Негативное тестирование и обработка ошибок:

    • Деление на ноль. Ожидается понятное сообщение об ошибке (например, "Error" или "Нельзя делить на ноль"), а не падение приложения.
    • Переполнение: Ввод и операции с числами, превышающими разрядность дисплея.
    • Некорректный ввод: Ввод нескольких десятичных точек, ввод букв или символов (если это не научный калькулятор).
  4. Тестирование пользовательского интерфейса (UI):

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

Пример набора автотестов на Python (pytest):

import pytest

def test_basic_operations():
    calc = Calculator()
    assert calc.calculate(5, '+', 3) == 8
    assert calc.calculate(10, '-', 4) == 6
    assert calc.calculate(7, '*', 6) == 42
    assert calc.calculate(15, '/', 3) == 5

def test_division_by_zero():
    calc = Calculator()
    # Ожидаем специальное значение или исключение, а не обычный результат
    with pytest.raises(ZeroDivisionError):
        calc.calculate(5, '/', 0)
    # Или проверка возврата строки с ошибкой
    # assert calc.calculate(5, '/', 0) == "Error"

def test_decimal_precision():
    calc = Calculator()
    # Используем approx для сравнения чисел с плавающей точкой
    result = calc.calculate(0.1, '+', 0.2)
    assert result == pytest.approx(0.3)

def test_sequence_of_operations():
    calc = Calculator()
    # Проверяем, что калькулятор учитывает приоритет умножения
    calc.input('2')
    calc.input('+')
    calc.input('3')
    calc.input('*')
    calc.input('4')
    assert calc.equals() == 14  # 2 + (3 * 4) = 14, а не 20