Зачем нужны тесты

ПРАКТИКА ПОДБОРА

Н.Д. Антипова,
начальник отдела управления персоналом ЗАО «Владимирский ЖБК», г. Владимир
Плюсы и минусы психологического тестирования
В чем достоинства и недостатки профессионального тестирования кандидатов?
Как можно использовать тестирование в сочетании с другими методами отбора персонала
В статье рассказывается о практическом использовании разного рода тестов при отборе персонала на вакантные должности. При этом называются следующие достоинства данного метода но , как замечает автор статьи, несмотря на очевидные достоинства психологического тестирования, результаты его не могут гарантировать высокую профессиональную эффективность отобранного кандидата. Кроме того, надо учесть и дефицит хороших тестов, и грамотных психологов-диагностов. Излишне увлекаться тестированием не стоит, но нельзя и отрицать этот метод получения информации о человеке. Конечно, при заполнении вопросников претендент может представить себя в лучшем свете, однако эту погрешность можно учесть, используя много тестов и сопоставляя результаты их заполнения. Большая часть статьи посвящена практическому использованию названных методик в общей технологии подбора персонала, в частности, рассказывается об опыте компании «Владимирский ЖБК», где разработано специальное «Положение о конкурсном отборе».

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

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

ЗАО «Владимирский ЖБК» – сравнительно молодая, растущая компания. Владимирский завод железобетонных конструкций, на базе которого шесть лет назад она была создана, имеет полувековую историю. Компания специализируется на производстве бетонов и растворов, пенобетонных блоков и пенополистирольных плит, а также химических добавок к бетонам (пластификатор С.3, диспергатор).

Кажется, достоинства применения психологического тестированияпри отборе кандидатов на вакантные должности очевидны: это возможность выявить присущие кандидату индивидуально-типологические и личностные особенности, влияющие на эффективность деятельности, спрогнозировать его профессиональную успешность, вероятность бесконфликтного «вхождения» в коллектив и сотрудничества с коллегами, оценить, насколько его личностные ценности соотносятся с корпоративными стандартами компании. Все это позволяет принимать достаточно взвешенное решение, приглашать (или не приглашать) кандидата на работу в организацию. Почему же, несмотря на указанные выгоды применения тестирования, отношение к нему среди HR-менеджеров весьма неоднозначно?

Если бы с помощью какого-либо одного метода можно было получить объективное заключение об успешности человека в той или иной

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

Не слишком лестные отзывы HR-практиков о тестах вызваны не столько их недостатками, сколько неграмотным их применением. Тесты – лишь инструмент, и, как любым инструментом, ими надо уметь пользоваться.

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

Анализ профессиональной деятельности

Целью психологического анализа профессиональной деятельности является:

  • определение задач работы;
  • выявление качеств, необходимых для ее выполнения.

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

Таким образом, если мы будем применять психологические тесты для отбора кандидатов на вакантную должность, не учитывая требований их будущей деятельности, мы попадаем пальцем в небо. Какова вероятность того, что подобранный «хороший человек» сможет успешно справиться с предложенной ему работой? Если же мы учитываем только особенности его будущей деятельности, но не диагностируем индивидуально-психологические качества, то можем лишь предположить, что приглашенный на работу специалист обладает ими.

Возможность соединения теории и практики

Если HR#менеджер признает важность анализа трудовой деятельности, то как ему реализовать изложенные выше положения в практической работе, когда перед службой персонала ставятся разнообразные задачи и времени на исследования не отводится, и штат сотрудников немногочислен? Может быть, попробовать осуществить реальное из возможного?

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

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

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

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

Технология подбора персонала в компании «Владимирский ЖБК»

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

В качестве примера «встраивания» психологического тестирования в общую технологию подбора персонала может быть интересен опыт компании «Владимирский ЖБК»: указанная технология отражена в «Положении о конкурсном отборе». Для подбора сотрудников в компании используется ряд процедур (см. рисунок).

