0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><a>В предыдущей серии</a>я рассказывал, как решился на поиск работы, и получил первое приглашение на собеседование. В этой статье расскажу о тестовом задании на позицию тестировщика, которое мне пришлось выполнить.</p>
1
<p><a>В предыдущей серии</a>я рассказывал, как решился на поиск работы, и получил первое приглашение на собеседование. В этой статье расскажу о тестовом задании на позицию тестировщика, которое мне пришлось выполнить.</p>
2
<p>На почту пришло письмо с заданием, которое я, признаюсь, не особо понимал как выполнять. В текстовом файле было описание программы "cubes", запускающейся из командной строки, и принимающей на вход 3 параметра: количество бросков, минимальное и максимальное количество кубиков, кидаемых за раз. Далее программа имитирует броски кубика нужное количество раз, каждый раз кидая рандомное количество кубиков и высчитывая определенным образом количество очков. Написать такую программу можно в 10 - 15 строчек кода, что я изначально и собирался сделать. Но тестировать... Это обошлось бы в куда большее количество строк.</p>
2
<p>На почту пришло письмо с заданием, которое я, признаюсь, не особо понимал как выполнять. В текстовом файле было описание программы "cubes", запускающейся из командной строки, и принимающей на вход 3 параметра: количество бросков, минимальное и максимальное количество кубиков, кидаемых за раз. Далее программа имитирует броски кубика нужное количество раз, каждый раз кидая рандомное количество кубиков и высчитывая определенным образом количество очков. Написать такую программу можно в 10 - 15 строчек кода, что я изначально и собирался сделать. Но тестировать... Это обошлось бы в куда большее количество строк.</p>
3
<p>Прежде чем приступать к выполнению, я спросил, в каком виде нужно было присылать решение. Оказалось, что достаточно просто описать словами тесты: как, на что и зачем тестировать. Тут я конечно обрадовался. До появления в моей практике проектов Хекслета, я даже не особо представлял, как нормально использовать import и export в js, потому что Nodejs постоянно ругался (благо, сейчас я знаю в чем была проблема). Хотя, чтобы повысить свои шансы, все же стоило попытаться лучше.</p>
3
<p>Прежде чем приступать к выполнению, я спросил, в каком виде нужно было присылать решение. Оказалось, что достаточно просто описать словами тесты: как, на что и зачем тестировать. Тут я конечно обрадовался. До появления в моей практике проектов Хекслета, я даже не особо представлял, как нормально использовать import и export в js, потому что Nodejs постоянно ругался (благо, сейчас я знаю в чем была проблема). Хотя, чтобы повысить свои шансы, все же стоило попытаться лучше.</p>
4
<p>Вот решение, которое я выслал:</p>
4
<p>Вот решение, которое я выслал:</p>
5
<p><strong>Тест 1</strong>: проверка на броски. Программа должна бросать кубики ровно столько, сколько задано. Поскольку результат работы программы выводится только на консоль, нужно чтобы стандартный поток ввода программы с тестами совпадал со стандартным потоком вывода программы. В данном случае количество строк вывода программы должно совпадать с первым переданным аргументом. То есть $ ./cubik 65 1 4 должно вывести ровно 65 строк.</p>
5
<p><strong>Тест 1</strong>: проверка на броски. Программа должна бросать кубики ровно столько, сколько задано. Поскольку результат работы программы выводится только на консоль, нужно чтобы стандартный поток ввода программы с тестами совпадал со стандартным потоком вывода программы. В данном случае количество строк вывода программы должно совпадать с первым переданным аргументом. То есть $ ./cubik 65 1 4 должно вывести ровно 65 строк.</p>
6
<p><strong>Тест 2</strong>: проверка на количество кубиков. Количество кубиков, бросаемых каждый раз, должно находиться в пределах от 2 до 3 аргумента, переданного программе. При этом количество брошенных кубиков в одном броске не должно превышать 5. Если количество кубиков больше 5, то программа должна выкинуть исключение.</p>
6
<p><strong>Тест 2</strong>: проверка на количество кубиков. Количество кубиков, бросаемых каждый раз, должно находиться в пределах от 2 до 3 аргумента, переданного программе. При этом количество брошенных кубиков в одном броске не должно превышать 5. Если количество кубиков больше 5, то программа должна выкинуть исключение.</p>
7
<p>Обычно для тестирования рандомных функций используют так называемое "семя". Тогда результат работы программы заранее будет известен. В нашем случае мы не знаем, как устроен рандом в программе, так что будем проверять вывод работы программы. Поскольку программа недетерминирована, т.е. нельзя гарантировать один и тот же результат при одних и тех же данных, этот тест можно и нужно запускать внутри каждого следующего. Но сначала можно запустить проверку по циклу, например $ ./cubik n i j, где n - количество бросков; i - минимальное количество кубиков, j - максимальное количество кубиков; i,j [1, 5].</p>
7
<p>Обычно для тестирования рандомных функций используют так называемое "семя". Тогда результат работы программы заранее будет известен. В нашем случае мы не знаем, как устроен рандом в программе, так что будем проверять вывод работы программы. Поскольку программа недетерминирована, т.е. нельзя гарантировать один и тот же результат при одних и тех же данных, этот тест можно и нужно запускать внутри каждого следующего. Но сначала можно запустить проверку по циклу, например $ ./cubik n i j, где n - количество бросков; i - минимальное количество кубиков, j - максимальное количество кубиков; i,j [1, 5].</p>
8
<p><strong>Тест 3</strong>: проверка на корректность броска кубика. Опять же мы не знаем, как устроен рандом в броске кубика. Результаты броска каждого кубика должны быть (по-хорошему) равновероятны и должны лежать в пределах от 1 до 6. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки и проверить их, чтобы значение каждой подстроки (по сути, результат броска кубика) было в пределах от 1 до 6. Если вдруг при броске может выпасть значение выше 6 (например, 7) и при этом каждый результат броска равновероятен, то при вызове программы со значениями $ ./cubik 10 5 5 вероятность, что мы не обнаружим баг меньше половины процента. Однако если результаты броска неравновероятны, мы не сможем гарантировать корректность работы программы. Поэтому лучше проводить проверку при большем количестве итераций.</p>
8
<p><strong>Тест 3</strong>: проверка на корректность броска кубика. Опять же мы не знаем, как устроен рандом в броске кубика. Результаты броска каждого кубика должны быть (по-хорошему) равновероятны и должны лежать в пределах от 1 до 6. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки и проверить их, чтобы значение каждой подстроки (по сути, результат броска кубика) было в пределах от 1 до 6. Если вдруг при броске может выпасть значение выше 6 (например, 7) и при этом каждый результат броска равновероятен, то при вызове программы со значениями $ ./cubik 10 5 5 вероятность, что мы не обнаружим баг меньше половины процента. Однако если результаты броска неравновероятны, мы не сможем гарантировать корректность работы программы. Поэтому лучше проводить проверку при большем количестве итераций.</p>
9
<p><strong>Тест 4:</strong>проверка на корректность подсчета баллов. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки, создать объект (словарь), в котором будет вестись подсчет выпавших результатов по типу {‘’1’’ : 0, ''2'' : 3, ‘’5’’ : 2}. Эта конструкция поможет эффективно подсчитывать количество баллов как при обычном раскладе, так и при выпадении специальной комбинации. Если словарь = {‘’1’’ : 1, ‘’2’’ : 1, ‘’3’’ : 1, ‘’4’’ : 1, ‘’5’’ : 1}, то результат должен быть 150. Иначе результат сравнивается со значением (словарь[''1''] * 10 + словарь[‘’5’’] * 5).</p>
9
<p><strong>Тест 4:</strong>проверка на корректность подсчета баллов. Тест должен на вводе получить поочередно каждую строку вывода программы, разбить ее на подстроки, создать объект (словарь), в котором будет вестись подсчет выпавших результатов по типу {‘’1’’ : 0, ''2'' : 3, ‘’5’’ : 2}. Эта конструкция поможет эффективно подсчитывать количество баллов как при обычном раскладе, так и при выпадении специальной комбинации. Если словарь = {‘’1’’ : 1, ‘’2’’ : 1, ‘’3’’ : 1, ‘’4’’ : 1, ‘’5’’ : 1}, то результат должен быть 150. Иначе результат сравнивается со значением (словарь[''1''] * 10 + словарь[‘’5’’] * 5).</p>
10
<p><strong>Не знаю насколько правильно я решил, но я все же получил приглашение на собеседование. Расскажу о нем чуть позже.</strong></p>
10
<p><strong>Не знаю насколько правильно я решил, но я все же получил приглашение на собеседование. Расскажу о нем чуть позже.</strong></p>