<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Сита &#8212; Можно Подумать</title>
	<atom:link href="https://testitquickly.com/tag/%D1%81%D0%B8%D1%82%D0%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://testitquickly.com</link>
	<description>про тестирование ПО и всё такое прочее</description>
	<lastBuildDate>Thu, 09 Oct 2008 15:17:36 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://testitquickly.com/wp-content/uploads/2021/09/favicon_lupan-150x150.jpg</url>
	<title>Сита &#8212; Можно Подумать</title>
	<link>https://testitquickly.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">202834616</site>	<item>
		<title>Три сита в грамотном тестировании</title>
		<link>https://testitquickly.com/2008/10/09/tri_sita/</link>
					<comments>https://testitquickly.com/2008/10/09/tri_sita/#comments</comments>
		
		<dc:creator><![CDATA[Alexei Lupan]]></dc:creator>
		<pubDate>Thu, 09 Oct 2008 15:17:36 +0000</pubDate>
				<category><![CDATA[Acceptance testing]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Банальное]]></category>
		<category><![CDATA[Гипотезы]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Озарения]]></category>
		<category><![CDATA[Постановка мозгов]]></category>
		<category><![CDATA[Скриншоты]]></category>
		<category><![CDATA[Соображения]]></category>
		<category><![CDATA[Сита]]></category>
		<guid isPermaLink="false">http://testitquickly.wordpress.com/?p=463</guid>

					<description><![CDATA[Вечер. Хочется порассуждать о тестировании глобально, посасывая белое мартини из трубочки. Именно мартини, потому, что «массандровский» херес меня не восхитил, а коньяка в офисе уже мало. Рассуждать хочу долго и о ситах. Си́то — устройство для разделения сыпучих масс по величине их составляющих (зёрен, круп, песка и т.п.). Сперва послушаем историков: Человеческие жертвоприношения из ряда… <span class="read-more"><a href="https://testitquickly.com/2008/10/09/tri_sita/">Читать далее: Три сита в грамотном тестировании &#187;</a></span>]]></description>
										<content:encoded><![CDATA[<p>Вечер.</p>
<p>Хочется порассуждать о тестировании глобально, посасывая белое мартини из трубочки. Именно мартини, потому, что «массандровский» херес меня не восхитил, а коньяка в офисе уже мало.</p>
<p>Рассуждать хочу долго и о ситах.</p>
<p style="padding-left: 40px;"><strong>Си́то</strong> — устройство для разделения сыпучих масс по величине их составляющих (зёрен, круп, песка и т.п.).</p>
<p><span id="more-463"></span></p>
<p>Сперва послушаем историков:</p>
<p style="padding-left: 40px;">Человеческие жертвоприношения из ряда тестировщиков до и после релиза были распространённым явлением у менеджеров проектов, живших на полуострове Юкатан до нашествия конкистадоров. Тестировщиков приносили в жертву через повешение, утопление, отравление, избивание, а также посредством захоронения заживо в груде документации по проекту.</p>
<p style="padding-left: 40px;">Наиболее жестоким видом жертвоприношения являлось, как и у девелоперов, вспарывание живота и вырывание из груди ещё бьющегося сердца тестировщика, который пропустил баг.</p>
<p style="padding-left: 40px;">В жертву приносились как тестировщики, перекупленные в ходе войн представители других племён (корпораций), так и члены собственной группы, в том числе и высший слой, сениоры.</p>
<p style="padding-left: 40px;">Выбор времени, очерёдности и способа жертвоприношения тестировщиков до сих пор не ясен. Точно установлено, что в жертвоприношение в огромных масштабах приносились тестировщики, выявленные в офисе после демонстрации продакшн-релизов представителям заказчика. Однако до сих пор неясно, вели ли менеджеры проектов кровопролитные войны для получения большего количества тестировщиков с целью принесения их в будущем в жертву.</p>
<p>Итак, утопление.</p>
<p>В начале ХХ века в центральной Америке было модно заниматься археологическими раскопками в «подземных» озерах. Для тех, кто в эти озера когда-то нырял, это довольно мрачное место. А для археолога ХХ века подобное озеро &#8212; кладезь информации. На дне, в многовековых наслоениях грязи, лежат никем не разворованные украшения, кости, черепа и прочие интересные археологические штучки.</p>
<p>Как все это добро достать?</p>
<p>Любое движение водолаза по дну такого жилищного массива баламутит всю грязь, и видимость склоняется к нулю.</p>
<p>А водолаз без движения уподобляется тем, кто уже никогда не выныривал из этого озера.</p>
<p>Выход — использовать насосы с ситами разного калибра. Положим три сита друг на друга. Наверху будет сито с самыми крупными ячейками. В середине — среднее. Снизу — самое мелкоячеистое.</p>
<p>Насос начинает выкачивать грязь из подземного озера. Грязь вываливается на сита, и археологам надо только подставлять свои любопытные руки под это месиво.</p>
<ul>
<li>Все крупные предметы будут лежать на верхнем сите.</li>
<li>Самые мелкие тоже не пропадут, потому что их пропустит среднее сито, но задержит самое мелкое.</li>
<li>Все бусины буду сосчитаны и уложены в ящики. Если их не пропьют помощники археологов, то позже их можно будет выкрасть из европейских музеев.</li>
</ul>
<p>В идеальном, грамотном процессе девелопмента применим тот же принцип просеивания тонны грязи <span style="text-decoration: line-through;">софта</span> сквозь три сита. Но, поскольку у нас тут не все как у людей, то порядок расположения сит изменен. Сверху лежит самое мелкоячеистое, потом среднее, и внизу — сито с самой крупноячеистой сеткой.</p>
<p>Сделаем музыкальную паузу.</p>
<hr />
<p><strong><span style="color: #ff0000;">Прочти, раскрась, запомни:</span></strong></p>
<p style="padding-left: 40px;">Тестирование в Agile-way особенно сильно тем, что всё, что можно автоматизировать, автоматизируется до и во время разработки, а не отдельно от неё.</p>
<hr />
<p>Продолжим сосать мартини и рассуждать.</p>
<p>Каждое &#171;сито&#187; в девелопменте имеет свое имя.</p>
<ol>
<li>Test Driven Development — сито мелкоячеистое.</li>
<li>Acceptance Test Driven Development — сито среднеячеистое.</li>
<li>Functional Testing — сито крупноячеистое.</li>
</ol>
<p>Первые два сита — епархия программистов. Сам я существенно разбираюсь только в третьей теме.</p>
<p>Тестировщики и прочий рабочий люд тоже могут запускать акксептанс-тесты одной кнопкой, но по-настоящему полезно и мощно этот инструмент работает в руках программистов, которые могут писать, запускать и апдейтить акксептанс-тесты в ходе разработки, а не после или вместо неё.</p>
<p>Рассуждать о трех ситах следует абстрактно, с точки зрения процесса, не вдаваясь в детальки.</p>
<p style="padding-left: 40px;">Например, понятие сита — уже абстракция.</p>
<p>Абстрактность тут нужна потому, что большинству людей понятие TDD поначалу не «поддаётся», и неимоверно трудным оказывается процесс понимания всего этого. Но когда во все врубился и вгрыззся, становится странным, что до сих пор все это не использовал&#8230;</p>
<h2><span style="color: #008000;"><strong>Unit testing</strong></span></h2>
<p>Внятный пример &#8212; <a href="http://cylib.iit.nau.edu.ua/Books/ComputerScience/PhilosophyProblem/xprogramming.ru/Articles/LoveUT.html">LoveUT</a>.</p>
<p>Цитата из статьи:</p>
<p style="padding-left: 40px;">Тихо мурлыкая под нос, Анна продолжает кодировать свой класс.</p>
<p>Суть «разработки через тестирование» проста:</p>
<ul>
<li>Сначала программист пишет тест для проверки функциональности, которую собирается написать. Этот тест называется «unit-test», потому, что он проверяет только одну единицу функционала.</li>
<li>Затем программист пишет функциональность.</li>
<li>И постоянно проверяет ее посредством ранее написанного, специально для нее, теста.</li>
<li>Как только функционал удовлетворяет требованиям этого теста, разработка функции считается завершенной. Переходим к следующей.</li>
<li>Во время разработки других функций, которые связаны с уже существующей, программисту можно и следует запускать юнит-тесты чаще, чем его легкие всасывают в себя один литр воздуха. Если все «горит зеленым» — программист счастлив. Если красное — увы.</li>
</ul>
<p>Юнит-тестирование (на абстрактном уровне) позволяет достаточно быстро проверить, не привело ли очередное изменение кода к <em>регрессу</em> всей системы, то есть к ухудшению качества софта, а также существенно облегчает локализацию и устранение таких ошибок. Все это <strong>может</strong> ускорить разработку.</p>
<p>Особенности юнит-тестов:</p>
<ul>
<li>Неподготовленный человек не может их читать и понимать, не видя код.</li>
<li>Уровень абстракции в юнит-тестировании неимоверно нулевой. Тесты обрабатывают определенный код, и будучи отстраненными от кода просто не находят смысла в своем существовании. Цель юнит-тестирования — изолировать отдельные части программы и показать, что по отдельности эти части — работоспособны.</li>
<li>Когда функция меняется, юнит-тесты меняются в первую очередь.</li>
</ul>
<p>Дальше надо сидеть рядом и показывать, как это работает. Этот момент в одиночку вряд ли одолеть, поэтому пропускаем подробности и едем дальше.</p>
<h2><span style="color: #008000;"><strong>Acceptance testing</strong></span></h2>
<p>Внятное описание на английском языке: <a href="http://en.wikipedia.org/wiki/Acceptance_testing">wikipedia.org</a>.</p>
<p>Акксептанс-тесты — второй шаг после юнит-тестов. Это уже существенный уровень абстрактности от кода.</p>
<p>На предыдущем уровне проверялось и доказывалось, что каждая отдельная часть программы работоспособна. А на этом уровне проверяются взаимосвязи между отдельными частями программы, а также то, что программа выполняет заранее определенные задачи в определенном виде.</p>
<p style="padding-left: 40px;">Мне когда-то казалось, что акксептанс-тестирование означает проверку соответствия отдельных модулей заявленным критериям или достижение заранее и очень точно определенных целей, что можно делать вручную. Я ошибался. Это изумительно работает в руках разработчиков. В остальных руках это работает или очень просто, или никак.</p>
<p>Особенности акксептанс-тестов:</p>
<ul>
<li>Неподготовленный человек вполне может их читать и понимать, не видя код.</li>
<li>Уровень абстракции в юнит-тестировании неимоверно большой. Тесты обрабатывают не определенный код, а определенные абстракции, которые должны быть воплощены в коде.</li>
<li>Функция меняется как угодно. Акксептанс-тесты для нее не меняются.</li>
</ul>
<p>Неординарность подобного тестирования в том, что оно относится к методам <span style="text-decoration: line-through;">чернокнижников </span>тестирования черного ящика, когда про код мы знаем только то, что он где-то существует. Но тестирование происходит путем нажатия одной кнопки и прогона каких-то тест-кейсов, которые написаны на более-менее машинном языке, что неимоверно роднит эти тесты с юнит-тестами.</p>
<p>Парадкос в том, что подобные проверки хоть и абстрактны, но изрядно привязаны к существующему коду. Ведь абстракции проверяются работающим кодом, не так ли?</p>
<p>Для сочувствующих agile development уточняем: акксептанс-тесты проверяют юзер-сториз. А юзер-сториз &#8212; вне кода, вне технологий. Получается, что у нас есть high level tests, которые запускаются нажатиями кнопок.</p>
<h3><strong>Пример, пример! </strong></h3>
<p style="padding-left: 40px;">Приводится стандартный пример из учебного проекта, который видит каждый, кто умудряется запустить FitNesse.</p>
<p>В примере проверялась такая юзер-стори:</p>
<p style="padding-left: 40px;">«User want to perform money operation from my account to another one to pay/receive money to/from another User»</p>
<p>посредством следующего приемочного критерия:</p>
<p style="padding-left: 40px;">«After money operation one of the accounts is increased and another is decreased by the same amount of money».</p>
<p>Критерии акксептанс-тестов задают (а в идеальном мире — пишут) заказчики софта, а не разработчики. Например, пресловутый заказчик просит* следующего:</p>
<ul>
<li>в базе должны существовать аккаунты разных юзеров.</li>
<li>у каждого юзера на счету есть какие-то деньги.</li>
<li>после нажатия кнопки «Сделать офигенно», со счета юзера №1 на счет юзера №2 должны передаваться какие-то суммы.</li>
</ul>
<ul>* имхо, неимоверно удачно выбранный глагол.</ul>
<p>Как выглядит такой тест, написанный в wiki-разметке в фреймворке «FitNesse»</p>
<div id="attachment_464" style="width: 458px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2008/10/test-money-operation-default-view.jpg"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-464" class="size-full wp-image-464" title="test-money-operation-default-view" src="https://testitquickly.com/wp-content/uploads/2008/10/test-money-operation-default-view.jpg" alt="FitNesse" width="448" height="652" /></a><p id="caption-attachment-464" class="wp-caption-text">Тесты в FitNesse читаемы и понятны</p></div>
<p>Как эта таблица выглядит в формате wiki:</p>
<p style="padding-left: 40px;">Make sure that there are no accounts in the bank.</p>
<p style="padding-left: 40px;">!|ensure|clean accounts|</p>
<p style="padding-left: 40px;">Create two different accounts.</p>
<p style="padding-left: 40px;">!|create account for user|Bob|with amount|5|</p>
<p style="padding-left: 40px;">!|create account for user|John|with amount|7|</p>
<p style="padding-left: 40px;">и тд</p>
<p>Как это выглядит после прогона теста:</p>
<div id="attachment_465" style="width: 471px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2008/10/test-money-operation-results.jpg"><img decoding="async" aria-describedby="caption-attachment-465" class="size-full wp-image-465" title="test-money-operation-results" src="https://testitquickly.com/wp-content/uploads/2008/10/test-money-operation-results.jpg" alt="FitNesse рапортует о выполнении задач партии" width="461" height="677" /></a><p id="caption-attachment-465" class="wp-caption-text">FitNesse рапортует о выполнении задач партии</p></div>
<p>Как и почему это работает — не уточним, чтобы не переходить в детали и не разрушать сказки и абстракции. Но стоит сказать, что написание подобных тестов требует интеллекта и какого-то времени. Все равно, что стихи писать&#8230;</p>
<h3>Предварительное резюме</h3>
<p>Тестирование на уровне юнит-тестов показывает, что кусочки кода по-отдельности работают, как ожидалось.</p>
<p>Тестирование на уровне приемочных-тестов показывает, что кусочки кода по-отдельности работают, как ожидалось, а также то, что взаимосвязи между ними работают и выполняются, как ожидалось.</p>
<p style="padding-left: 40px;">Сравним это с муравьями. Пропустим муравьев через мелкое сито. Если каждый в отдельности муравей не хромает и бодро шевелит своими шестью лапками — это отличный муравей. Но это не гарантирует нам то, что муравейник, большая система взаимоотношений между муравьями, будет работать.</p>
<p>Систему взаимоотношений мы начинаем проверять средним ситом. В ячейки попадают по-несколько муравьев, например, отсортированных по принципам выполнения задач. Отдельно — фуражиры, отдельно — охранники, отдельно — муравьи-мамки, отдельно — все остальное. Но сцепленное между собой по какой-то логике.</p>
<h2><span style="color: #008000;"><strong>Functional testing</strong></span></h2>
<p>Сито с самыми крупными ячейками. Оно отлавливает логические взаимодействия, которые посредством проверки работоспособности мелких муравьев проверить невозможно.</p>
<p>Тут мы руками или головой проверяем, что будет, если мимо муравейника проедет танк, и кто победит, если муравьи нападут на танк. Ставлю сто баксов на муравьев&#8230;</p>
<p>Тут мы глазами проверяем, что случится, если все этажи муравейника соединены между собой проходами, и по ним все двигаются, как положено.</p>
<p>Тут мы узнаем, что бывает, если муравьев в системе слишком много или слишком мало.</p>
<p>Это можно делать как всеми органами осязания, воззрения и осмысления, так и заранее документируя свои действия (тест-кейсы).</p>
<p>Иногда проверки на этом уровне можно автоматизировать, но это не та волшебная автоматизация, которая присуща предыдущим уровням. Это грубое вмешательство с мечтательной целью избавиться от необходимости шерстить софт руками 🙂</p>
<h2>Окончательное прозрение</h2>
<p>Если</p>
<ol>
<li>проект только начинается</li>
<li>разработка ведется в стиле on-going (неизвестны ни конечный результат, ни дата полного финала)</li>
<li>код пишется «с нуля»</li>
<li>заказчик умеет работать в agile-стиле</li>
<li>разработчики умеют работать в agile-стиле</li>
<li>инженеры «болеют» тестированием</li>
<li>все три сита постоянно применяются в процессе разработки</li>
</ol>
<p>тогда</p>
<ol>
<li>проект вполне может завершиться выпуском идеального продукта</li>
<li>все риски, которые влечет неполное тестирование, могут быть предупреждены и преодолены</li>
<li>скорость разработки возрастает в неимоверные разы</li>
<li>каждый гребёт свою кучу денег и убегает домой пить пиво и смотреть футбол с любимой женой.</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://testitquickly.com/2008/10/09/tri_sita/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">463</post-id>	</item>
	</channel>
</rss>
