quick check что это

Использование junit-quickcheck на простом примере в практике TDD

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

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

Первые шаги

Итак, я создал новый пустой проект на Java и сделал сборочный скрипт. У меня сборка данного проекта происходит при помощи gradle. Вы можете посмотреть мой учебный проект здесь. Начиная вот с этого коммита: d9bd97eaec20427e725f9a4c3ff0c0d36cc27ea3 проект уже готов для сборки и реализации нашего тестового примера.

Теперь я должен начать писать код следуя практике TDD. Некоторые апологеты TDD считают, следует начинать разработку класса с написания теста для этого класса. Но здесь я бы с ними поспорил. Моя IDE (IntelliJ IDEA) умеет генерировать тесты при наличии готового класса, поэтому я начну разработку с создания пустого класса:

Здесь и далее код иллюстрируется ссылками на коммит на github.

А вот теперь я попрошу свою IDE создать мне тест и далее начну работать по схеме test-first. Первый тест, который я сделаю, это очень простой тест, при помощи которого я просто создаю новый объект. Я хочу указывать с кем нужно поздороваться в конструкторе. Более того, я считаю, что объект выдающий приветствие может выдавать это приветствие, только одному. Поэтому, конструктора без параметра у этого класса не будет.

Вот созданный мною первый тест:

Обратите внимание, что в этой точке проект не компилируется, то есть, тест красный.

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

Обратите внимание, что тест, конечно, проходит, но фактически, мой класс не делает того, что я от него хотел. Работаем дальше.

Создаю тест для метода getWhom — это геттер, при помощи которого я смогу узнать кому этот объект будет выдавать приветствие:

Проект опять не компилируется, то есть, тест опять красный.

Продолжим.
Реализую требуемый геттер:

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

Тест опять зеленый.

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

Хотя я сторонник того, чтобы коммит был «атомарным». Что такое атомарный коммит, можно почитать, например, здесь: seesparkbox.com/foundry/atomic_commits_with_git. Крато говоря: до тех пор, пока Вы можете сформулировать, что именно Вы сделали, одним предложением это атомарный коммит.

Зеленый тест с неправильной реализацией

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

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

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

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

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

На самом деле, для того, что бы избежать такой некорректной реализации достаточно было бы сделать второй тест с другой строкой whom. Но я попытаюсь решить этот вопрос для максимально общего случая. Решение задачи в общем виде требует использовать множество различных строк. То есть, надо проводить тест не на одной строке «World», как я это сделал, а на разных строках.

Для решения проблемы в общем виде я использовал стороннюю библиотеку junit-quickcheck: github.com/pholser/junit-quickcheck, которая построена на базе Theories из JUnit. Подключаю ее к моему проекту.

На момент написания статьи версия 0.5, которую я здесь использую, имеет статус alpha, но в ней заявлена поддержка Java 8, которую я использую для этого проекта.

Используя эту библиотеку я реализовал заново тестовой метод для проверки метода greetingString:

Разберемся что делает этот код. Аннотация Theory при методе указывает, что это параметризованный тестовый метод, построенный на базе therories. Аннотация ForAll показывает, что данный параметр будет генерируемый. junit-quickcheck из коробки умеет генерировать значения для многих типов данных, в том числе и для строк.

Запускаем тест и теперь он красный, как нам и надо. Теперь я исправлю мою реализацию метода getGreetingString:

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

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

Маленький завершающий штришек этого раздела, я добавил к своему проекту контроль покрытия кода. Использую для этого Jacoco. Прогоняю, смотрю отчет и радуюсь 100% покрытию кода.

Тестирование разных реализаций

Теперь начинаем развивать наш «очень важный» класс HelloSayer. Мне не очень нравится его реализация.
А конкретно, мне не нравится String.format при каждом вызове метода getGreetingString. Однако, есть ситуации, когда это будет ОК, а есть ситуации когда меня это не будет устраивать.

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

А теперь сделаю еще одну реализацию этого интерфейса, которая создает строку приветствия прямо в конструкторе и хранит ее в объекте. Тест я тоже реализовал, спасибо копировать-и-вставить и поиск-и-замена:

