Привет! Я QA Automation Engineer в Scalable Solutions. Наша компания, как и многие другие, предлагает после устного собеседования сделать тестовое задание. Как человек, который два года назад делал похожее задание при трудоустройстве, решила разобрать основные ошибки тестировщиков при его выполнении, а также поделиться спецификой наших (и не только) ожиданий в ходе найма. 

Да кому нужны эти ваши тестовые

Цель проведения тестовых заданий понятна: с кандидатом пообщались на собеседовании, примерно поняли его бэкграунд и теоретические знания. Но так ли хорошо он владеет ими на практике? Можно, конечно, попросить его что-то продемонстрировать прямо на встрече, но зачастую волнение, усталость от предшествующего разговора или работа другие причины могут этому помешать. 

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

Однако раз уж задание выполняется в комфортных условиях, то свалить недочеты на излишнее волнение уже не получится. С точки зрения работодателя, требования к качеству выполненного такого задания будут выше.

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

Чего ожидает наниматель

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

Хорошо показать знание стандартных тестовых методологий и принципов: проверку граничных значений и классов эквивалентности, атомарность и независимость тестов и другие.

Кроме того, может быть полезно уточнить требования к коду у нанимателя: кому-то может быть важнее оптимизация, кому-то – читаемость. Хотя по моему скромному мнению, если мы говорим о тестовых на должность QA, читаемость предпочтительнее. Код будет смотреть незнакомый человек, которому лично объяснить свой подход не получится, не говоря уже о том, что в первую очередь будет оцениваться качество самих тестов. И этому человеку должно быть понятно, что и как в тесте проверяется. Впрочем, читаемость полезна и в повседневной жизни, ведь это позволяет в дальнейшем в любой момент легко вернуться к тесту и что-то при необходимости подправить.

Разбор ошибок на примере теста Scalable

В тестовом задании нашего QA отдела предлагается написать тесты для REST API серверного приложения. Спецификация к нему прилагается. API содержит POST, GET и DELETE запросы, манипулирующие с некой сущностью (в задании, конечно, сущность не абстрактная, а из нашей области работы, но ниже в примерах будет присутствовать как entity). Также есть запрос снапшота, который возвращает все неудаленные сущности в их текущем состоянии. 

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

Однако независимо от задания есть набор типичных ошибок, которые допускают кандидаты. Разберем их ниже. (Примеры взяты из тестовых заданий кандидатов. Названия некоторых переменных и методов изменены, все остальное сохранено.)

1. Один позитивный тест на метод

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

Из менее очевидного: часто пропускаемый тест с получением пустого результата в ответ на GET-запрос. Какое-то время назад нам подобные тесты как раз очень пригодились, пока проверяли, не потерялась ли совместимость между проектами.

2. Много проверок разного поведения в одном тесте

Есть вечное противостояние: «хочу, чтобы тесты были атомарными, и каждый проверял что-то одно» и «не хочу делать сложную и долгую подготовку окружения много раз, сделаю ее один раз и все нужные вещи сразу проверю». Ответа, что из этого лучше, у меня по-прежнему нет, но, например, для проверки REST API в нашем негромоздком тестовом задании сложная подготовка окружения не нужна. Так что можно смело разделить тест, который проверяет а) невалидное создание сущности, б) валидное создание сущности, в) последующий GET-запрос с полной проверкой тела ответа, на три отдельных теста.

Пример из тестового задания одного соискателя:

Тест отлично разделился бы на четыре теста поменьше, что привело бы к атомарности и лучшей читаемости. 

3. Ничего не проверяющие или проверяющие не то проверки

Извиняюсь за тавтологию, но такое тоже часто встречается. Кейс хороший придумали и выполнили, а проверили что-то совершенно не то. Так, например, в тесте на проверку GET-запроса, надо обязательно проверить код и полное тело ответа (иногда еще заголовки, но не в нашем случае). С большой вероятностью часть данных (а в идеале все) из ответа нам известны, и мы можем их все по букве и проверить.

Но, например, в одном из тестовых кандидат сделал следующее:

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

