sonyps4.ru

Тесты на беременность виды и правила использования. Быстрый Тест На Беременность – Критерии Выбора И Механизм Действия

Общие предпосылки тестирования выражаются в критериях добротности, качества теста. Для того чтобы тесты соответствовали своему назначению, адекватно выявляли и достаточно точно измеряли определенные качества, были применимы к различным (до известных пределов) людям и группам, они должны отвечать таким критериям, как объективность, валидность, надежность, репрезентативность, адаптированность, научность. Объективность означает, что результаты тестирования должны быть интерсубъективны, т.е. независимы от того, кто проводит тест. Если данный тест проводят другие люди, то они должны получить такие же результаты. Валидность (англ. valid - действительный, пригодный, имеющий силу) - это пригодность теста для измерения именно того качества, на оценку которого он направлен. Валидность теста дает ответ на вопрос «Что измеряет тест, соответствует ли он той цели, для которой применяется?». Так, например, если тест используется для оценки уровня знаний человека в области управления персоналом, то он должен измерять именно эти знания, а не, скажем, общую эрудицию или знания в области психологии или экономики. Валидность определяется посредством корреляции результатов тестирования с проявлением данного качества на практике. Валидность конкретных тестов может проверяться с помощью использования других, практически доказавших свою добротность методик. Мерой валидности служит коэффициент корреляции теста. Надежность отражает степень точности и постоянства , с которой измеряется качество личности, и характеризует свободу от погрешностей процедуры тестирования. Точность проявляется в уровне совпадения результатов данного теста с показателями других тестов, используемых для этой же цели, постоянство - в устойчивости, стабильности результатов при повторной оценке той же группы тестируемых. Служащее проверке надежности повторное тестирование обычно проводится через две недели. При коэффициенте корреляции свыше 0,75 надежность теста считается вполне приемлемой. Проведение повторного тестирования через значительно более продолжительный срок может характеризовать уже не столько надежность теста, сколько изменение выявленных ранее свойств личности. Надежность и валидность теста взаимосвязаны. Надежность лишь тогда имеет смысл, если тест обладает достаточной валидностью – в противном случае будет измеряться какое-то другое, не соответствующее целям тестирования свойство личности. В то же время если тест не обладает надежностью, неточно и нестабильно измеряет выясняемое качество, то его валидность ставится под сомнение. В целом она может быть либо равна (в идеальном случае), либо меньше надежности. Репрезентативность (соответствие нормам тестирования) - это свойство выборочной совокупности людей, т.е. группы или ряда групп, на основе анализе качеств которых разработан тест (например, студентов, выпускников МГУ, общий уровень социальной компетентности которых определяется), представлять генеральную совокупность всех лиц, обладающих подобными типологическими характеристиками (в данном случае всех студентов страны или даже мира - в зависимости от конкретного содержания теста). Тест репрезентативен тогда, когда использованная при его разработке выборка обоснована и присущие ей характеристики достаточно равномерно распределены в генеральной совокупности. Репрезентативность позволяет классифицировать результаты тестирования (например, выделять высокий, средний и низкий уровни социальной компетентности). Если тест нерепрезентативен, то предлагаемые им оценки выраженности свойств будут неприменимы за пределами выборки (в данном случае за пределами студентов МГУ, т.е. применительно к учащимся других вузов). Репрезентативность отражается в норме теста , представляющей собой "средний уровень развития большой совокупности людей, похожих на данного испытуемого по ряду социально-демографических характеристик". Иными словами, норма теста - это средний уровень распределения выявляемых с его помощью характеристик в большой группе людей (генеральной совокупности), на применимость в которой претендует тест. В большинстве случаев тестовые нормы определяются с помощью усреднения результатов тестирования большой выборки людей одного пола и примерно одинакового возраста и дифференциации полученных результатов по важнейшим показателям. Нормы тестов могут изменяться в результате динамики развития самого человека и смены условий его жизнедеятельности. Так, например, нормы интеллектуального развития людей в начале нынешнего столетия были значительно ниже, чем в его конце. С репрезентативностью теста связана его адаптированность. Если репрезентативность характеризует равномерность распределения исследуемых качеств и усредненность оценок тестирования, учитывающих показатели во всей «большой», генеральной совокупности, то адаптированность означает учет национальных (в там числе социальных) и региональных особенностей при использовании тестов, их критическое переосмысление в свете этих особенностей. При использовании тестов, разработанных в иной социально-культурной среде, в проверке и переоценке нуждаются нормы, валидность и надежность тестов и даже их применимость в целом. Проблема адаптированности тестов особенно остро встала в последние годы в связи с широким заимствованием западных тестовых методик и попытками их прямого (без внесения необходимых корректив) использования. Так, например, некоторые отечественные авторы пытаются подтвердить вывод о деградации трудового сознания россиян в постсоветский период с помощью довольно типичного английского теста на трудовую этику. Этот тест, в частности, предусматривает следующие вопросы: «Пользуетесь ли вы служебной оргтехникой (например, ксероксом. – В.П.) в рабочее время для личных нужд?»; «Всегда ли вы приходите на работу точно вовремя?» и т.п. По условиям теста ответы типа «Я, конечно, опаздываю, но совсем редко» положительными не считаются. Неадаптированное, без внесения существенных поправок, использование подобных тестов в современных российских условиях явно неправомерно, хотя бы уже потому, что в России условия труда, его оплаты, традиции трудового сознания очень во многом отличны от западных. Например, в Великобритании на ксерокопирование в личных целях работникам выдастся определенная сумма денег, учитывающая стоимость копирования и проезд до места выполнения работы, а также выделяется дополнительно время, присоединяемое к обеденному перерыву. В современной же России не только не существует всего этого, но и заработная плата сотрудников нередко едва превышает статистический уровень бедности. К тому же в последнее десятилетие массовым явлением стало неполучение зарплаты в течение нескольких или даже многих месяцев. И невзирая на это, люди продолжают работать! С точки зрения западных норм трудовой этики подобные ситуации просто немыслимы. Научность - это обоснованность теста фундаментальными исследованиями, его концептуальная осмысленность. Хотя этот критерий добротности теста выделяется не всегда, обычно он так или иначе подразумевается. Некоторые, в первую очередь довольно простые тесты создаются без особого научно-теоретического осмысления на основе гипотез или предположений о коррелятивных связях между свойством личности и его индикаторами, а также эмпирической проверки такой связи. Однако серьезные профессиональные и другие тесты используют для своего обоснования научные выводы и конструкции. Особенно необходимо научное обоснование при обращении к батарее тестов - серии испытаний, призванных оценить комплекс качеств человека, свидетельствующий о его профессиональной пригодности и ожидаемых трудовых успехах. Батареи тестов широко применяются при отборе персонала.