Реализация класса HelloSayerAtOnce.

Модульный тест для него:

Здесь есть проблема. Я хочу еще третью реализацию этого же интерфейса, и соответственно, мне придется сделать третий тестовый класс, опять через тот же механизм копировать-и-вставить и поиск-и-замена. Это плохо. Все классы, реализующие этот интерфейс, независимо от того, как именно они реализованы внутри, должны выполнять одно и то же соглашение, которое я уже описал в тесте. Я хочу соблюдать принцип DRY (don’t repeat youself). То есть, я хочу применить один и тот же тест ко всем возможным реализациям этого интерфейса.

Здесь мне на помощь опять пришел junit-quickchecker. Вот модифицированный тест:

Я добавил один генерируемый параметр в тестовый метод: тип класса (в виде перечисления). Перечисления в junit-checker поддерживаются из коробки. Для этого мне нужно всего лишь добавить аннотацию @ValuesOf. И, фактически, все что мне нужно было сделать, это метод для создания экземпляра одного из классов.

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

И на закуску, реализую третий вариант HelloSayer:

Теперь для реализации всех тестов для этого класса мне нужно добавить только 3 строки:

Проверю, что покрытие кода все еще 100%. Все отлично!

Источник

quick check

быстрая проверка

[Л.Г.Суменко. Англо-русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.]

Тематики

Смотреть что такое «quick check» в других словарях:

check — <>I.<> noun 1 close look to make sure sth is safe/correct ADJECTIVE ▪ complete, extensive, full (esp. BrE), thorough ▪ careful, close, rigorous, tight (a … Collocations dictionary

check — check1 W2S1 [tʃek] v ▬▬▬▬▬▬▬ 1¦(find out)¦ 2¦(ask somebody)¦ 3¦(not do something)¦ 4¦(stop something)¦ 5¦(bags/cases etc)¦ 6¦(make a mark)¦ 7 Check Phrasal verbs check in check something<=>off … Dictionary of contemporary English

check — 1 /tSek/ verb 1 FIND OUT (I, T) to do something in order to find out whether something that you think is correct, true, or safe really is correct, true, or safe: Are all the windows shut? I ll just go and check. | check sth: I ll check my… … Longman dictionary of contemporary English

check — check1 checkless, adj. /chek/, v., n., pl. checks or, for 45, chex, adj., interj. v.t. 1. to stop or arrest the motion of suddenly or forcibly: He checked the horse at the edge of the cliff. 2. to restrain; hold in restraint or control: They… … Universalium

check — I. noun Etymology: Middle English chek, from Anglo French eschec, from Arabic shāh, from Persian, literally, king; akin to Greek ktasthai to acquire, Sanskrit kṣatra dominion Date: 15th century 1. exposure of a chess king to an attack from which… … New Collegiate Dictionary

Quick Recall — is an academic competition comparable to Quiz Bowl. Quick Recall, featuring 2 halves of tossup and bonus questions, is used primarily for traditional academic competition in Kentucky. In Ohio, Quick Recall is different as it offers a round of… … Wikipedia

Check sheet — One of the Seven Basic Tools of Quality Purpose To provide a structured way to collect quality related data as a rough means for assessing a process or as an … Wikipedia

check — A commercial demand deposit instrument signed by the maker and payable on the presentation to the bank on which it is drawn. American Banker Glossary A bill of exchange representing a draft on a bank from deposited funds that pays a certain sum… … Financial and business terms

quick — adj. VERBS ▪ be, seem ▪ We d better be quick. ▪ become, get ADVERB ▪ extremely … Collocations dictionary

quick buck — Money made fast. ► “Quick Buck story: If some hell of a nice guy offers you a high return, can’t lose investment, keep your check book in your pocket.” (Forbes, June 21, 1993, p. 236) … American business jargon

spot check — quick test; random investigation … English contemporary dictionary

Источник

quick check

1 quick check

2 quick check

быстрая проверка

[Л.Г.Суменко. Англо-русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.]

Тематики

3 quick check

4 quick check

См. также в других словарях:

check — <>I.<> noun 1 close look to make sure sth is safe/correct ADJECTIVE ▪ complete, extensive, full (esp. BrE), thorough ▪ careful, close, rigorous, tight (a … Collocations dictionary

check — check1 W2S1 [tʃek] v ▬▬▬▬▬▬▬ 1¦(find out)¦ 2¦(ask somebody)¦ 3¦(not do something)¦ 4¦(stop something)¦ 5¦(bags/cases etc)¦ 6¦(make a mark)¦ 7 Check Phrasal verbs check in check something<=>off … Dictionary of contemporary English

check — 1 /tSek/ verb 1 FIND OUT (I, T) to do something in order to find out whether something that you think is correct, true, or safe really is correct, true, or safe: Are all the windows shut? I ll just go and check. | check sth: I ll check my… … Longman dictionary of contemporary English

check — check1 checkless, adj. /chek/, v., n., pl. checks or, for 45, chex, adj., interj. v.t. 1. to stop or arrest the motion of suddenly or forcibly: He checked the horse at the edge of the cliff. 2. to restrain; hold in restraint or control: They… … Universalium

check — I. noun Etymology: Middle English chek, from Anglo French eschec, from Arabic shāh, from Persian, literally, king; akin to Greek ktasthai to acquire, Sanskrit kṣatra dominion Date: 15th century 1. exposure of a chess king to an attack from which… … New Collegiate Dictionary

Quick Recall — is an academic competition comparable to Quiz Bowl. Quick Recall, featuring 2 halves of tossup and bonus questions, is used primarily for traditional academic competition in Kentucky. In Ohio, Quick Recall is different as it offers a round of… … Wikipedia

Check sheet — One of the Seven Basic Tools of Quality Purpose To provide a structured way to collect quality related data as a rough means for assessing a process or as an … Wikipedia

check — A commercial demand deposit instrument signed by the maker and payable on the presentation to the bank on which it is drawn. American Banker Glossary A bill of exchange representing a draft on a bank from deposited funds that pays a certain sum… … Financial and business terms

quick — adj. VERBS ▪ be, seem ▪ We d better be quick. ▪ become, get ADVERB ▪ extremely … Collocations dictionary

quick buck — Money made fast. ► “Quick Buck story: If some hell of a nice guy offers you a high return, can’t lose investment, keep your check book in your pocket.” (Forbes, June 21, 1993, p. 236) … American business jargon

spot check — quick test; random investigation … English contemporary dictionary

Источник

Ru/Introduction to QuickCheck

Краткое введение в QuickCheck и тестирвание кода Haskell.

Contents

Мотивация

В сентябре 2006г. Bruno Martínez задал следующий вопрос:

Итак, проблема в том как эффективно протестировать эту функцию в Haskell. Решение к которому мы пришли это рефакторинг и QuickTest.

Сохранение чистоты кода

Причина, по которой сложно тестировать getList является монадический код с побочными эффектами, смешанный с чистыми вычислениями, который делает трудным тестирование без полного перевода на модель “черного ящика”, основанного на IO. Такая смесь не подходит для рассуждений о коде.

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

Итак, первым шагом, вынесем IO часть функции в тонкий слой-оболочку:

Тестирование с QuickCheck

Запустим GHCi(или Hugs) и испытаем какие-нибудь обобщенные свойства (хорошо, что мы можем использовать QuickCheck прямо из командной строки Haskell). Сначала, для простоты, значение типа [Char] равно самому себе:

Что произошло? QuickCheck сгенерировал 100 случайных значений [Char] и применил наше свойство, проверяя, что результат был True во всех случаях. QuickCheck сгенерирвал этот тестовый набор для нас!

Теперь более интересное свойство: двойное обращение тождественно:

Тестирование take5

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

Простой инвариант может быть таким:

Запишем его, как свойство для QuickCheck:

Которое мы можем запустить в QuickCheck так:

А! QuickCheck поймал нас. Если на входе строка, содержащая менее 5 фильтруемых символов, длина строка на выходе будет менее 5. Итак, ослабим немного свойство:

То есть take5 возвращает строку длинной не более 5. Протеcтируем это:

Еще одно свойство

Еще одним свойством для проверки могла могла бы быть корректность возвращаемых символов.То есть, любые возвращённые символы принадлежат множеству [‘a’,’b’,’c’,’d’,’e’]

Это можно записать как: quick check что это. Смотреть фото quick check что это. Смотреть картинку quick check что это. Картинка про quick check что это. Фото quick check что это

Отлично. Таким образом мы можем иметь некоторую уверенность что функция не возвращает строки ни слишком длинные ни содержащие неправильные символы.

Покрытие

Есть одна проблема настройки QuickCheck по умолчанию c тестированием [Char], 100 тестов недостаточно для нашей ситуации.В действительности QuickCheck никогда не сгенерирует строку, содержащую более 5 символов, используя предложенное воплощение Arbtrary для Char. Мы можем проверить это:

QuickCheck тратит своё время, генерируя различные [Char], в то время, как нам просто нужны более длинные строки. Одно из решений для этого, изменить настройки по-умолчанию QuickCheck, чтобы тестировал глубже:

Это указывает системе найти как минимум 10000 тестов до того, как сделать заключение что все в порядке. Давайте проверим, что это генерирует более длинные строки:

Мы можем проверить генерируемые тестовые данные с помощью ‘verboseCheck’. Тестирование целочисленных списков:

Двигаясь дальше

Отметим, QuickCheck не является встроенным доменным языком только для тестирования кода Haskell. Создавая instance для Arbitrary для некоторого FFI типа, вы можете использовать Haskell и QuickCheck для проверки кода на других языках.

Источник

Quick Check

Смотреть что такое «Quick Check» в других словарях:

check — <>I.<> noun 1 close look to make sure sth is safe/correct ADJECTIVE ▪ complete, extensive, full (esp. BrE), thorough ▪ careful, close, rigorous, tight (a … Collocations dictionary

check — check1 W2S1 [tʃek] v ▬▬▬▬▬▬▬ 1¦(find out)¦ 2¦(ask somebody)¦ 3¦(not do something)¦ 4¦(stop something)¦ 5¦(bags/cases etc)¦ 6¦(make a mark)¦ 7 Check Phrasal verbs check in check something<=>off … Dictionary of contemporary English

check — 1 /tSek/ verb 1 FIND OUT (I, T) to do something in order to find out whether something that you think is correct, true, or safe really is correct, true, or safe: Are all the windows shut? I ll just go and check. | check sth: I ll check my… … Longman dictionary of contemporary English

check — check1 checkless, adj. /chek/, v., n., pl. checks or, for 45, chex, adj., interj. v.t. 1. to stop or arrest the motion of suddenly or forcibly: He checked the horse at the edge of the cliff. 2. to restrain; hold in restraint or control: They… … Universalium

check — I. noun Etymology: Middle English chek, from Anglo French eschec, from Arabic shāh, from Persian, literally, king; akin to Greek ktasthai to acquire, Sanskrit kṣatra dominion Date: 15th century 1. exposure of a chess king to an attack from which… … New Collegiate Dictionary

Quick Recall — is an academic competition comparable to Quiz Bowl. Quick Recall, featuring 2 halves of tossup and bonus questions, is used primarily for traditional academic competition in Kentucky. In Ohio, Quick Recall is different as it offers a round of… … Wikipedia

Check sheet — One of the Seven Basic Tools of Quality Purpose To provide a structured way to collect quality related data as a rough means for assessing a process or as an … Wikipedia

check — A commercial demand deposit instrument signed by the maker and payable on the presentation to the bank on which it is drawn. American Banker Glossary A bill of exchange representing a draft on a bank from deposited funds that pays a certain sum… … Financial and business terms

quick — adj. VERBS ▪ be, seem ▪ We d better be quick. ▪ become, get ADVERB ▪ extremely … Collocations dictionary

quick buck — Money made fast. ► “Quick Buck story: If some hell of a nice guy offers you a high return, can’t lose investment, keep your check book in your pocket.” (Forbes, June 21, 1993, p. 236) … American business jargon

spot check — quick test; random investigation … English contemporary dictionary

Источник

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

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