В Приложении 1 помещена «Заявка на проведение подбора персонала»: она заполняется линейным руководителем (при помощи сотрудника отдела управления персоналом) и содержит основные требования к претенденту, необходимые для выполнения работы. Кроме того, руководитель должен обосновать причину поиска сотрудника. Обозначение даты открытия и закрытия вакансии не позволяют ему затягивать проведение собеседований с кандидатами.

Руководитель также заполняет «Характеристику рабочего места»

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

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

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

Рис. Процедуры подбора персонала в компании «Владимирский ЖБК»

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

Следует сказать несколько слов о подборе тестовых методик. Их количество и сочетание варьируются в зависимости от вакансии. Например, при подборе руководителей и специалистов в компании применяются: опросник Басса, диагностирующий преобладающую направленность личности, методику Томаса, выявляющую стиль межличностного взаимодействия и поведение в конфликтных ситуациях, и 16-факторный личностный тест Кеттелла, особенно актуальный при отборе на должности, где предстоит работа с людьми.

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

Итак, правомерно или нет применение психологического тестирования в практике подбора персонала? Завершая обсуждение этого вопроса, акцент хотелось бы перенести на профессиональное использование этих процедур. Если у вас нет грамотного специалиста, применяйте другие методы. Собеседование, например, по-прежнему остается самым используемым методом в практике подбора.

Словарь менеджера по персоналу

Психодиагностика – психологическое изучение претендентов на овладение профессией, оценка их общего развития, направленности на овладение профессией, степени развития у них качеств, наиболее важных для успехов в овладении профессией.

Приложение 1
Заявка на проведение подбора персонала

Отдел
Ф.И.О. руководителя
Вакансия (профессия претендента)
Причина поиска сотрудника
Форма привлечения сотрудника
(характер занятости)
Постоянная работа
Временная работа
Привлечение для выполнения определенного объема работ
Срок поиска нового сотрудника Необходимость в быстром заполнении вакансии
Перспективный поиск
Кадровые данные претендента Пол
Возраст
Образование
Опыт работы
Профессиональные навыки и умения
Основные должностные обязанности
Специальные квалификационные
требования
Другие специальные требования

Дата открытия вакансии___________________
Дата закрытия вакансии___________________ Подпись ________________

Приложение 3
Формирование психологических требований к претенденту

Позиция
Необходимые профессионально
важные качества, психологические свойства
личности
Тестирование
индивидуальное
групповое
Собеседование
(Ф.И.О. руководителя)
Испытания
Результат

КОММЕНТАРИЙ ЮРИСТА
А.Ф. Нуртдинова,
д-р юрид. наук, зав. отделом законодательства о труде и социальном обеспечении Института законодательства и сравнительного правоведения при Правительстве РФ,
г. Москва

Психологическое тестирование: оценка действий работодателя с позиций трудового законодательства

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

Первое, что необходимо отметить, это отсутствие какого бы то ни было упоминания о психологическом тестировании в нормативных правовых актах, регулирующих трудовые отношения. Для проверки деловых качеств работника и его соответствия поручаемой работе трудовое законодательство предусматривает проведение конкурса и прием на работу с испытанием. Иными словами, психологическое тестирование не признается легальным способом оценки деловых качеств претендента на занятие определенной должности. Отсюда следует вывод: тестирование может проводиться исключительно с добровольного согласия работника. Это первое условие, которое обязательно должно соблюдаться.

Второе условие основано на требовании закона обеспечить справедливое и равное отношение ко всем лицам, поступающим в организацию. Трудовой кодекс Российской Федерации запрещает необоснованный отказ в приеме на работу (ст. 64 ТК). Необоснованным считается отказ, основанный на обстоятельствах, не связанных с деловыми качествами работника.