Катерина протягом тривалого часу працювала в Україні та Новій Зеландії. Вона – QA з понад десятьма роками досвіду в ІТ та сертифікована Full Advanced ISTQB. Одним із напрямів її роботи є покращення процесів тестування в командах. Тож ми запитали в неї, які ключові проблеми трапляються в роботі команди та як їх можна уникнути чи мінімізувати.


Найперша й найголовніша проблема в тому, що люди не вміють спілкуватися. Я проаналізувала матеріали декількох конференцій та мітапів, аби зрозуміти, що ж нам заважає й що необхідно змінити. Так з’ясувалося, що найчастіше – це проблеми спілкування. Не нестача певних технічних знань, не те, що люди не знають мови програмування тощо, а саме спілкування.

Непорозуміння, невміння домовлятися з девелоперами, із замовниками, між собою спричинюють серйозні проблеми в командах. На жаль, у нас це відбувається скрізь. Це специфіка не тільки ІТ-сфери, а загальна проблема будь-якої спільноти, будь-якої команди. Це пов’язано з дуже багатьма речами. Одна з найважливіших – це відсутність довіри між членами команди. Тобто найбільші проблеми в спілкуванні трапляються, коли люди одне одному не довіряють і їм потрібно якось себе захищати. Тоді затягується процес, збільшуються об’єми документації та бюрократія. Численні ж дослідження та курси для менеджерів доводять: коли в колективі високий ступінь довіри, працювати набагато краще. Процеси забирають менше часу.

Друга дуже серйозна проблема (і вона не технічна, знову-таки) – люди бояться робити помилки. Їх жахає те, які наслідки для них можуть мати ці помилки. Деякі люди бояться розповідати про свої проблеми команді або керівникові та намагаються все вирішити самотужки. Це призводить до того, що проблеми лишаються прихованими майже до точки дедлайна. А коли вони таки виринають на поверхню, то щось вдіяти вже важко.

