Все статьи | Блог студента

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

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Хекслет, я ищу первую работу #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
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев