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

Ответ

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

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

  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

Ответ 18+ 🔞

А, ну ты глянь, какая тема! Тестирование калькулятора, говоришь? Да это ж святое дело, блядь! Казалось бы, ну что там, кнопочки тыкаешь, циферки складываешь... Ан нет, сука! Тут столько подводных камней, что овердохуища! Сейчас разложу по полочкам, как нормальный человек, а не как этот ваш заумный учебник.

Ну и на что нам, собственно, срать глазами нужно?

  1. Арифметика, мать её ети!

    • База: Сложение, вычитание, умножение, деление. Два плюс два — четыре, а не «пиздец». Проверяем.
    • Циферки всякие: Целые, отрицательные, с запятой (ну, с точкой), овербольшие, чтоб на весь экран не влезали.
    • Цепочка: Вот ввёл 2 + 3 * 4. Умный калькулятор должен дать 14, потому что умножение первее, а не 20, как у дебила. Это приоритет операций, ёпта!
  2. Фишки разные, кнопочки волшебные.

    • Стереть всё к хуям: Кнопки C и CE. Одна стирает всё в пизду, другая — только последнее введённое. Путать их низя!
    • Проценты, плюс-минус: Нажал +/- — число знак поменяло. Нажал % — не сломалось и посчитало что-то вменяемое.
    • Память: M+, M-, MR, MC. Записал, прибавил, вычел, прочитал, обнулил. Чтобы не было такого: сохранил, а потом хуй найдёшь.
    • Равно: Нажал раз — результат. Нажал второй раз — должно что-то адекватное произойти, а не «ядерная вошь» на экране.
  3. А вот тут начинается самое интересное — ломаем эту суку!

    • Деление на ноль. Это классика, блядь! Нажал 5 / 0 = — должен написать «Error», «Нельзя» или просто сдохнуть красиво, но НЕ показать «Infinity» как ни в чём не бывало, пидарас шерстяной!
    • Переполнение: Ввёл число длиннее, чем дисплей. Оно должно как-то обрезаться, округляться или хотя бы не вылетать с ошибкой сегментации, в рот меня чих-пых!
    • Ввод хуйни: Несколько точек подряд (5..2), буквы вместо цифр (если это не научный, конечно). Калькулятор должен это игнорировать или чистить, а не пытаться сложить 'A' и 'Б'.
  4. Интерфейс, внешность.

    • Цифры на экране отображаются чётко, не пляшут.
    • Кнопка при нажатии визуально меняется (темнеет, например), чтобы понятно было — тыкнул.
    • На телефоне всё должно быть по пальцу, а не как для муравья.

А теперь, блядь, смотри, как это автоматизировать можно. Вот тебе кусочек кода на 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

Вот и весь сказ. Кажется ерунда, а попробуй сделай так, чтобы всё это работало как часы, да ещё и на всех устройствах. Терпения, блядь, на это нужно — ноль ебать! Но зато когда всё пашет — красота, ёперный театр.