На практике оценка деловых качеств работника вызывает наибольшие трудности. На первый взгляд, результаты психологического тестирования направлены именно на оценку деловых качеств кандидата на должность. Однако это не совсем так. Понятие деловых качеств определено постановлением Пленума Верховного Суда РФ от 17 марта 2004 г. № 2. Под деловыми качествами работника понимаются, во-первых, способность работника выполнять определенную трудовую функцию (наличие профессионального образования, профессиональных навыков, обладание определенной профессией, специальностью, квалификацией), во-вторых, наличие «вспомогательных» профессиональных качеств, которые необходимы в дополнение к типовым или типичным в силу специфики той или иной работы (хорошее состояние здоровья, если работа связана с воздействием неблагоприятных факторов, опыт работы по данной специальности, данной сфере экономической деятельности, наличие образования определенного уровня, дополнительных навыков, например владение иностранным языком, умение работать на компьютере, если это необходимо для выполнения конкретной трудовой функции).

Кроме того, работодатель вправе предъявить к лицу, претендующему на вакантную должность или работу, иные требования, обязательные для заключения трудового договора в силу прямого предписания закона, например наличие российского гражданства для поступления на государственную службу (п. 10 постановления Пленума Верховного Суда Российской Федерации от 17 марта 2004 г.).

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

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

СОВЕТЫ ПРАКТИКА
Классика жанра
Многие руководители при выборе подчиненных склонны доверять скорее собственным впечатлениям, чем результатам психологических тестов. Исследования психологов показали, что чаще всего решения о найме того или иного сотрудника принимаются ими в первые пять минут общения. Оставшееся время интервью используется фактически для проверки первого впечатления. Наталья Виноградова, директор по персоналу группы компаний «Монтекс», рассказывает о том, как выявить кандидатов, совместимых с руководителем и корпоративной культурой компании, используя классические приемы интервью.

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

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

Закон первого впечатления гласит: мнение о человеке формируется в первую минуту встречи и в дальнейшем на 80% остается прежним. Первое впечатление формируют внешность (приблизительно на 55%), голос, культура речи (приблизительно на 30%), смысл слов (менее чем на 20%). Словами мы передаем только 7% информации, 38% – интонацией и 55% – мимикой и жестами. Язык жестов дает больше психологической информации, чем слова. Поэтому чтобы лучше понять человека, необходимо не столько

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

Наблюдать за жестами собеседника важно с первых минут разговора. Если кандидат принял закрытую позу – сложил руки и скрестил ноги (за исключением тех случаев, когда человек сел в кресло, где такая поза удобна), то это уже говорит о том, что человек напряжен. Необходимо «растопить лед», задав ему несколько сближающих вас вопросов. Теперь можно приступать к основной части интервью.

Ответы на приведенные ниже вопросы, полученные во время интервью, в большинстве случаев позволяют достичь цели собеседования – определить,

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

  • За что вы любите свою работу?
  • Что отличает вас от других людей?
  • Какие качества в человеке вы цените выше всего?
  • Какими качествами, на ваш взгляд, должен обладать идеальный руководитель?
  • Что вы считаете главным достижением вашей жизни?
  • Какими личными качествами вы можете гордиться?
  • Что выводит вас из себя?

Сотрудникам иногда приходится работать в условиях стресса, причин для которого может быть очень много. Также не секрет, что руководители порой резко высказываются в адрес подчиненных, не всегда сдерживают раздражение и другие негативные порывы. Поэтому при подборе кандидата важно выяснить, насколько он стрессоустойчив и восприимчив к конфликтным ситуациям. Для этого существуют «стрессовые» вопросы. Например, проводя беседу в общем положительном ключе, можно неожиданно поинтересоваться: «Почему вы ушли с предыдущей работы на самом деле?» Или, например, можно поинтересоваться у кандидата: «Что вы можете предложить нашей компании?»

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

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

Другой вариант: вы можете сделать вид, что не понимаете собеседника и просите его разъяснить нечто совершенно очевидное. Можно неожиданно получить важную информацию, задав кандидату сложный, «неудобный» вопрос или спровоцировавего. Поинтересуйтесь у собеседника, считает ли он себя самокритичным. Подавляющее большинство ответит утвердительно. Получив положительный ответ, попросите кандидата назвать три основных своих недостатка. Если внятного ответа не последует, настойчиво повторите вопрос. Это и будет проверкой на честность.

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

проверке.

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

В этом уроке я расскажу, зачем нужно тестирование, и на простых примерах покажу, как оно работает. Мы рассмотрим три типа тестов: локальные, инструментальные и UI.