Также надо быть внимательным с негативными тестами: надо быть уверенным, что тест негативен по какой-то конкретной причине. Например, если мы хотим проверить GET или DELETE с несуществующим id, то этот id должен быть из разрешенного диапазона, иначе получается уже другая ошибка. Или если мы проверяем какое-то невалидное заполнение формы, то лучше ввести некорректное значение только для одного поля, а не для всех сразу.

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

4. Отсутствие проверки состояния хранилища

Часто при проверке запросов опускается последующая проверка состояния хранилища (БД, например):

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

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

5. Отсутствие проверки граничных значений

Пожалуй, самая первая из методологий тестирования, приходящих на ум, однако в тестовых заданиях часто отсутствует. Объяснять, что это, вряд ли необходимо, но внимательно прочитайте требования к вводимым данным и проверьте, нет ли граничных значений, которые вы забыли протестировать.

6. Рандомизация тестов

Все еще загадочное для меня, но все еще периодически появляющееся в выполненных заданиях явление. Кандидат создает случайный генератор входных данных и передает в тест. Вроде изначальная идея понятна: какие-то из рандомно сгенерированных входных данных могут внезапно отловить какую-то ошибку, да и вообще такое поведение как будто бы ближе к реальному. На другой чаше весов лежит абсолютная непредсказуемость теста. Мы запустили его десять раз, и нам повезло, а на одиннадцатый он вдруг упал. Сколько раз потребуется его перезапустить, чтобы снова это воспроизвести? Неужели и на CI надо запускать тест 11 раз? Или больше? Как точно определить, что мы в итоге проверяем в тесте? 

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

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

7. Стремление показать как можно больше своих навыков

С одной стороны, в этом ничего плохого нет. Если кандидат обладает большим количеством навыков и знает, как ими блеснуть в тестовом, это круто. Но это не должно быть основной задачей.

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

8. Совет со звездочкой 

Это не является ошибкой, скорее, что-то вроде правила хорошего тона. Хорошо читаемый код – это всегда приятно, к тому же сильно упрощает и ускоряет проверку. Поэтому здорово, когда в нем есть комментарии, переменные названы не одной буквой, у аргументов методов есть аннотации, а у assert-ов указано сообщение с ошибкой. А еще когда тест зовут не “test_code_400”, а, например, “test_get_entity_invalid_id”.

А что ещё

Тестовое задание – один из трех китов, на которых строится представление о кандидате (помимо резюме и устного собеседования). Поэтому выполнять его спустя рукава не стоит, даже если собеседование прошло блестяще. У нас в Scalable мы смотрим не на конкретное число допущенных или не допущенных ошибок в тестовом задании. Если 80% (условно) из перечисленного выше нет, то в целом неплохо. Куда важнее общее впечатление:

  • Насколько кандидат рационален и логичен – как он строит мысли, как строит кейсы; 

  • Как оформлен код, насколько он читаем, как структурирован; 

  • Умеет ли кандидат думать за рамками ТЗ. Как он уточняет (и делает ли это вообще) задание и конкретизирует требования. 

Разумеется, имеет значение и общее владение фундаментальными знаниями по тестированию. Но немаловажный фактор – наличие интереса к тому, чем предстоит заниматься.


Ещё по теме:

Тестирование финтех бэкенда: как мы дошли до 20 тыс. тест-кейсов

Телеграм-канал Scalable Insights, где мы делимся аналитикой и инсайтами в new fintech