Саме тому, коли в команді високий ступінь довіри, люди не бояться помилятися та відповідати за свої помилки. Відтак гарному менеджеру в цій команді лишається тільки мінімізувати наслідки цих помилок. У мене є дуже гарний приклад, як саме це працює в нашій компанії. Коли я тільки перейшла в PricewaterhouseCoopers (PwC), у нас був дуже специфічний керівник відділу: для нього завжди було дві точки зору – його та неправильна. І хоч загалом людина була непогана, але дуже вперта. Ступінь довіри в команді був не надто високий, а от people turn over якраз навпаки – люди йшли з команди часто. Після зміни начальства нас зібрали і сказали: «Ми трансформуємося, наше завдання – трансформувати бізнес. Але ми не можемо трансформувати бізнес, не трансформувавши водночас себе. А щоби трансформувати себе, ми маємо вчитися, ми повинні помилятися. Інакше нічого не вийде».

Третя проблема – невміння давати фідбек. Коли ти даєш фідбек, то найперше, що ти повинен розуміти, – яка мета цього фідбеку. Мета фідбеку – це підтримати «правильну» поведінку чи змінити «неправильну».

На жаль, люди дуже рідко надають фідбек на «правильну» поведінку та на «хороші вчинки». Якщо хтось щось зробив добре, то його треба похвалити, треба сказати «ти дуже добре це зробив, дякую, це мені допомогло», можливо, навіть написати листа вдячності. Однак (незрозуміло чому) у нас так не заведено. Якщо ти робиш щось добре, то це просто сприймається як належне. Але коли ти десь схибиш, тобі скажуть все, що про тебе думають. Тоді в людини виникає думка: «Ага, я, виходить, нічого гарного не роблю, я тільки помиляюся, я поганий». Тому, по-перше, фідбек мусить мати коригувальний вплив. Коли ти даєш коригувальний фідбек, треба розуміти, що людина не є поганою. Можливо, щось було зроблено не так, але людина не погана сама по собі. Це як із дітьми: коли дитина вчинить погано, то треба пояснити, що погана не вона, а лише її вчинок. Усі хороші люди можуть помилитися і зробити щось не дуже правильне. Але разом можна виправити це.

Про фідбеки дуже гарно розповідається на manager-tolls.com . Там є хороші безплатні подкасти про стосунки, про те, як їх налагоджувати. Я дуже раджу всім послухати про фідбеки. Там йдеться про те, як їх правильно структурувати та давати. Дуже гарна штука, яка дійсно працює.

З усього вищезгаданого випливає четверта проблема – невміння людей пояснити свою точку зору. Один із прикладів – це різниця контекстів: якщо ти зараз у певному контексті, то це не означає, що всі автоматично мають розуміти цей контекст. Саме тому, коли ти починаєш щось пояснювати (особливо коли ти захоплюєшся), треба обов’язково перевіряти, чи співрозмовники тебе зрозуміли. Треба не забувати наводити приклади.

Ще один дуже важливий аспект цієї проблеми – це неефективні мітинги, неефективні зустрічі. Знову нетехнічна проблема. Я впевнена, що будь-яку технічну проблему можна розв’язати, коли ти працюєш разом із командою: чи то написання автотестів, чи розробка якоїсь дуже хитрої стратегії тестування… – немає жодної різниці. Коли проблему вирішує команда, це вже не проблема, а лише невеличкий технічний челендж.

Що ж до неефективних мітингів – це дуже важка річ, яка з’їдає надто багато часу. Люди, коли там сидять, не завжди розуміють, що вони там роблять. Але чомусь вважається, якщо вони були на тому мітингу, з усім були згодні та не ставили жодних питань, то вони все зрозуміли і все буде добре. Ні.

На тому ж manager-tolls.com є гарна добірка подкастів про ефективні мітинги. Я у своїй компанії нещодавно робила невеличкий тренінг про ефективність мітингів. Там я проводила експеримент про те, що на мітингах треба слухати й аналізувати. Найперше я розбила групу на 4 підгрупи:

Першій групі було поставлено просте питання. В одного з членів команди були ручка та аркуш паперу, куди він міг записувати. У другої групи допоміжних матеріалів не було. Ми обговорювали питання, що вимагало запам’ятовування деталей. Ми провели опитування: інтервʼюери мали розповісти мені те, що їм розповіли їхні партнери. Звісно, ті, хто записував, розповіли більше, ніж ті, хто не записував.