Зачем нужно тестирование?

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

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

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

Как работает тестирование?

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

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

Далее вы запускаете тест. Он возьмет заданные вами входные данные (т.е. числа 2 и 3, операция — сумма), использует их в вашем приложении и убедится, что полученный результат совпадает с тем, что вы указали (5).

Кроме этого сценария (2+3=5), вы в тесте пишете проверки и для остальных операций: вычитание, умножение, деление. Например, обязательно надо протестировать попытку деления на 0. Ваше приложение не должно крэшить при выполнении такого теста.

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

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

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

Типы тестов

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

Два EditText, кнопки со стандартными операциями и TextView с результатом.

Для этого приложения мы создадим три типа тестов: локальный, инструментальный и UI.

Локальный тест

Этот тест предназначен для тестирования кода, который не зависит от компонентов Android API. Т.е. тестируемый код — это чистый Java код, который ничего не знает про Activity, Fragment, Context и пр., поэтому для запуска не нужен Android-эмулятор или реальное устройство. Локальные тесты запускаются прямо на вашем компьютере, используя Java-машину.

В приложении Калькулятор есть класс Calculator, который выполняет вычисления:

public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a — b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) { if (b != 0) { return a / b; } else { System.out.println(«Divide by 0»); return 0; } } }

Для упрощения, используем int в качестве типа чисел.

Как видите, это чистый Java код. В нем нет ничего от Android. А значит мы можем создать локальный тест, который будет для нас тестировать этот класс.

Подробный код теста выглядит примерно так:

Calculator calculator = new Calculator(); int actual = calculator.add(1,2); int expected = 3; assertEquals(expected, actual);

Сначала создаем экземпляр класса Calculator. На нем будем проводить тест

В переменную actual помещаем результат работы объекта calculator, который сложит два числа: 1 и 2.

В переменную expected пишем ожидаемый результат, который должен получиться при сложении чисел 1 и 2, если calculator работает правильно. 1 + 2 должно быть равно 3.

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

Т.е. мы знаем как должен сработать calculator, и мы сверяем это с тем, как он действительно сработал. Результаты должны совпадать. Calculator должен работать так, как мы ожидаем.

Переменные actual и expected я использовал только для наглядности. Тот же тест можно записать так:

Calculator calculator = new Calculator(); assertEquals(3, calculator.add(1,2));

Класс теста будет выглядеть так:

public class CalculatorTest { private Calculator calculator; @Before public void setUp() throws Exception { calculator = new Calculator(); } @Test public void addition() throws Exception { assertEquals(3, calculator.add(1, 2)); } }

Метод addition имеет аннотацию @Test. Это означает, что метод является тестовым и он будет вызван при запуске тестирования. Этот метод тестирует, как работает метод Calculator.add(). Название тестового метода может быть любым, я назвал его addition (сложение), т.к. в нем тестируется операция сложения.

Обратите внимание, я вынес создание объекта сalculator в метод setUp. Этот метод имеет аннотацию @Before, которая означает, что этот метод будет выполнен перед выполнением каждого @Test метода. Это избавляет нас от необходимости самим создавать экземпляр calculator в каждом @Test методе.

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

Запустив этот тест, мы получим сообщение о том, что тест успешно пройден

Т.е. тест выполнил метод add с значениями 1 и 2, получил 3, сравнил это с ожидаемым значением (3) и выяснил, что результат совпал с ожиданием. Значит программа работает так, как мы от нее ожидали.

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

Если сейчас открыть Calculator и поломать там операцию сложения, поменяв плюс на минус

public int add(int a, int b) { return a — b; }

то при запуске тест покажет следующее

Тест сообщает, что ожидалось значение 3, а результат получился -1. Т.е. calculator сработал не так, как мы ожидали, а это означает, что в нем появилась ошибка.

Кроме метода addition, мы можем в тестовом классе создать и другие @Test методы для тестирования остальных операций (вычитание, умножение, деление). А можем создать общий метод, который будет тестировать все операции.

