Главная | Все статьи | Дневник студента

Хекслет, я ищу первую работу #2

Время чтения статьи ~3 минуты
Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Хекслет, я ищу первую работу #2 главное изображение

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

На почту пришло письмо с заданием, которое я, признаюсь, не особо понимал как выполнять. В текстовом файле было описание программы «cubes», запускающейся из командной строки, и принимающей на вход 3 параметра: количество бросков, минимальное и максимальное количество кубиков, кидаемых за раз. Далее программа имитирует броски кубика нужное количество раз, каждый раз кидая рандомное количество кубиков и высчитывая определенным образом количество очков. Написать такую программу можно в 10 - 15 строчек кода, что я изначально и собирался сделать. Но тестировать... Это обошлось бы в куда большее количество строк.

Прежде чем приступать к выполнению, я спросил, в каком виде нужно было присылать решение. Оказалось, что достаточно просто описать словами тесты: как, на что и зачем тестировать. Тут я конечно обрадовался. До появления в моей практике проектов Хекслета, я даже не особо представлял, как нормально использовать import и export в js, потому что Nodejs постоянно ругался (благо, сейчас я знаю в чем была проблема). Хотя, чтобы повысить свои шансы, все же стоило попытаться лучше.

Вот решение, которое я выслал:

Тест 1: проверка на броски. Программа должна бросать кубики ровно столько, сколько задано. Поскольку результат работы программы выводится только на консоль, нужно чтобы стандартный поток ввода программы с тестами совпадал со стандартным потоком вывода программы. В данном случае количество строк вывода программы должно совпадать с первым переданным аргументом. То есть $ ./cubik 65 1 4 должно вывести ровно 65 строк.

Тест 2: проверка на количество кубиков. Количество кубиков, бросаемых каждый раз, должно находиться в пределах от 2 до 3 аргумента, переданного программе. При этом количество брошенных кубиков в одном броске не должно превышать 5. Если количество кубиков больше 5, то программа должна выкинуть исключение.

Обычно для тестирования рандомных функций используют так называемое «семя». Тогда результат работы программы заранее будет известен. В нашем случае мы не знаем, как устроен рандом в программе, так что будем проверять вывод работы программы. Поскольку программа недетерминирована, т.е. нельзя гарантировать один и тот же результат при одних и тех же данных, этот тест можно и нужно запускать внутри каждого следующего. Но сначала можно запустить проверку по циклу, например $ ./cubik n i j, где n – количество бросков; i – минимальное количество кубиков, j – максимальное количество кубиков; i,j [1, 5].

Тест 3: проверка на корректность броска кубика. Опять же мы не знаем, как устроен рандом в броске кубика. Результаты броска каждого кубика должны быть (по-хорошему) равновероятны и должны лежать в пределах от 1 до 6. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки и проверить их, чтобы значение каждой подстроки (по сути, результат броска кубика) было в пределах от 1 до 6. Если вдруг при броске может выпасть значение выше 6 (например, 7) и при этом каждый результат броска равновероятен, то при вызове программы со значениями $ ./cubik 10 5 5 вероятность, что мы не обнаружим баг меньше половины процента. Однако если результаты броска неравновероятны, мы не сможем гарантировать корректность работы программы. Поэтому лучше проводить проверку при большем количестве итераций.

Тест 4: проверка на корректность подсчета баллов. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки, создать объект (словарь), в котором будет вестись подсчет выпавших результатов по типу {‘’1’’ : 0, ''2'' : 3, ‘’5’’ : 2}. Эта конструкция поможет эффективно подсчитывать количество баллов как при обычном раскладе, так и при выпадении специальной комбинации. Если словарь = {‘’1’’ : 1, ‘’2’’ : 1, ‘’3’’ : 1, ‘’4’’ : 1, ‘’5’’ : 1}, то результат должен быть 150. Иначе результат сравнивается со значением (словарь[''1''] * 10 + словарь[‘’5’’] * 5).

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

Аватар пользователя Uru Uru
Uru Uru 09 февраля 2021
3
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 2 мая
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 2 мая
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время