Але далі експеримент був ще цікавішим. Це інші дві групи. Третій групі дозволили записувати чи не записувати – за бажанням інтервʼюера. У четвертій групі цій людині дозволено було гортати FB чи телефон під час питань. Запитання були дуже прості. Типу «Що позавчора ви їли на вечерю?», «Де ви провели вихідні?» тощо. У тих, хто не відволікався на телефон, середній відгук був 5-10 секунд. Але в тих, хто відволікався, відгук був майже 30-40 секунд. Лише порівняйте – 5 секунд і 30 секунд!

Це пов’язано з тим, як працює наш мозок. Це називається behavior economics. У нашого мозку дуже мало ресурсу й коли ти його витрачаєш на різні дрібниці (… як пам’ять процесора чи ЦПУ), то в тебе залишається менше ресурсу на обробку важливих задач. Тож коли ти відволікаєшся, аби відповісти на мейл, почитати FB і т. ін, то уваги й ресурсів твого «процесора» не вистачає на важливу задачу. Відтак дуже важливо, щоби на мітингах не було телефонів, а лептопи були тільки для нотаток. І тут важливо зазначити: краще мати на лептопі програмку скетчінгу, щоби писати прямо на екрані як на папері. Якщо ж у лептопі немає такої крутої опції, то звичайний аркуш паперу завжди згодиться. Адже цікаве свідчення: коли ми записуємо інформацію, ми її запам’ятовуємо краще, бо в нас працює інший відділ мозку.

П’ята проблема так само належить до так званих софт скілс. Вона теж пов’язана з контекстом, але трохи в іншому сенсі. Часто люди намагаються робити все так, як раніше, і не беруть до уваги певний локальний контекст: навички конкретної команди, як побудовано спілкування з девелоперами, бізнес-аналітиками, замовником, з ким завгодно… які є доступні технології, і найголовніше – якою є мета.

Порівняймо: сьогодні ви розробляєте веб-сайт для того, щоби випустити якийсь новий вид супер-ламп і їх треба швидко продати. А назавтра ви, наприклад, розробляєте медичне програмне забезпечення, яке буде відповідати за операцію на серці… Мета та підходи будуть різними. Це головне. Коли ти починаєш працювати, треба розуміти, яка в тебе мета, та її постійно перевіряти: чи вона не змінилася, чи ви працюєте так, аби її досягти. Це, знов-таки, стосується не лише програмістів чи тестувальників. Це застосовно взагалі до всього. Треба чітко обговорювати й розуміти цілі: важливо, аби вони були спільними. Бо в команді дуже часто буває таке, що в усіх вони різні. Хтось із девелоперів прийшов вивчити нові підходи до програмування, хтось прийшов відсидіти свої 8 годин та щось за це отримати… А мета має бути одна – зробити класний продукт, який буде допомагати людям.

Коли в тебе є мета, ти і працюєш краще, бо розумієш, чого тобі треба досягти. Ти ліпше розумієш, як тобі співпрацювати з іншими. Ти можеш чітко пояснити, що тобі потрібно від цих інших. Як бачимо, усе переплітається: якщо у вас усіх одна мета, вам простіше працювати в команді, ви довіряєте одне одному, ваші мітинги стають ефективними, ви в одному контексті. Тож виходить, що все починається з визначення спільної мети. А від неї вже залежить, як працювати над рештою складників. Мету я невипадково лишила наостанок, адже треба було до цього дійти. Як говорила моя вчителька англійської: the last but not the least. Тобто остання лише в списку, але не на останньому місці.

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

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

Одним из методов структурного тестирования программ является анализ покрытия . Анализ покрытия служит решению следующих задач:

· нахождение неисполняемых участков программы (после выполнения набора тестов);

· создание дополнительных тестов для увеличения степени покрытия;

· выявление избыточных тестов (тестов, которые не увеличивают степень покрытия);

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

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

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

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


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

4.5.5.1. Покрытие операторов

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

Основной недостаток критерия C0 состоит в том, что он нечувствителен к некоторым управляющим структурам. Рассмотрим, например следующий фрагмент C/C++ кода:

*p = 0xFFFFFFFF;

Даже если будет иметься лишь тест, приводящий к получению значения true условия b, в соответствии с критерием C0 этот код будет полностью протестирован, хотя поведение программы при b==false не исследовалось. Более того, в этом случае произойдет сбой.

4.5.5.2. Покрытие решений

Критерий покрытия решений требует, чтобы каждое двоичное выражение в управляющих структурах (таких как операторы if и while) приняло как значение ИСТИНА, так и значение ЛОЖЬ. Двоичное выражение рассматривается как одно целое (истинный или ложный предикат), структура двоичного выражения не учитывается. Отметим, что к управляющим структурам относятся и все операторы, выполнение которых может привести к возникновению исключения или вызову обработчика прерывания.

