Как говорить о тестировании |
20.04.2023 00:00 |
Автор: Джеймс Бах (James Bach) У менеджеров, разработчиков и даже тестировщиков часто появляются нуждающиеся в ответе вопросы о тестировании:
Такие вопросы часто возникают, когда у организации есть проблемы, предположительно возникающие из-за тестирования или где-то рядом с ним. Однако для разрешения этих вопросов нужно вначале понять, чем является тестирование – и чем не является. Затем нужно понять, из чего оно состоит, как эти части связаны друг с другом, и какими словами их описывать. Только тогда можно начать продуктивно говорить о тестировании – без бесполезных концепций, которые в противном случае будут присутствовать в разговоре. В этой статье два раздела:
Основы тестированияМощное определение тестирования – это "процесс оценки продукта путем его изучения через исследование и эксперименты". Это значит, что тестирование – это не то же, что ревью, инспекция или "обеспечение качества", хотя там оно тоже играет свою роль. Под "оценкой" я в первую очередь имею в виду выявление всего того в продукте, что потенциально может ему угрожать. Потенциальные проблемы еще называются риском. Следовательно, тестирование – это процесс анализа ассоциированного с продуктом бизнес-риска (теперь давайте просто называть это "продуктовым риском"). 1. Суть тестирования – в вере в существование проблем и в их активном поиске.Тестирование – имманентно скептичный процесс. Сущность тестирования в основном в том, как вы думаете обо всем, что видите. Тестировщик должен быть отрицательно предубежден (потому что лучше думать, что вы видите проблему, и ошибиться, чем ошибиться в том, что проблема отсутствует). Когда компетентный тестировщик видит продукт, который с первого взгляда вроде бы работает, он не реагирует "Ура, работает!" – он говорит "Возможно, что продукт достаточно хорош для релиза, но также возможно, что в нем есть пока не выявленные серьезные проблемы". Только после проведения достаточного тестирования (с достаточным покрытием, с достаточно чувствительными к бизнес-риску оракулами) тестировщик может сформировать хорошо обоснованное мнение о статусе продукта. Тестирование никогда не "доказывает", что продукт соответствует требованиям. Это истинно и для науки в целом – можно опровергнуть теорию о мире на основании одного-единственного факта, но никогда нельзя доказать истинность этой теории, потому что это потребует сбора абсолютно всех возможных фактов. Представьте бочку с яблоками. Можно взять одно, увидеть, что оно гнилое, и сделать из этого вывод, что бочка не удовлетворяет требованию "должна содержать только свежие яблоки". Однако если это яблоко свежее, невозможно сделать вывод, что все прочие яблоки в ней так же хороши. Процесс тестирования не определяет, "готов" ли продукт и пригоден ли он для релиза. Иными словами, нет способа установить непротиворечивый, алгоритмический или математический критерий, способный влиять на хорошее, ответственное бизнес-решение о релизе. Вместо этого тестирование добывает необходимые менеджменту (тем, кто отвечает за принятие релизных решений) данные, чтобы решение о релизе было достаточно информированным. Выпуск ПО – это сложное бизнес-решение, а не простая техническая задача. Процесс тестирования – это обучение. Тот, кто не учится, тестируя – не тестирует. Конечно, мы хотим выяснить статус продукта, но мы также хотим узнать, как нас можно обмануть, протащив мимо нас важные проблемы. Хорошее тестирование требует постоянного обновления способов обнаружения проблем – частично на основе багов, найденных только после релиза. Миссия тестирования – информировать заинтересованных лиц. Если конкретнее, тестирование существует для того, чтобы предоставлять заинтересованным лицам правильную информацию, нужную им для принятия достаточно хорошо информированных решений о продукте. Сам по себе процесс тестирования не может и не должен определить, "достаточно ли хорош" продукт для релиза – это решение принадлежит заинтересованным лицам. Почему это важно: если мы не можем понимать и уважать суть тестирования, у менеджмента и других сторонних лиц будут раздутые ожидания от того .что тестирование может им дать – и они могут использовать тестирование в качестве козла отпущения в случае проблем, возникших где-то еще 2. Тест – это эксперимент, который человек проводит над продуктом Представьте "пьесу" в театре. Сценарий пьесы часто тоже называется пьесой, но настоящая пьеса – это само представление, с актерами на сцене. Люди могут даже говорить о "пьесе", как о наборе представлений (к примеру, "пьеса шла на Бродвее четыре недели"). Думайте о тесте в том же ключе. Неформально мы можем называть тест-спецификацию "тестом", но постарайтесь никогда не забывать, что тест-спецификация никогда не описывает реальный проведенный тест полностью, потому что к тесту прилагаются человеческое внимание и суждение. Мы также можем говорить о "таком же тесте" спустя какое-то время – даже несмотря на то, что тест развивается и, возможно, никогда не проводится в точности одинаковым образом дважды. Просто помните, что на самом деле "тест" не будет действительно тестом – кроме момента, когда он выполняется. Тогда он становится реальным, к лучшему (когда этим занят квалифицированный и мотивированный тестировщик) или худшему (когда у руля некомпетентный, невнимательный тестировщик). Многие тесты начинают свой путь как открытые вопросы и наброски, и со временем становятся детальнее и систематизированнее. Тестирование по своей сути деятельность исследовательская, как и сам процесс разработки продукта. Это верно даже для тестов с автоматизированными элементами, так как автоматизацию нужно прототипировать, дебажить, поддерживать. Почему это важно: это определение преподносит тестирование как имманентно человеческую деятельность, которой можно помочь инструментами, но нельзя целиком автоматизировать. Такое определение помогает защищать процесс тестирования от попыток чересчур его упростить или отмахнуться от него.
3. Мотивация для тестирования – это риск Нет продуктового риска – нет нужды тестировать. Тестирование начинается с некоей веры, что продуктовый риск существует; обычно эта вера проистекает из различных индикаторов риска, вроде существования сложных связей и потенциального вреда, если код поведет себя плохо. В ходе тестирования и обнаружения проблем (или неспособности их обнаружить) вера в риск заменяется основанными на фактах суждениями о риске, пока эти самые суждения не приведут тестировщиков к выводу, что известно уже достаточно, и менеджмент может принимать достаточно информированные решения о продукте. Следовательно, способность систематически думать о риске – это ключевой фактор для профессионального тестирования. Почему это важно: несмотря на то, что риск – основа тестирования, мало кто обучен думать о нем. Это приводит к бессистемной тест-стратегии и трате сил. Между тем, каждый раз при проектировании теста вы должны быть способны ответить на вопрос, почему этот тест вообще должен существовать. Ответ "потому что продукт может не работать" недостаточно хорош. Что именно может не сработать? Каким образом оно может не сработать? Насколько это вероятное событие? Единственный ли это тест, покрывающий продукт? Какую конкретную ценность дает этот конкретный тест? 4. Любой, занимающийся тестированием, в этот момент - тестировщик Хорошее тестирование требует определенных интеллектуальных, социальных и технических навыков, но, как и в случае с кулинарией, практически кто угодно может до определенной степени заниматься тестированием, и практически кто угодно может внести свой вклад в отличный процесс тестирования. Некоторые специализируются в тестировании – это тестировщики полного рабочего дня. Но для целей этого документа понятие "тестировщик" применимо к кому угодно – разработчику, менеджеру и т. д., - кто на данный момент вовлечен в попытки протестировать продукт. Нужно различать два вида тестировщиков – ответственных и поддерживающих. Ответственный тестировщик – это любой тестировщик, отвечающий за качество своей собственной работы. Иными словами, ответственные тестировщики в норме работают без надзора. Ответственные тестировщики также самостоятельно выбирают тактики и техники, и сами решают, когда остановить тестирование. От поддерживающих тестировщиков не ожидается, что они будут контролировать свою собственную тест-стратегию. Это все те, кто заглядывает помочь с тестированием, или другие тестировщики, работающие только под присмотром тест-лида. Зачастую задача создания формальных баг-репортов зарезервирована за ответственными тестировщиками. Почему это важно: многие годы тестированием в основном занимались специалисты, располагающие временем и концентрирующиеся на выявлении глубинных истин о продукте. С приходом Agile в тестирование стали вовлекаться те, кто не делает его своей специальностью и не располагает временем на его планирование или повышение собственных тест-навыков. Это значит, что необходимо явно обсуждать и оценивать важнейшие элементы тестирования, а не предполагать по умолчанию, что те, кто погружен в тестирование, проведут его согласно профессиональным стандартам. 5. Тестирование – это не верификация, верификация – часть тестирования Верифицировать можно только то, у чего есть истинное значение – правда или ложь. Однако у качества продукта такого значения нет – отчасти потому, что "качество" – многомерная концепция, включающая субъективные компромиссы. Можно верифицировать, что на "томатометре" фильм заработал 46,7, но нельзя верифицировать, действительно ли он хуже фильма, получившего там же 53,2. Люди могут обоснованно спорить о качестве фильмов – и точно так же они могут спорить о качестве ПО. В этом смысле качество можно оценить – можно прийти к основанному на фактах суждению о нем, - но нельзя верифицировать. Качество нельзя осмысленно свести к одному-единственному измерению. Скажем, я могу верифицировать, что если на входе 2+2, то сразу после запуска конкретный калькулятор в конкретное время отобразит на экране "4". Но это не верификация того, что "сложение работает". Другими словами, верификация устанавливает факты, но ни один набор фактов с конечным покрытием не будет логически эквивалентен широкому обобщению. В методологии Rapid Software Testing мы называем верификацию "проверками" – сокращение от "проверки фактов". Но тестирование – это больше, чем проверки. Тестирование использует верификацию как тактику, но также включает критическое мышление, неявное знание и социальную компетенцию. Тестирование – это еще и озарения. Тестирование – это процесс поиска смысла и построения теорий на основании наблюдаемых фактов. Это куда больше простой верификации. В отличие от верификации, тестирование пытается прибегать к обоснованным обобщениям – скачкам суждения – на основании фактов, и менеджмент может использовать эти обобщения для принятия решений. В результате тестирования формируется оценка качества продукта. Почему это важно: верификация зачастую проста. Тестировать сложно. Очень соблазнительно выполнять проверки фактов вместо тестов, потому что проверки не требуют рассуждений, и, следовательно, никто вас не опровергнет. Проверки безопасны и объективны. Но именно эти качества систематически делают их поверхностными и обманчивыми. Стратегия, сконцентрированная исключительно на верификации, пройдет мимо больших продуктовых рисков, которые любой разумный тестировщик должен выявить и исследовать. 6. Выполнение тестов – всего лишь часть тестирования Каждый раз, когда вы экспериментируете над продуктом и исследуете его с целью поиска багов (включая автоматизацию, помогающую этим заниматься), вы выполняете тесты. Но тестирование – это еще и переговоры с командой, проектирование тестов, проработка наборов данных, разработка инструментов, использование инструментов для создания и проведения проверок, изучение спецификаций, написание баг-репортов, отслеживание багов, исследование использованной в создании продукта технологии, изучение пользователей, планирование, и т. д. Любой из этих видов деятельности – это тестирование, если посвящен миссии тестирования. Иными словами, тестирование – это больше, нежели простое проведение тестов, и нельзя просто указать на набор тест-кейсов, говоря "вот оно тестирование, прямо тут". Нет, это не оно. Тестирование – это весь процесс, посвященный миссии тестирования, целиком. Почему это важно: хорошее тестирование требует, чтобы у тестировщиков было время и ресурсы на обучение, моделирование, проектирование, запись, сбор, обсуждение, и т. п. Допущение, что процесс состоит исключительно из написания тест-кейсов и их прогона, не просто ложно – оно несет огромный вред. Оно заставляет тестировщиков работать торопливо и плохо, что выливается в поверхностное тестирование, упускающее важные баги. 7. Ответственный тестировщик должен мыслить иначе, чем разработчик Разработчику нужно придумать один хороший способ заставить все работать; тестировщик пытается вообразить 999 вариантов того, как оно откажется работать. Это нельзя описывать как "конструктивно-деструктивную" дихотомию – тестировщик ничего не разрушает (кроме, возможно, нашей иллюзорной уверенности). Дихотомия тут скорее "оптимист – пессимист" или "императивное (делай это!) – гипотетическое (а что, если?)". Тестировщики живут в мире множества гипотетических отказов, абсолютное большинство которых никогда не произойдет, но многие из которых мы обязаны исследовать – потому что некоторые все же случатся. На взгляд разработчика, тестирование выглядит, как бесконечный, бессмысленный цикл. Где же оно наконец закончится? На самом деле важный аспект компетентного тестирования – это знание, как обосновать, что пришло время заканчивать тестирование; это, как правило, непростая задача. Можно сказать, что разработка ощущается сходящейся задачей, движущейся к завершению, а тестирование, по ощущениям, движется в противоположном направлении: открывает новые возможности, изучает каждую, ведущую к еще большему количеству возможностей, и так далее. Для одного и того же человека довольно трудно размышлять и как разработчик, и как тестировщик, в одно и то же время – это даже болезненно и требует экстраординарной дисциплины. Это не значит, что разработчики не должны проверять свой код. Это важно. Но юнит-"тесты" – на самом деле не тесты, это низкоуровневые проверки фактов, мало похожие на скептический, креативный процесс тестирования. Тестировщики и разработчики вынужденно движимы разными стимулами: восторг от создания чего-то очевидно хорошего против восторга от обнаружения скрытых недостатков. Когда они работают вместе, они могут построить что-то действительно хорошее, а не просто кажущееся таковым на первый взгляд. Программирование –полезный навык для тестировщиков, но не все тестировщики должны быть программистами. Тестировщики-программисты часто концентрируются на создании инструментов, помогающих тестировать, а не на прямом интерактивном тестировании продукта. Тестирование выигрывает от любых форм разнообразия, но особенно – от когнитивного разнообразия, которое дают люди, по большей части мыслящие как разработчики и глубоко понимающие технологию, и люди, концентрирующиеся на поведениях и виде продукта, хорошо понимающие пользователей. Хорошо, когда есть те, кто хочет "решить все задачи" (даже если результат не идеален) – и те, кто хочет "сделать все правильно" (даже если решение задач занимает больше времени). Почему это важно: люди специализируются как тестировщики, чтобы сконцентрироваться на обнаружении проблем, не отягощая себя предвзятостью, проистекающей из надежд, что продукт будет работать, или веры, что он безотказен, или излишней усталости от попыток заставить его работать, не оставляющей энергии для обнаружения отказов. Все любители, иногда занимающиеся тестированием, должны учитывать эти предубеждения и уметь ими управлять. 8. Тест состоит из тестировщика, процедуры, покрытия, оракулов и мотивирующего риска
Любое покрытие основано на модели, под которой я понимаю определенный способ описания, отображения, постижения продукта; модель – это представление того, что она моделирует. К примеру, покрытие кода основано на модели кода – обычно это читабельный для человека исходный код. При обсуждении тест-покрытия модели обычно имеют форму списка или схемы. Модель браузеров для браузерного покрытия – это список браузеров и их значимых возможностей. Можно сказать, что модель – это перспектива продукта, и для обнаружения всех важных багов нужно тестировать из различных перспектив. Тест-условие определяется как что-то в продукте, что можно исследовать в ходе теста, или что-то, что может повлиять на результат теста. По сути тест-условие – это нечто, что можно протестировать. Если вы каким-то образом моделируете продукт – скажем, перечислив все его сообщения об ошибках, - то каждое сообщение – это тест-условие. Если у вас есть список активных кнопок, каждая кнопка – это тест-условие. Каждая функция продукта – это тест-условие, как и каждая строчка кода. Мы не можем проверить все возможные условия, но должны знать, как их идентифицировать и как о них говорить.
Почему это важно: обсуждение, оценка и защита ваших тестов начинается с понимания этих пяти элементов, необходимых любому тесту. Объясняя ваши тесты и демонстрируя, как они укладываются в глобальную тест-стратегию, нужно затронуть каждый из этих значимых элементов. Разговорные паттерны тестирования Почему мы не нашли этот баг до релиза?Это можно интерпретировать, как:
Однако 4 предпосылка неверна. Для того, чтобы баг остался незамеченным, что-то в процессе необязательно должно быть плохо. Тестирование – это вынужденная работа с выборкой. Нельзя проверить все, мы даже не пытаемся. Мы эмпирически оцениваем риск – мы можем собрать больше эмпирических данных и улучшить свои оценки, но не можем полностью устранить элемент догадок. Иными словами, даже самый лучший из возможных процесс тестирования может чем-то огорчить. Тестирование – вещь ненадежная. Однако, возможно, что-то с процессом действительно не так – особенно если от нас сбежал очень неприятный баг. Рассматривайте каждый беглый баг, как возможность задать здоровые и конструктивные вопросы о том, что случилось и почему. Предполагаемый ответ: "Давай разберемся и выясним". Не нужно сразу начинать обороняться. Никто не может рационально ожидать совершенства, но наши клиенты вправе ожидать, что тестировщики будут учиться на своем опыте. Но и не сводите проблему к простому одномерному объяснению. Исследуя и обсуждая вопрос глубже, думайте вот о чем:
Почему мы не предотвращаем проблемы вместо того, чтобы тестировать?Поверхностно кажется, что в вопросе содержится ложный выбор. Но спрашивающий, возможно, подразумевает "Может быть, будет лучше сосредоточить больше усилий на предотвращении, и меньше – на тестировании". Предполагаемый ответ: подтвердите важность обоих видов деятельности, но верните разговор к центральной теме – к риску: "Мы должны заниматься и тем, и этим. К примеру, мы многое делаем, чтобы предотвратить пожары в домах. У нас есть реле обратного тока для предотвращения возгорания электроприборов. Но у нас также есть датчики дыма и пожарные станции – на случай, если меры предосторожности не помогут. Глубина нашего тестирования должна коррелировать с потенциальным оцениваемым риском, и если этот риск не оправдает себя, то же может произойти с нашей инвестицией в тестирование. Конечно, лучшая мера предосторожности – вообще не разрабатывать продукт. Учитывая, что мы хотим создать для рынка что-то новое, определенный уровень риска неизбежен". Тестирование улучшилось бы при использовании практики Х – прямо как у компании Y!Неважно, какую профессиональную область вы изучаете – вы всегда увидите в них нечто схожее. Например, это практики, которые знают о разнообразии возможностей (методов, инструментов, любых других доступных эвристик) и выбирают, чем именно пользоваться в конкретной ситуации. Методология должна зависеть от контекста, а не от слепой гонки за популярной фишкой. Услышав предположение, что успешная компания (зачастую приводят в пример Facebook и Google) добивается своего, не делая чего-то или всегда что-то делая, знайте, что оно, возможно, не проистекает из анализа проблем и способов их решения. Оно основано на неполных слухах. Мы не знаем, что на самом деле делают Facebook и Google; мы также не знаем, почему именно они делают это именно таким образом. И мы не способны это оценить. Возможно, мы знаем только фанфаронский миф. Более того, успешными компании становятся благодаря, как правило, своей бизнес-модели и интеллектуальной собственности, а не своему инженерному преимуществу. Знаменитые компании обычно могут позволить себе быть шокирующе расточительными, все еще получая прибыль. Кто угодно, работавший на знаменитую и успешную компанию, расскажет вам, что заставить людей поверить в возможность неудачи – это непреходящая проблема. Успех создает дымку самодовольства, токсичную для улучшения процессов. Предполагаемый ответ: подтвердите, что хорошие идеи могут прийти откуда угодно. Напомните, что ответственные технические организации, возможно, не участвуют в бездумной гонке за трендами трендов ради. Затем предложите серьезно обдумать эту практику. Если команда хочет ее опробовать, поощрите их в проведении эксперимента. Но держите в уме определенные нюансы и будьте готовы их обсудить:
Почему нельзя автоматизировать все тестирование?Это разумный вопрос, если вы уверены, что тестирование и проверка фактов – это одно и то же. Проверку фактов можно автоматизировать, хоть это, вероятно, дорого, медленно и сложно в поддержке. Неважно – сделать это можно. Но тестирование – это куда больше, нежели проверка фактов. Тестирование объединяет весь процесс создания ментальных моделей продукта и риска, которые требуются для создания веского, достойного доверия отчета о готовности этого продукта к релизу. Помните, тестируя, вы не верифицируете факты – вы проводите оценку. Если кратко, мы не можем автоматизировать "все тестирование", потому что оценка продукта – это неформализованный, исследовательский, социально обусловленный процесс обучения. Если длинно, то так: некоторые баги легко предсказать и легко спровоцировать, а также легко заметить, если они проявляются (назовем эти баги "поверхностными"), но многие баги или трудно предсказать, или тяжело спровоцировать, или сложно обнаружить, если только точно не знаешь, что ищешь (назовем эти баги "глубокими"). Тестировщики ищут не только поверхностные баги – они ищут все важные. Нахождение глубоких багов требует интуиции, которая зачастую появляется только после взаимодействия с продуктом в течение длительного времени. Возможно, понадобится заметить нечто странное и исследовать это; выполнить сложные операции, легко выполнимые человеком, но дорогие в автоматизации. Ни один хороший тестировщик не располагает всеми отличными тест-идеями прямо при старте проекта. Однако для автоматизации необходимо наличие конкретной формальной процедуры, которая позволит найти все важные баги. Ее не существует. Крупные баги не следуют никакому предустановленному своду правил, а без правил мы не знаем, что закодировать, чтобы их найти. Еще одна причина, по которой нельзя автоматизировать все тестирование, в том, что тестирование требует социальной компетенции. Тест должен оценить значимость данных, проблем, важность того или иного тестирования, и т. Д. Эти решения основаны на понимании подвижных и развивающихся ценностей заинтересованных в продукте лиц. Эти решения должны быть оправданными. Все это требует социальной компетенции. Автоматизированные проверки могут стать суррогатом тестирования только в случае отсутствия глубоких значимых багов. Как правило, это бывает в ситуации очень стабильной базы кода – или в продукте, пользователи которого толерантны к проблемам. Предполагаемый ответ: "Смотри, мы не можем автоматизировать родительство, менеджмент, знакомство с людьми, влюбленность, терапию утраты, медицинскую помощь, правительство, и никто не удивляется, когда же мы уволим всех разработчиков, заменив их роботами-программистами. Почему же ты полагаешь, что требующая навыков деятельность вроде охоты на крупные неожиданные баги – это исключение из этого правила? Однако мы можем автоматизировать массу интересного в тестировании. Если мы можем рентабельно это провернуть – надо делать". Почему тестирование занимает так много времени? Сколько тестирования достаточно? На эти вопросы можно ответить, лишь зная контекст. Иногда тестирование занимает больше времени, а иногда его можно провести довольно быстро. Это зависит от множества факторов, которые можно назвать аспектами тестируемости. См. "Эвристики тестируемости", чтобы узнать больше. Предполагаемый ответ: "О каком конкретно тестировании идет речь? Конкретный ответ можно дать, лишь говоря о чем-то конкретном. Если это не так, то общий ответ таков: тестирование занимает столько времени, сколько необходимо тестировщику для достаточно убедительных аргументов в пользу того, что продукт достаточно хорошо протестирован и заинтересованные лица могут принимать решения на основании достаточно хорошего знания ассоциированных с продуктом рисков". Зачем нам специализированные тестировщики? Почему нельзя просто получить обратную связь от пользователей? Почему тестированием не могут заниматься разработчики? Почему им не могут заниматься вообще все?Зачастую основная причина возникновения такого вопроса – недостаточное понимание того, что такое профессиональное тестирование, чем заняты тестировщики-специалисты. Спрашивающий может считать навыки тестирования повсеместно доступными. На самом деле он, возможно, говорит "Так как тестировать запросто может кто угодно, зачем нам тестировщики на полную занятость?" Однако, возможно, это нехватка понимания ролей: возможно, спрашивающий оспаривает саму идею специализации или концентрации на любой конкретной области – вместо плавного перемещения от одного вида деятельности к другому. См. статью "Как размышлять о ролях и акторах" – там есть список динамик, влияющих на роли и играющих их людей. К примеру, одно из преимуществ специализированного под роль человека – это готовность. Если вы тестируете лишь время от времени, то, возможно, не заглядываете вперед, не планируете тестирование, не готовитесь к нему. Пока специалист по тестированию готовится, случайный тестировщик занят чем-то абсолютно иным. Предполагаемые ответы: "Специализация людей в сложной задаче повышает их эффективность – включая улучшение компетентности, вовлеченности, готовности и координации. Конечно, в ситуации низкого риска такая продуктивность и эффективность могут нам не пригодиться. Да, мы можем получить обратную связь от пользователей, и должны это делать, но нам все еще нужны люди, способные обработать эту информацию. Пользователи отвратительно заводят баги, а у разработчиков нет времени и, как правило, терпения, чтобы разбираться с этой невнятной информацией. Безусловно, вся команда может помочь с тестированием. Но кто-то должен отвечать за него, иначе мы получим хаос". |