Назовем его operations.

@Test public void operations() throws Exception { assertEquals(3, calculator.add(1,2)); assertEquals(1, calculator.add(1,0)); assertEquals(1, calculator.subtract(7,6)); assertEquals(-2, calculator.subtract(0,2)); assertEquals(12, calculator.multiply(3,4)); assertEquals(0, calculator.multiply(9,0)); assertEquals(2, calculator.divide(8,4)); assertEquals(0, calculator.divide(5,0)); }

Тестируем все 4 операции разными значениями. А операцию divide тестируем делением на 0. Это случай, который потенциально может привести к непредсказуемому результату или крэшу, поэтому его надо обязательно проверять в тестах.

Результат запуска будет таким

Во всех assert-методах результат совпал с ожиданием. Все ок.

Также в лог вывелось сообщение, что была попытка выполнить деление на 0. Это наше сообщение, мы выводим его в методе Calculator.divide просто для информации.

Тест может выявить не только неправильный результат работы вашего класса, но и ошибки, которые приводят к крэшу. Давайте спровоцируем крэш приложения. Предположим, что кто-то решил переписать метод divide и сделал это так:

public int divide(int a, int b) { if (b == 0) { System.out.println(«Divide by 0»); } return a / b; }

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

Запустим тест

Тест поймал ошибку, потому что мы в методе operations тестировали сценарий с делением на 0.

assertEquals(0, calculator.divide(5,0));

Мы предполагали, что деление на 0 может быть опасным и его надо обязательно включить в тесты. И мы не ошиблись. Тест вызвал метод calculator.divide с аргументами 5 и 0, получил крэш и сообщил нам об этом.

Если закомментировать строку проверки деления на 0 в методе operations