Этот критерий также называют критерием покрытия ветвей, покрытия дуг, покрытия основных путей, критерием C1.

К преимуществам этого критерия можно отнести его простоту и отсутствие недостатков, присущих критерию C0. Слабой стороной данного критерия является то, что при нем игнорируются некоторые ветви из-за сокращенной обработки логических выражений. Рассмотрим, например, следующий фрагмент C/C++/Java кода:

if (b && (b2 || function()))

Если условия b1 и b2 примут значения а) true, true и б) false, true соответственно, то логическое условия в операторе if примет как истинное, так и ложное значение. Таким образом, данный фрагмент будет полностью протестирован по критерию C2, хотя функция function()так ни разу и не вызывалась.

4.5.5.3. Покрытие условий и решений/условий

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

Усилением критерия покрытия условий является критерий критерий множественного покрытия условий который требует, чтобы логические подвыражения в условиях приняли все возможные сочетания значений ИСТИНА и ЛОЖЬ.

Объединение требований критериев покрытия решений и условий привело к появлению критерия покрытия решений/условий .

4.5.5.4. Покрытие путей

Критерий покрытия путей исследует выполнение функции по всем возможным путям (последовательностям ветвей) от точки входа до точки выхода.

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

Тестирование путей приводит к очень тщательному тестированию программы. Критерий тестирования путей имеет два серьезных недостатка:

· число путей экспоненциально зависит от числа ветвей;

· многие пути являются нереализуемыми.

Рассмотрим следующий фрагмент C/C++ кода:

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

4.5.5.5. Покрытие функций

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

4.5.5.6. Покрытие вызовов функций

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

4.5.5.7. Критерии, основанные на анализе потока данных

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

4.5.5.8. Сравнение критериев покрытия

Говорят, что критерий K 1 сильнее критерия K 2 , или критерий K 1 включает критерий K 2 , если тестирование программы по критерию K 1 приводит к тестированию программы по критерию K 2 . Если критерий K 1 не включает критерий K 2 , и критерий K 2 не включает критерий K 1 , то критерии K 1 и K 2 не сравнимы. Для некоторых описанных выше критериев можно получить отношения их взаимной сравнимости:

Покрытие решений включает покрытие операторов (так как выполнение всех ветвей в программе приводит к выполнению всех операторов).

Покрытие решений/условий включает покрытие решений и покрытие условий (по определению).

Покрытие путей включает покрытие решений.

Очень часто приходится сталкиваться с вопросом «Что автоматизировать в первую очередь?» Автоматизация не делается ради автоматизации: хочется видеть результат процесса, который давал бы положительный ROI (подробнее о расчете ROI можно прочитать ).

Почему важно использовать автоматизацию?

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

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

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

Итак, каковы критерии выбора тест-кейсов для автоматизации?

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

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

Какие типы тестов следует исключать из тестирования автоматизации?

Перечислим случаи, при которых тесты-кейсы нужно отфильтровать от автоматизации:

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

Что дальше?

Исходя из вышеперечисленных факторов отбора, мы получим сценарии, которые будут участвовать в отборе для автоматизации.
Следующим шагом будет разбиение тестируемого приложения на модули. Для каждого модуля анализируем и идентифицируем тест-кейсы, которые будут выполняться с различным набором данных, на различных средах (ОС/Браузер) и со сложной бизнес-логикой, используют большой объем данных (в том числе и специальных) и применяются различными пользователями.

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

По клику на картинку откроется полная версия.
Y – условие выполняется
N – Условие не выполняется
Таким образом, мы получаем 3 тест-кейса, которые можно начать автоматизировать, и 2 тест-кейса, не требующих автоматизации. Мы выполнили самую важную задачу и добрую половину работы: беспорядок новой темы превращается в подробный план того, что нужно сделать.

Вывод


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

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

