Тестирование калькулятора
Тестирование калькулятора — это один из самых простых и распространенных видов тестирования. Оно заключается в проверке правильности работы калькулятора при выполнении различных математических операций.
Основные шаги тестирования калькулятора:
Проверка базовых функций калькулятора, таких как сложение, вычитание, умножение и деление.
Проверка работы операций с десятичными и отрицательными числами.
Проверка работы операций с большими числами, такими как миллионы или миллиарды.
Проверка работы операций с дробными числами.
Проверка корректности обработки ошибок, таких как деление на ноль или ввод некорректных данных.
Проверка работы дополнительных функций калькулятора, таких как вычисление квадратного корня, процентов, факториала и т.д.
Пример тест-кейса для проверки базовых функций калькулятора:
Ввести первое число «5».
Нажать на кнопку «сложение».
Ввести второе число «7».
Нажать на кнопку «равно».
Проверить результат — должно быть «12».
Нажать на кнопку «очистить» и повторить тест с другими операциями.
Пример тест-кейса для проверки работы с десятичными числами:
Ввести первое число «3.14».
Нажать на кнопку «умножение».
Ввести второе число «2.5».
Нажать на кнопку «равно».
Проверить результат — должно быть «7.85».
Нажать на кнопку «очистить» и повторить тест с другими операциями.
Тестирование калькулятора является важной частью тестирования функциональности ПО. Тщательное тестирование калькулятора позволяет убедиться в его корректной работе и повысить качество продукта.
Тестируем и исправляем калькулятор на JavaScript
Эта статья — продолжение истории про калькулятор на JavaScript. В предыдущих частях мы:
- написали простой калькулятор на JavaScript;
- отдали его UX-тестировщикам и обновили дизайн калькулятора по их замечаниям.
Теперь наш калькулятор будут смотреть инженеры по тестированию — постараются найти в нём ошибки логики, поведения, вычислений и прочие неявные моменты.
В этой статье не будет автотестов, юнит-тестов, API-тестов и интеграционных тестов. Это всё нужные инструменты, но задача тестировщика, в частности, — выбрать правильный инструмент тестирования.
Если у него в работе очень простая программа (как наш калькулятор), то нет смысла городить автоматизацию и делать тесты ради тестов. Иногда можно и вручную всё проверить и получить точно такой же результат.
Базовое тестирование
Первое, что мы делаем, — проверяем, а как вообще ведут себя кнопки математических действий и делают ли они то, что нужно. Возьмём два числа — 12 и 5 — и сравним результаты всех действий с тем, что даёт калькулятор:
Отрицательные числа тоже отображаются и считаются правильно.
Тестируем большие числа
У компьютеров есть нюанс: любые переменные имеют ограничения по размеру числа. Например, если на переменную выделено 16 бит, то максимальное число, которое можно в нее положить, — 65 536. Число на единицу больше уже потребует 17 бит, а мы столько не выделяли.
Мы хоть и разработчики этого калькулятора, но мы не помним, какое число имели в виду, когда заводили переменную. Может быть, это решение за нас принял JavaScript. Поэтому нужно проверить, не сломается ли наш калькулятор от больших чисел.
Пробуем: 123 456 789 × 2 = 246 913 578 — верно
А вот необычный эксперимент:
12 345 678 901 234 567 × 1 = 12 345 678 901 234 568
Ух ты! Мы умножили большое число на единицу, а в ответе появилась ошибка. Это значит, что настолько длинные числа за раз наш калькулятор уже обработать не в состоянии.
❌ Неправильно обрабатываются 17-значные числа и те, которые больше них.
А если мы попробуем получить 17-значное число в ответе, интересно, оно тоже будет с ошибкой?
Да, в ответе тоже неверное число — 8 × 4 = 32, поэтому в конце должно стоять 2, а не 0. Пишем баг:
❌ Если в ответе получается 17-значное число или более — ответ точно неверный.
При этом деление на 16-значное число работает верно:
Тестирование математических трюков
Теперь попробуем разделить на ноль:
Скрипт хитро выкрутился и записал результатом деления бесконечность. Но лучше выводить сообщение, что на ноль делить нельзя.
❌ Нет сообщения при делении на ноль.
Отказоустойчивость
А что если оставить поле ввода пустым и попробовать что-то посчитать? Давайте посмотрим:
Скрипт преобразовал пустую строку в ноль и получил ответ, но это неправильно — при отсутствии одного из чисел калькулятор должен сообщить об этом, а не продолжать считать.
❌ Нет сообщения, если одно из чисел не введено.
Пойдём дальше и введём слово вместо числа:
Скрипт честно пытается перевести строку в число, у него это не получается, поэтому он выдаёт неопределённое значение.
❌ Нет проверки на то, ввели число или строку.
И напоследок проверим что будет, если мы что-то введём, но не выберем ни одно действие:
Тоже плохо. Надо будет обработать такую ситуацию.
❌ Нет проверки, когда не выбрали ничего из математических действий.
Так проверяем работу калькулятора со всеми действиями, а не только с умножением. В итоге у нас получится список ошибок, которые нужно исправить.
Что делаем
После тестирования у нас получился такой список ошибок:
❌ Неправильно обрабатываются 17-значные числа и те, которые больше них.
❌ Если в ответе получается 17-значное число или более — ответ точно неверный.
❌ Нет сообщения при делении на ноль.
❌ Нет сообщения, если одно из чисел не введено.
❌ Нет проверки на то, ввели число или строку.
❌ Нет проверки, когда не выбрали ничего из математических действий.
Исправим эти ошибки. Так как все вычисления начинаются при вызове функции func(), то и править всё будем тоже внутри неё.
Проверяем, что ввели число, а не слова или другие символы
Для перевода строку в число в JavaScript используют функцию Number() . Если строку можно перевести в число — она сработает без ошибок, а если не получится — вернёт значение NaN. Это значит, что числа не получилось.Чтобы проверить, прошло всё нормально или нет, мы будем использовать функцию isNaN() — она сравнит значение переменной с NaN, и вернёт true, если в переменной лежит NaN. А чтобы не путать числа и строки для сравнения, переименуем переменные в самом начале скрипта и сделаем их принудительно строками:
// получаем первое и второе число var num1_str = String(document.getElementById("num1").value); var num2_str = String(document.getElementById("num2").value); // переводим строки в числа let num1 = Number(num1_str) let num2 = Number(num2_str) // проверяем, получилось ли число из первой строки или нет if (isNaN(num1)) < // если не получилось — пишем сообщение document.getElementById("result").innerHTML = 'Калькулятор не может распознать первое число. Проверьте его, пожалуйста'; // и выходим из функции return; >// проверяем, получилось ли число из второй строки или нет if (isNaN(num2)) < // если не получилось — пишем сообщение document.getElementById("result").innerHTML = 'Калькулятор не может распознать второе число. Проверьте его, пожалуйста'; // и выходим из функции return; >
Проверяем, что нет пустых значений
JavaScript когда переводит строку в число, то пустую строку он считает как 0. Нам такой вариант не подходит, поэтому сравним её с пустой сторокой. Если она пустая — выдаём сообщение и ничего не считаем.
Ещё надо дополнительно добавить проверку на пробелы — JavaScript строку из пробелов тоже переводит как ноль, а нам это не нужно:
// получаем первое и второе число var num1_str = String(document.getElementById("num1").value); var num2_str = String(document.getElementById("num2").value); // проверяем, не пустая ли первая строка if ((num1_str.length == 0) || (num1_str.indexOf(' ') != -1)) < // если пустая — пишем сообщение document.getElementById("result").innerHTML = 'Вы не ввели первое число или добавили пробел в поле ввода'; // и выходим из функции return; >// проверяем, не пустая ли вторая строка if ((num2_str.length == 0) || (num2_str.indexOf(' ') != -1)) < // если пустая — пишем сообщение document.getElementById("result").innerHTML = 'Вы не ввели второе число или добавили пробел в поле ввода'; // и выходим из функции return; >
Обрабатываем деление на ноль
Простая проверка — добавляем сравнение второго числа с нулём:
// проверяем второе число при делении if ((num2 == 0) && (op == '/')) < // если не получилось — пишем сообщение document.getElementById("result").innerHTML = 'На ноль делить нельзя'; // и выходим из функции return; >
Обрабатываем длинные числа
Даже если мы ограничим каждое поле ввода числами по 16 знаков вместо 17, то при перемножении они дадут нам в ответе 32 знака — а это тоже превышает наш предел точности. Чтобы гарантированно получить в ответе число не больше 16 разрядов перед запятой, нам нужно, чтобы оба числа были не больше 99 999 999 — в нём 8 разрядов, а при перемножении мы получим максимум 16, как раз то, что нужно.
Чтобы это сделать, добавим проверку на размер числа:
// проверяем размер чисел if ((num1 > 99999999) || (num2 > 99999999)) < // если не помещается одно из них в диапазон — пишем сообщение document.getElementById("result").innerHTML = 'Калькулятор может работать с числами не больше 99 999 999'; // и выходим из функции return; >
Если не выбрано математическое действие
С этим всё просто — добавляем в case действие по умолчанию, которое выполнится, если никакие из вариантов не подойдут:
// смотрим, что было в переменной с действием, и действуем исходя из этого switch (op) < case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; default: result = 'Выберите действие' >
В итоге
✅ Калькулятор не работает с числами больше 16 знаков до запятой и предупреждает об этом пользователя
✅ В ответе всегда число, в котором не больше 16 знаков до запятой
✅ Есть проверка деления на ноль
✅ Есть сообщение, если одно из чисел не введено.
✅ Есть проверка на то, ввели число или строку.
✅ Есть проверка, когда не выбрали ничего из математических действий.
Это всё?
О нет, этот калькулятор можно гонять ещё и в хвост и в гриву:
- Протестировать десятичные дроби и операции с ними.
- Вставлять в поля ввода изображения и файлы.
- Устраивать переполнение буфера браузера.
- Совершать 10 миллионов вычислений в секунду.
- Запускать одновременно 10 миллионов калькуляторов.
- Запустить калькулятор в 1911 году.
- Засунуть в него комплексные числа.
- Засунуть в него самое большое простое число (и разделить).
- Засунуть в него кота.
Это (и многое другое) — и есть работа тестировщика. Круто, да?
Приходите учиться на тестировщиков
в «Практикум» →
И ни одна кошка не пострадает.
Готовый код
Размеры шрифтов /*задаём общие параметры для всей страницы: шрифт и отступы*/ body < text-align: center; margin: 10; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* настраиваем внешний вид полей ввода*/ input < display: inline-block; margin: 20px auto; border: 2px solid #eee; padding: 10px 20px; font-family: Verdana, Arial, sans-serif; font-size: 16px; >/* внешний вид кнопок */ button < font-family: Verdana, Arial, sans-serif; font-size: 16px; margin: 10px; padding: 10px; >/* стиль подсветки выбранной операции */ .light Калькулятор
+
Что дальше
Кажется, что теперь в самом коде есть что улучшить. В следующей серии займёмся рефакторингом. Не переключайтесь.
Тестирование калькулятора
Вот как обычно проверяют корректность работы калькулятора при покупке (хотя, если честно, сам лично ни разу не видел, чтобы кто-то его проверял именно на корректность вычисления):
1111*1111 = 1234321
11111*11111 = 123454321
12345679*9 = 111111111
12345679*18 = 222222222
12345679*27 = 333333333
12345679*36 = 444444444
12345679*45 = 555555555
12345679*54 = 666666666
12345679*63 = 777777777
12345679*72 = 888888888
12345679*81 = 999999999
12345678-12345679 = -1
Также можно привести массу других примеров.
А вот как можно протестировать калькулятор с точки зрения тестировщика (для каждой из операций калькулятора произвести свою группу тестов):
1) Тестирование функциональности:
3+5 = 8, 0+0 = 0, 0! =1, …
2) Тестирование производительности:
Что делать, если рекрутер просит протестировать калькулятор
Допустим, Вы завершили обучение на онлайн-курсах тестировщиков. Приходите на свое первое собеседование на вакансию Junior QA, а интервьюер просит Вас протестировать калькулятор. Что делать?
Тестировщик » QA-блог » Навыки » Что делать, если рекрутер просит протестировать калькулятор
6 месяцев назад 0 1172
Тестируем калькулятор на собеседовании
Прежде всего, не пугайтесь. Задание только на первый взгляд кажется экзотическим. На самом деле оно простое. Действительно, никто не ждет, что Вы покажете, как профессионально должен сработать инженер по качеству на фабрике по изготовлению калькуляторов.
Цель испытания гораздо проще. Интервьюер хочет посмотреть, обладаете ли Вы мышлением тестировщика и готовы ли подходить к выполнению задач системно, а не хаотично. Давайте разберемся, как QA-специалист может протестировать калькулятор на собеседовании при приеме на работу.
Как обычно формулируют вопрос про тестирование калькулятора
Есть простейший калькулятор, у которого есть кнопки цифр от 1 до 9, а также «плюс», «равно» и «очистить экран».
Этот калькулятор по условиям задачи умеет суммировать две цифры (однозначные числа) и выводить результат на экран. В описании это может быть калькулятор и как физический объект, и как ПО (например, на каком-либо сайте). Его нужно протестировать.
Самый главный вопрос – а какие требования?
Прежде всего, QA-специалист должен тестировать согласно требованиям к данному продукту. Поэтому первые вопросы, которые следует задать с самого начала выполнения задания – «А какие есть требования к данному калькулятору?», «Я хотел бы ознакомиться с ТЗ», «Где можно почитать требования к данному продукту?» и т.п.
Эти вопросы покажут интервьюеру, что Вы понимаете, что из себя представляет тестирование. И что бережно относитесь к рабочему времени – не растрачиваете его на случайное нажимание кнопок, а сначала знакомитесь с описанием функционала.
Второй вопрос – тестовая документация
Скорее всего, на первый вопрос Вам ответят, что ТЗ нет. Или – «Руководствуйтесь тем, что есть в описании задания». В этом случае можно задать вопросы про наличие другой тестовой документац:
«Есть ли ранее изготовленные тест-кейсы? Чек-листы? Есть ли хоть какая-нибудь тестовая документация по данному продукту?»
Эти вопросы продемонстрируют интервьюеру, что Вы разбираетесь в тестовой документации. А также – что готовы изучить ранее сформированные документы, а не изобретать велосипед. Это тоже важное умение QA-специалиста – делать тестирование эффективно.
Нет требований – попробуйте User Story
Скорее всего, на второй вопрос Вам ответят тоже отрицательно. В этом случае попробуйте задействовать инструмент User Story. Предложите интервьюеру помочь Вам создать требования с помощью пользовательских историй – сформулировать, что он хотел бы от калькулятора.
Это покажет, что Вы:
- Готовы работать с пользователем для прояснения требований;
- Умеете создавать User Story;
- Понимаете гибкие модели разработки.
Применяйте классы эквивалентности
Скорее всего, и на предыдущий вопрос Вы не получите согласия. Тогда можете сказать, что будете тестировать из своих соображений и здравого смысла, применяя технику классов эквивалентности.
В нашем калькуляторе один класс, но есть два граничных значения – 1 и 9. Значит, нам потребуется 3 проверки:
- По классу эквивалентности: любые 2 числа, например: 2+5=7
- По первому граничному значению: 1+ любое другое число, например, 1+6=7
- По второму граничному значению: любая цифра + 9, например, 3+9=12
Это покажет интервьюеру, что Вы понимаете данный метод.
Расскажите про другие проверки
Можете дополнить свой ответ интервьюеру и сказать, что калькулятор можно протестировать еще следующими проверками:
- Можно ли сложить не 2, а 3 числа;
- Что будет, если ввести сразу 2 числа (без знака «+»);
- Будет ли нехватка ресурса, если сложить 9 и 9;
- Что будет, если сначала нажать «+», а потом цифры?
- Что будет, если нажать «С» в разных местах вычисления?
- Что будет, если наживать «+», «=» и «С» в разных комбинациях?
- Может ли калькулятор совершать 1 миллион операций в секунду;
- Если это ПО – можно ли запустить одновременно 1 миллион копий этой программы;
- Если это физический калькулятор – выдержит ли он падение на пол со стола.
Используйте свою фантазию. Только не забывайте пояснять интервьюеру, какое именно требование Вы хотите протестировать.
Резюме
На месте калькулятора может оказаться любой другой предмет. Интервьюеры могут предложить протестировать пульт от экрана, кофе-машину, карандаши. Но принцип должен быть тот же самый: сначала требования – потом тестирование.
Автор Михаил Кулешов
Михаил, профессиональный партнерский маркетолог, является основателем компании South Media OÜ, которая была создана в 2018 году и базируется в Таллинне. С 2016 года Михаил уехал из Финляндии и жил как настоящий «цифровой кочевник» в IT-индустрии, путешествуя по миру только с ноутбуком. Михаил работает и пишет статьи, связанные с IT-индустрией.