Комментарии (18)


  1. nronnie
    19.07.2022 10:30
    +7

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

    В печку и вашу компанию "и многие другие" :)))


    1. leprosus
      19.07.2022 11:40
      +2

      Вы безработный? Последних лет так пять я не устраивался на позицию сеньёра или выше без тестового.


      1. Graf_Shokolakula
        19.07.2022 16:10

        Поздравляю, вы наверное в гугле,Фейсбук или эпл работали? Там да, конкуренция большая и требования жёсткие. Тестовые задания выполнять надо. Большая там зп?


        1. leprosus
          19.07.2022 16:30

          В последних 3ёх компаниях ЗП больше, чем по рынку. Я не работаю в упомянутых компаниях.
          Очевидно, что писать тестовое для получение работы за еду - это такое себе. Но мне кажется, что с нормальной квалификацией адекватный человек не будет пытаться устроиться в такую компанию.


      1. ReadOnlySadUser
        19.07.2022 16:55
        +2

        За последние 5 лет я не устраивался ни на одну работу, где надо было делать тестовое. Ну, я тупо игнорировал эти места. Мне просто надоело. Ибо какого хрена, я вот 10 лет работаю, да хуже того - я работаю прямо сейчас где-то, и меня никто не увольняет. И ни разу не увольняли. Более того, могу даже отправить к людям, которые дадут рекомендации. Это не доказывает, что я могу писать код? Что ж, нам не по пути.

        Да, в какие-то наукоёмкие проекты, требующие специфической квалификации или, быть может, особенного образования - действительно имеет смысл дать тестовое, чтобы понять, что человек чего-то понимает в вопросе. Но ведь не у всех R&D. И не все предлагают какие-то космические условия по деньгам. Так что если я ну прям очень хочу в проект, я соглашусь на тестовое, в остальных случаях - пусть идут лесом)


        1. leprosus
          19.07.2022 16:59

          Так здравый смысл. Я ниже ровно про тоже и написал. С опытом прохождения собеседований появляется интуиция и навык, которые позволяют оценивать: стоит ли тестовое задание свеч или нет. Кстати, 3 компании назад как раз в R&D и работал, и там тоже требовалось тестовое задание где-то на 2 часа.

          Коротко: если компания ищет мидл разработчика за еду с обязательным тестовым заданием, то очевидно, что туда не нужно собеседоваться. Или я в чём не прав-то?


          1. Nialpe
            19.07.2022 20:51

            Если и не правы, то только в категоричности суждений (если я вас правильно понял). Т.к. бывает по-разному. Моих два последних найма на сеньора, например, без тестовых и в один раунд, причем по времени это заняло 10 и 40 минут соответственно, с последующими офферами. Но я не распространяю этот частный опыт на все возможные наймы, лишь констатирую вариант развития событий.


            1. leprosus
              19.07.2022 21:01

              У меня категоричность? Вы самый первый комментарий в этой ветке читали?

              Я всего лишь пытаюсь альтернативное мнение представлять. Я бы вообще прошёл мимо комментариев, если бы не первый комментарий.

              Понятно, что бывает по-разному со стороны соискателя. Плюс, я написал опыт/взгляд со стороны нанимателя. Не стоит считать, что все люди одинаковые. За время, когда я участвовал в отборе, я насмотрелся на разных, поэтому могу взвешенно оценить практику с тестами.


              1. Nialpe
                19.07.2022 21:11

                Значит не так понял. Пардон.


  1. Graf_Shokolakula
    19.07.2022 15:59
    +1

    Почему человек с подтверждённым опытом работы, и выявленными пусть и теоретическими знаниями на собеседовании, должен делать работу бесплатно? Для чего существуют все эти испытательные сроки и прочее? Да и вообще зачем нужны hr тогда? Рассылайте тесты. Кто сделал, убив пару дней на различные задания, тот молодец и может быть, будет принят в нашу конторку. Остальным спасибо, вы поработали бесплатно, повезёт в следующий раз.


    1. leprosus
      19.07.2022 16:48

      Я был по обе стороны: и нанимал, и проходил собеседования.
      - Когда нанимал, я вообще жёстко фильтровал людей - общение только после тестового задания. Это мне высвободило 90% времени, которое ранее я затрачивал на "фантазёров", которые на словах мастера, в 25 лет обладают 10 летним опытом, работали над "крупными проектами", а доходя до элементарных вопросов по стеку или до простых задач, плыли как неподготовленные школьники на экзамене. Да, ЗП были большие, желающих было много.
      - Когда собеседуюсь, то я всегда смотрю на тех, с кем общаюсь, если это тупо HR и компания готова сделать предложение, так как я прохожу по профилю, отказываюсь. Это говорит лишь о дикой текучке либо работа будет связана с чем-то, с чем люди не хотят работать. Если собеседуюсь и вижу: токсиков на собеседовании, отсутствие пунктуальности, не отвечают на мои вопросы, которые касаются работы и будущих коллег - тоже лесом; в компании есть проблемы в коллективе. Если на техн собеседовании оч вялые вопросы или нет интересного тестового - оставляю в выборке предложений, но смотрю дальше, так как для меня важно понимать, с каким уровнем задач я буду сталкиваться; я не хочу тупо таскать задачки и править буковки в коде.

      imho если тестовое задание требует несколько дней для исполнения, оно должно оплачиваться (у меня таких было несколько и делал с удовольствием, так как они были и сложные, и интересные, к тому же с предсказуемой оплатой; одно тестовое было 1 месяц, оплата была больше моей ЗП в 3 раза, делал по вечерам, тестовое прошёл, финальное собеседование с руководителем нет). Если тестовое меньше 8 часов, то нужно оценивать компанию и тестовое задание - это компромисс.

      Говорить кардинально, что тестовое - это плохо, я бы не стал.
      Но допускаю, что много людей сталкивалось с плохими компаниями, у которых найм был через одно место. Тут могу сказать, что навык отбора таких компаний приходит с опытом: чаще собеседуйтесь, будет интуитивно понятнее, какая компания не подходит и их тестовое лучше не делать.


      1. Graf_Shokolakula
        19.07.2022 19:15

        Спасибо за развёрнутый комментарий, интересно было прочитать., но все таки не соглашусь с вами. А тестовое задание на 8 часов за возможность попасть куда то меня пугает если это не топ компания мирового уровня.


        1. leprosus
          19.07.2022 19:25

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


  1. gigimon
    19.07.2022 18:02

    Скажите, а зачем вы даете тестовое задание, чтобы что? Вам недостаточно просто поговорить? Ваши 8 пунктов говорят только о том, что у этих людей другой стиль написания тестов, чем принято в вашей компании (и вы даже про это сами говорите).

    В моем понимании, единственное тестовое задание, которое может быть, это опросник/задачка, чтобы HR отсеивал совсем никаких


    1. black_from_scalable Автор
      20.07.2022 10:53

      Добрый день! Как написано в статье, тестовое проверяет не столько стиль кода, сколько, скажем так, ход мысли человека. Стиля кода, пожалуй, касаются только пункты про засовывание нескольких тестов в один (но есть же атомарность, которая на стиль никак не влияет) и про “говорящие” названия тестов и переменных. Не думаю, что, например, отсутствие в тесте адекватной проверки является различием в стиле – это неудачный тест. Если бы результаты устного собеседования всегда совпадали с результатами тестового, то мы бы, полагаю, от него отказались. Но, увы, пока что это не так. К примеру, по нашей статистике из дошедших до теста и выполнивших его кандидатов похвастаться удовлетворительным результатом могут не более 30%.


      1. mergy
        20.07.2022 15:10

        Так может вам устное подтюнить, пока не станут совпадать результаты? Кажется, что ход мысли человека вполне себе можно узнать на собеседовании.

        Вы же понимаете, что тестовое задание - отталкивающий кандидата фактор? Были хорошие кандидаты, которые отказались делать или забили, согласившись?


        1. black_from_scalable Автор
          21.07.2022 11:46
          +1

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

          У нас были кандидаты, которые на тестовом показали себя лучше, чем на собеседовании. К тому же на устном собеседовании есть ряд классических вопросов, ответы на которые можно заучить, произвести хорошее впечатление, а потом посыпаться в задании.

          Конечно, есть кандидаты, отказавшиеся делать тестовое, но на удивление их было крайне мало.


      1. nronnie
        21.07.2022 20:53

        Как написано в статье, тестовое проверяет не столько стиль кода, сколько, скажем так, ход мысли человека.

        На деле оно проверяет только степень занятости проверяющего, и еще то, с какой ноги он встал с утра. Можно подумать, что кто-то из специалистов реально будет разбираться в чьем-то чужом коде (практическая ценность которого равна нулю) когда своего собственного кода в работе выше крыши. Скорее всего вообще кинут его не глядя в корзину и сделают отписку либо: "ОК." либо: "Говнокод." (лично я когда-то так всегда и делал :D).