Любите тестировщика в себе, а не себя в тестировании!

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

    Классы критериев

  • Структурные критерии используют информацию о структуре программы (критерии так называемого "белого ящика")
  • Функциональные критерии формулируются в описании требований к программному изделию (критерии так называемого "черного ящика" )
  • Критерии стохастического тестирования формулируются в терминах проверки наличия заданных свойств у тестируемого приложения, средствами проверки некоторой статистической гипотезы.
  • Мутационные критерии ориентированы на проверку свойств программного изделия на основе подхода Монте-Карло.
  • Структурные критерии (класс I).

    Структурные критерии используют модель программы в виде "белого ящика", что предполагает знание исходного текста программы или спецификации программы в виде потокового графа управления. Структурная информация понятна и доступна разработчикам подсистем и модулей приложения, поэтому данный класс критериев часто используется на этапах модульного и интеграционного тестирования (Unit testing, Integration testing).Структурные критерии базируются на основных элементах УГП, операторах, ветвях и путях.
  • Условие критерия тестирования команд (критерий С0) - набор тестов в совокупности должен обеспечить прохождение каждой команды не менее одного раза. Это слабый критерий, он, как правило, используется в больших программных системах, где другие критерии применить невозможно.
  • Условие критерия тестирования ветвей (критерий С1) - набор тестов в совокупности должен обеспечить прохождение каждой ветви не менее одного раза. Это достаточно сильный и при этом экономичный критерий, поскольку множество ветвей в тестируемом приложении конечно и не так уж велико. Данный критерий часто используется в системах автоматизации тестирования.
  • Условие критерия тестирования путей (критерий С2) - набор тестов в совокупности должен обеспечить прохождение каждого пути не менее 1 раз. Если программа содержит цикл (в особенности с неявно заданным числом итераций), то число итераций ограничивается константой (часто - 2, или числом классов выходных путей).
  • На приведен пример простой программы. Рассмотрим условия ее тестирования в соответствии со структурными критериями .

    1 public void Method (ref int x) { 2 if (x>17) 3 x = 17-x; 4 if (x==-13) 5 x = 0; 6 } Пример 3.1. Пример простой программы, для тестирования по структурным критериям

    1 void Method (int *x) { 2 if (*x>17) 3 *x = 17-*x; 4 if (*x==-13) 5 *x = 0; 6 } Пример 3.1.1. Пример простой программы, для тестирования по структурным критериям

    Тестовый набор из одного теста, удовлетворяет критерию команд (C0):(X,Y)={(x вх =30, x вых =0)} покрывает все операторы трассы 1-2-3-4-5-6Тестовый набор из двух тестов, удовлетворяет критерию ветвей (C1):(X,Y)={(30,0), (17,17)} добавляет 1 тест к множеству тестов для С0 и трассу 1-2-4-6. Трасса 1-2-3-4-5-6 проходит через все ветви достижимые в операторах if при условии true , а трасса 1-2-4-6 через все ветви, достижимые в операторах if при условии false .Тестовый набор из четырех тестов, удовлетворяет критерию путей (C2):(X,Y)={(30,0), (17,17), (-13,0), (21,-4)} Набор условий для двух операторов if c метками 2 и 4 приведен в

    Таблица 3.1. Условия операторов if
    (30,0) (17,17) (-13,0) (21,-4)
    2 if (x>17) > >
    4 if (x==-13) = =

    Критерий ветвей С2 проверяет программу более тщательно, чем критерии - C1, однако даже если он удовлетворен, нет оснований утверждать, что программа реализована в соответствии со спецификацией.Например, если спецификация задает условие, что|x|100 , невыполнимость которого можно подтвердить на тесте (-177,-177) . Действительно, операторы 3 и 4 на тесте (-177,-177) не изменят величину х=-177 и результат не будет соответствовать спецификации.Структурные критерии не проверяют соответствие спецификации, если оно не отражено в структуре программы. Поэтому при успешном тестировании программы по критерию C2 мы можем не заметить ошибку, связанную с невыполнением некоторых условий спецификации требований.

    Функциональные критерии (класс II)

    Функциональный критерий - важнейший для программной индустрии критерий тестирования. Он обеспечивает, прежде всего, контроль степени выполнения требований заказчика в программном продукте. Поскольку требования формулируются к продукту в целом, они отражают взаимодействие тестируемого приложения с окружением. При функциональном тестировании преимущественно используется модель "черного ящика". Проблема функционального тестирования - это, прежде всего, трудоемкость; дело в том, что документы, фиксирующие требования к программному изделию (Software requirement specification, Functional specification и т.п.), как правило, достаточно объемны, тем не менее, соответствующая проверка должна быть всеобъемлющей.Ниже приведены частные виды функциональных критериев .

    Тестирование пунктов спецификации - набор тестов в совокупности должен обеспечить проверку каждого тестируемого пункта не менее одного раза.

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

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

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

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

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

    Тестирование классов выходных данных - набор тестов в совокупности должен обеспечить проверку представителя каждого выходного класса, при условии, что выходные результаты заранее расклассифицированы, причем отдельные классы результатов учитывают, в том числе, ограничения на ресурсы или на время (time out).

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

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

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

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

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

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

    Пример применения функциональных критериев тестирования для разработки набора тестов по критерию классов входных данных

    Пусть для решения задачи тестирования системы "Система управления автоматизированным комплексом хранения подшипников" (см. Приложение 1, FS) был разработан следующий фрагмент спецификации требований:
  • Произвести опрос статуса склада (вызвать функцию GetStoreStat ). Добавить в журнал сообщений запись "СИСТЕМА: Запрошен статус СКЛАДА". В зависимости от полученного значения произвести следующие действия:
  • Произвести опрос терминала оси (вызвать функцию получения сообщения от терминала - GetAxlePar ). В журнал сообщений должно быть добавлено сообщение "СИСТЕМА: Запрошены параметры оси". В зависимости от возвращенного функцией GetAxlePar значения должны быть выполнены следующие действия ():
  • Определим классы входных данных для параметра - статус склада:
  • Статус склада = 0 (правильный).
  • Статус склада = 4 (правильный).
  • Статус склада = 16 (правильный).
  • Статус склада = 32 (правильный).
  • Статус склада = любое другое значение (ошибочный).
  • Теперь рассмотрим тестовые случаи:

    Тестовый случай 1 (покрывает класс 4):

    Статус склада - 32.

    Система запрашивает статус склада (вызов функции GetStoreStat ) и получает 32

    Тестовый случай 2 (покрывает класс 5):

    Состояние окружения (входные данные - X ):

    Статус склада - 12dfga.

    Ожидаемая последовательность событий (выходные данные - Y ):

    Система запрашивает статус склада (вызов функции GetStoreStat ) и согласно пункту спецификации при ошибочном значении статуса склада в журнал добавляется сообщение "СКЛАД: ОШИБКА: Неопределенный статус".

    Стохастические критерии (класс III)

    Стохастическое тестирование применяется при тестировании сложных программных комплексов - когда набор детерминированных тестов (X,Y) имеет громадную мощность. В случаях, когда подобный набор невозможно разработать и исполнить на фазе тестирования, можно применить следующую методику.
  • Разработать программы - имитаторы случайных последовательностей входных сигналов {x} .
  • Вычислить независимым способом значения {y} для соответствующих входных сигналов {x} и получить тестовый набор (X,Y) .
  • Протестировать приложение на тестовом наборе (X,Y) , используя два способа контроля результатов:
  • Критерии стохастического тестирования
  • Cтатистические методы окончания тестирования - стохастические методы принятия решений о совпадении гипотез о распределении случайных величин. К ним принадлежат широко известные: метод Стьюдента (St ), метод Хи-квадрат (χ 2 ) и т.п.
  • Метод оценки скорости выявления ошибок - основан на модели скорости выявления ошибок , согласно которой тестирование прекращается, если оцененный интервал времени между текущей ошибкой и следующей слишком велик для фазы тестирования приложения.

  • Рис. 3.1.

    При формализации модели скорости выявления ошибок () использовались следующие обозначения:N - исходное число ошибок в программном комплексе перед тестированием,C - константа снижения скорости выявления ошибок за счет нахождения очередной ошибки,t 1 ,t 2 ,…t n - кортеж возрастающих интервалов обнаружения последовательности из n ошибок,T - время выявления n ошибок.Если допустить, что за время T выявлено n ошибок, то справедливо соотношение (1), утверждающее, что произведение скорости выявления i ошибки и времени выявления i ошибки есть 1 по определению:

    (1) (N-i+1)*C*t i = 1

    В этом предположении справедливо соотношение (2) для n ошибок:

    (2) N*C*t 1 +(N-1)*C*t 2 +…+(N-n+1)*C*t n =n N*C*(t 1 +t 2 +…+t n) - C*Σ(i-1)t i = n NCT - C*Σ(i-1)t i = n

    Если из (1) определить t i и просуммировать от 1 до n , то придем к соотношению (3) для времени T выявления n ошибок

    (3) Σ1/(N-i+1) = TC

    Если из (2) выразить C , приходим к соотношению (4):

    (4) C = n/(NT - Σ(i-1)t i)

    Наконец, подставляя C в (3), получаем окончательное соотношение (5), удобное для оценок:

    (5) Σ1/(N-i+1) = n/(N - 1/T*Σ(i-1)t i)

    Если оценить величину N приблизительно, используя известные методы оценки числа ошибок в программе , или данные о плотности ошибок для проектов рассматриваемого класса из исторической базы данных проектов, и, кроме того, использовать текущие данные об интервалах между ошибками t 1 ,t 2 …t n , полученные на фазе тестирования, то, подставляя эти данные в (5), можно получить оценку t n+1 -временного интервала необходимого для нахождения и исправления очередной ошибки (будущей ошибки).Если t n+1 >Td - допустимого времени тестирования проекта, то тестирование заканчиваем, в противном случае продолжаем поиск ошибок.Наблюдая последовательность интервалов ошибок t 1 ,t 2 …t n , и время, потраченное на выявление n ошибок T=Σt i , можно прогнозировать интервал времени до следующей ошибки и уточнять в соответствии с (4) величину C .Критерий Moranda очень практичен, так как опирается на информацию, традиционно собираемую в процессе тестирования.

    Мутационный критерий (класс IV).

    Постулируется, что профессиональные программисты пишут сразу почти правильные программы, отличающиеся от правильных мелкими ошибками или описками типа - перестановка местами максимальных значений индексов в описании массивов, ошибки в знаках арифметических операций, занижение или завышение границы цикла на 1 и т.п. Предлагается подход, позволяющий на основе мелких ошибок оценить общее число ошибок, оставшихся в программе.Подход базируется на следующих понятиях: Мутации - мелкие ошибки в программе. Мутанты - программы, отличающиеся друг от друга мутациями .Метод мутационного тестирования - в разрабатываемую программу P вносят мутации , т.е. искусственно создают программы-мутанты P1 , P2 ... Затем программа P и ее мутанты тестируются на одном и том же наборе тестов (X,Y) .Если на наборе (X,Y) подтверждается правильность программы P и, кроме того, выявляются все внесенные в программы-мутанты ошибки, то набор тестов (X,Y) соответствует мутационному критерию , а тестируемая программа объявляется правильной .Если некоторые мутанты не выявили всех мутаций , то надо расширять набор тестов (X,Y) и продолжать тестирование.

    Пример применения мутационного критерия

    Тестируемая программа P приведена на . Для нее создается две программы-мутанта P1 и P2 .В P1 изменено начальное значение переменной z с 1 на 2 ().В P2 изменено начальное значение переменной i с 1 на 0 и граничное значение индекса цикла с n на n-1 ().При запуске тестов (X,Y) = {(x=2,n=3,y=8),(x=999,n=1,y=999), (x=0,n=100,y=0 } выявляются все ошибки в программах-мутантах и ошибка в основной программе, где в условии цикла вместо n стоит n-1 :

    // Метод вычисляет неотрицательную // степень n числа x static public double PowerNonNeg(double x, int n) { double z=1; if (n>0) { for (int i=1;n-1> Пример 3.2. Основная программа P

    double PowerNonNeg(double x, int n) { double z=1; int i; if (n>0) { for (i=1;n-1> Пример 3.2.1. Основная программа P

    Измененное начальное значение переменной z в мутанте Р1 помечено светлым тоном:

    // Метод вычисляет неотрицательную // степень n числа x static public double PowerMutant1(double x, int n) { double z=2; if (n>0) { for (int i=1;n>=i;i++) { z = z*x; } } else Console.WriteLine("Ошибка! Степень числа n должна быть больше 0."); return z; } Пример 3.3. Программа мутант P1.

    double PowerMutant1(double x, int n) { double z=2; int i; if (n>0) { for (i=1;n>=i;i++) { z = z*x; } } else printf("Ошибка! Степень числа n должна быть больше 0. "); return z; } Пример 3.3.1. Программа мутант P1.

    Измененное начальное значение переменной i и границы цикла в мутанте P2 помечено светлым тоном:

    // Метод вычисляет неотрицательную // степень n числа x static public double PowerMutant2(double x, int n) { double z=1; if (n>0) { for (int i=0;n-1>=i;i++) { z = z*x; } } else Console.WriteLine("Ошибка! Степень числа n должна быть больше 0"); return z; } Пример 3.4. Программа-мутант P2.

    double PowerMutant2(double x, int n) { double z=1; int i; if (n>0) { for (i=0;n-1>=i;i++) { z = z*x; } } else printf("Ошибка! Степень числа n должна быть больше 0. "); return z; } Пример 3.4.1. Программа-мутант P2.



    Загрузка...