@Test public void operations() throws Exception { assertEquals(3, calculator.add(1,2)); assertEquals(1, calculator.add(1,0)); assertEquals(1, calculator.subtract(7,6)); assertEquals(-2, calculator.subtract(0,2)); assertEquals(12, calculator.multiply(3,4)); assertEquals(0, calculator.multiply(9,0)); assertEquals(2, calculator.divide(8,4)); //assertEquals(0, calculator.divide(5,0)); }

и запустить тест, то он вам напишет, что все ок.

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

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

Т.е. понятно, что нет смысла писать тесты типа:

assertEquals(3, calculator.add(1,2)); assertEquals(7, calculator.add(3,4)); assertEquals(11, calculator.add(5,6)); assertEquals(15, calculator.add(7,8));

Тут очевидно, что если сработает первый, то сработают и остальные. Чтобы проверить операцию сложения достаточно одной из этих четырех строк.

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

Инструментальный тест

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

В этом случае, уже не получится запустить тест локально на Java-машине вашего компьютера. Т.е. локальные тесты нам тут не подходят. Нужен Android эмулятор или реальное устройство. Именно на них будут выполняться инструментальные тесты. А значит, в этих тестах мы можем использовать различные Android классы.

Тут необходимо сделать небольшое отступление и сказать, что есть таки возможность писать локальные тесты, которые смогут протестировать объекты, связанные с Android. Но, во-первых, иногда есть необходимость запустить тест именно на Android, а, во-вторых, нам об этом пока рано говорить. Мы эту тему рассмотрим чуть позже. Пока примем как данность, что тесты для объектов, связанных с Android, необходимо запускать на Android.

Для примера снова возьмем Калькулятор. Он хоть и простой, но умеет сохранять данные при закрытии. При выходе из приложения, данные из полей ввода сохраняются в Preferences. А при следующем запуске восстанавливаются обратно.

Для данных используется контейнер Values.

public class Values { private String firstOperand = «»; private String secondOperand = «»; public boolean equalsToValues(Values values) { return firstOperand.equals(values.firstOperand) && secondOperand.equals(values.secondOperand); } // getters and setters }

Он хранит два значения и имеет метод для сравнения себя с другим Values.

И есть SaveValuesHelper, который умеет сохранять Values в Preferences и потом читать его оттуда же.

public class SaveValuesHelper { public static final String KEY_FIRST_OPERAND = «first_operand»; public static final String KEY_SECOND_OPERAND = «second_operand»; private final SharedPreferences sharedPreferences; public SaveValuesHelper(SharedPreferences sharedPreferences) { this.sharedPreferences = sharedPreferences; } public void saveValues(Values values) { sharedPreferences.edit() .putString(KEY_FIRST_OPERAND, values.getFirstOperand()) .putString(KEY_SECOND_OPERAND, values.getSecondOperand()) .commit(); } public Values readValues() { Values values = new Values(); values.setFirstOperand(sharedPreferences.getString(KEY_FIRST_OPERAND, «»)); values.setSecondOperand(sharedPreferences.getString(KEY_SECOND_OPERAND, «»)); return values; } }

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

Тест может выглядеть так:

@Test public void saveAndReadValues() throws Exception { Context appContext = InstrumentationRegistry.getTargetContext(); SharedPreferences sharedPreferences = appContext.getSharedPreferences(«test», 0); sharedPreferences.edit().clear().commit(); SaveValuesHelper saveValuesHelper = new SaveValuesHelper(sharedPreferences); Values saveValues = new Values(); saveValues.setFirstOperand(«5»); saveValues.setSecondOperand(«2»); saveValuesHelper.saveValues(saveValues); Values readValues = saveValuesHelper.readValues(); assertTrue(saveValues.equalsToValues(readValues)); }

Мы используем объект InstrumentationRegistry, чтобы получить Context и создаем абсолютно реальный рабочий объект SharedPreferences, в котором очищаем все данные для чистоты эксперимента. Далее создаем SaveValuesHelper и даем ему для работы SharedPreferences.

Для теста создаем новый объект saveValues с значениями 5 и 2 и просим saveValuesHelper сохранить эти значения в префы. Затем просим saveValuesHelper вытащить значения из префов в readValues. И методом assertTrue проверяем, что метод equalsToValues вернет true. Т.е. те данные, которые мы записали (saveValues) должны быть равны тем значениям, которые мы потом считали (readValues).

Если тест пройдет успешно, значит saveValuesHelper корректно сохраняет и считывает значения.

Запускаем тест и видим, что все ок — тест пройден успешно.

Обратите внимание на кучу текстовой информации. Ее не было в локальных тестах.

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

Давайте сделаем ошибку в программе, чтобы тест выявил ее.

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

Не вопрос. Добавляем поле result в Values.

public class Values { private String firstOperand = «»; private String secondOperand = «»; private String result = «»; public boolean equalsToValues(Values values) { return firstOperand.equals(values.firstOperand) && secondOperand.equals(values.secondOperand) && result.equals(values.result); } // getters and setters }

И добавляем сохранение этого result в методе saveValues:

public class SaveValuesHelper { public static final String KEY_FIRST_OPERAND = «first_operand»; public static final String KEY_SECOND_OPERAND = «second_operand»; public static final String KEY_RESULT = «result»; private final SharedPreferences sharedPreferences; public SaveValuesHelper(SharedPreferences sharedPreferences) { this.sharedPreferences = sharedPreferences; } public void saveValues(Values values) { sharedPreferences.edit() .putString(KEY_FIRST_OPERAND, values.getFirstOperand()) .putString(KEY_SECOND_OPERAND, values.getSecondOperand()) .putString(KEY_RESULT, values.getResult()) .commit(); } public Values readValues() { Values values = new Values(); values.setFirstOperand(sharedPreferences.getString(KEY_FIRST_OPERAND, «»)); values.setSecondOperand(sharedPreferences.getString(KEY_SECOND_OPERAND, «»)); return values; } }

А вот чтение result в методе readValues добавить мы «забываем».

В тесте добавляем тестовое значение 10 для поля Values.result. Остальное не меняется.

@Test public void saveAndReadValues() throws Exception { Context appContext = InstrumentationRegistry.getTargetContext(); SharedPreferences sharedPreferences = appContext.getSharedPreferences(«test», 0); SaveValuesHelper saveValuesHelper = new SaveValuesHelper(sharedPreferences); Values saveValues = new Values(); saveValues.setFirstOperand(«5»); saveValues.setSecondOperand(«2»); saveValues.setResult(«10»); saveValuesHelper.saveValues(saveValues); Values readValues = saveValuesHelper.readValues(); assertTrue(saveValues.equalsToValues(readValues)); }

Запускаем тест и получаем ошибку

Идем по адресу SaveValuesHelperTest.java:37 и видим там строку:

assertTrue(saveValues.equalsToValues(readValues));

Метод equalsToValues не вернул true, а значит saveValues и readValues не равны, а значит SaveValuesHelper записал одно (5, 2, 10), а считал другое (5, 2). Идем в SaveValuesHelper и обнаруживаем допущенную ранее ошибку.

UI тест

Третий тип теста вполне можно считать реальным живым QA инженером (тестировщиком). UI тест умеет запускать приложение, вводить в поля значения, нажимать кнопки и т.п. А после этого он может проверить в каком состоянии находятся View на экране, что они отображают и т.п.

Давайте рассмотрим пример такого теста.

Приложение Калькулятор при выполнении какой-либо операции (сложение, вычитание и т.д.), читает значения операндов из полей EditText. После этого он проверяет, что операнды не пусты и в случае, когда хотя бы один пустой, выводит сообщение об этом в то же TextView, куда выводится результат.

В коде это выглядит так

String firstOperandText = editTextFirstOperand.getText().toString(); String secondOperandText = editTextSecondOperand.getText().toString(); if (TextUtils.isEmpty(firstOperandText) || TextUtils.isEmpty(secondOperandText)) { textViewResult.setText(R.string.empty_operands); return; } // calculator using

Создадим тест, который воспроизведет ситуацию с пустым операндом.

@Test public void checkClick() { // type 5 value in first EditText onView(withId(R.id.first_operand)) .perform(typeText(«5»)); // press addition button onView(withId(R.id.add)) .perform(click()); // check that TextView contains error text onView(withId(R.id.result)) .check(matches(withText(R.string.empty_operands))); }

В этом тесте мы просим сделать три действия

1) Ввести значение 5 в первый EditText
2) Нажать кнопку сложения
3) Убедиться, что ошибка empty_operands отобразилась в TextView

При запуске тест запустит приложение Калькулятор и выполнит все описанные выше действия. Если вы посмотрите в это время на девайс, вы увидите, как все это происходит. Как будто кто-то запустил приложение и работает с ним.

И тест успешно завершается

Давайте и здесь спровоцируем ошибку. Представим, что пришел новый разработчик, не прочитал внимательно тех.задание и решил, что сообщение об ошибке лучше выводить в Toast, а не в TextView.

Вносим изменения в код:

String firstOperandText = editTextFirstOperand.getText().toString(); String secondOperandText = editTextSecondOperand.getText().toString(); if (TextUtils.isEmpty(firstOperandText) || TextUtils.isEmpty(secondOperandText)) { Toast.makeText(this, R.string.empty_operands, Toast.LENGTH_SHORT).show(); return; } // calculator using

Мы заменили вывод сообщения об ошибке с TextView на Toast.

Запускаем тест и получаем ошибку

Что в переводе означает примерно следующее: не обнаружил в указанном вами TextView строку Empty operands. Тест искал сообщение о пустых операндах в TextView, но не нашел, т.к. оно теперь отображается в Toast.

В итоге, тестом мы поймали несоответствие программы и тех.задания.

Где хранятся тесты?

Вы наверняка обращали внимание на папки Test и AndroidTest, которые создаются у вас в каждом проекте.

Именно в этих папках и хранятся тесты. В папке Test — локальные тесты, а в папке AndroidTest — инструментальные и UI.

Что дальше?

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

От себя могу сказать, что, если вы планируете стать Android разработчиком, то вам имеет смысл изучить эту тему. При устройстве на работу начального/среднего уровня, знание тестирования будет вам очень большим плюсом. А если претендуете на серьезную позицию, то без умения писать тесты никак не обойтись.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *