<?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>Михаил Поляруш</title>
	<atom:link href="http://poliarush.com/feed" rel="self" type="application/rss+xml" />
	<link>http://poliarush.com</link>
	<description>Консультант, тренер, автоматизатор, создатель и идеолог http://automated-testing.info и http://atdays.com</description>
	<lastBuildDate>Tue, 20 Oct 2015 12:06:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>[Рецепт] Создание вложенных словарей для тестовых нужд без особых проблем, пример на Python</title>
		<link>http://poliarush.com/working/python-how-to-create-nested-python.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=python-how-to-create-nested-python</link>
		<comments>http://poliarush.com/working/python-how-to-create-nested-python.html#comments</comments>
		<pubDate>Mon, 21 Apr 2014 09:43:32 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Работаю]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=2220</guid>
		<description><![CDATA[В поддержку новой инициативы Code Recipes. Искренне надеюсь на вашу помощь и всяческую поддержку в виде новых code recipes! Если Вы программируете на Python, то знаете что словарь является очень важной структурой. И не только является важным для самого языка программирования, а и для автоматизации тестирования на этом языке. Ведь очень часто приходиться описывать данные в [...]]]></description>
				<content:encoded><![CDATA[<blockquote><p><strong>В поддержку новой инициативы <a href="http://automated-testing.info/t/gotovye-reczepty-ili-aktivizacziya-soobshhestva-avtomatizatorov-na-atinfo/4441">Code Recipes</a>. Искренне надеюсь на вашу помощь и всяческую поддержку в виде новых code recipes!</strong></p></blockquote>
<p>Если Вы программируете на Python, то знаете что словарь является очень важной структурой. И не только является важным для самого языка программирования, а и для автоматизации тестирования на этом языке. Ведь очень часто приходиться описывать данные в формате <code>ключ: значение</code>. Такие данные могут быть большие по объему описываемых данных, а также не существовать в момент обращения к словарю . И если использовать стандартные механизмы словаря, то описать сложенные подсловари неудобно, а тем более если вы хотите создавать структуру данных программно в режиме runtime.</p>
<p>Пример, нам надо создать структуру:</p>
<pre><code>{
    "server": {
        "host": "127.0.0.1",
        "port": "22"
    },
    "configuration": {
        "ssh": {
            "access": "true",
            "login": "some",
            "password": "some"
        }
    }
}</code></pre>
<h1>Стандартный способ решения этой задачи</h1>
<pre><code>data = {}
# some logic here
print data["server"]  # will raise exception due to 'KeyError: 'server''
# some logic here
data["server"] = {
    "host": "127.0.0.1",
    "port": "22"
}
# some logic here
if data["configuration"]["ssh"]["login"]: # will raise exception here
    pass

# some logic here
data["configuration"] = {
    "ssh": {
    "access": "true",
    "login": "some",
    "password": "some"
    }
}</code></pre>
<h1>Немного улучшенный вариант</h1>
<p>У словаря можно использовать get метод, чтобы получить значение и не выдавать исключение и возвращать, дефолтное значение. Но если в случае с <code>data["server"]</code> это сработает, то с<code>data["configuration"]["ssh"]["login"]</code> не сработает, так как возвращаемый объект будет типа <code>None</code></p>
<pre><code>data = {}
# some logic here
print data.get("server")
# some logic here
data["server"] = {
    "host": "127.0.0.1",
    "port": "22"
}
# some logic here
if data.get("configuration").get("ssh").get("login"):
    # will raise exception
    # AttributeError: 'NoneType' object has no attribute 'get'
    pass

# some logic here
data["configuration"] = {
    "ssh": {
    "access": "true",
    "login": "some",
    "password": "some"
    }
}</code></pre>
<p>Но если задать дефолтные значения для<code>data.get("configuration").get("ssh").get("login")</code> чтобы не получать ошибку<code>AttributeError: 'NoneType' object has no attribute 'get'</code>, то можно получить нормальный результат</p>
<pre><code>data = {}
# some logic here
print data.get("server")
# some logic here
data["server"] = {
    "host": "127.0.0.1",
    "port": "22"
}
# some logic here
if data.get("configuration", {}).get("ssh", {}).get("login", {}):
    # will raise exception
    # AttributeError: 'NoneType' object has no attribute 'get'
    pass

# some logic here
data["configuration"] = {
    "ssh": {
    "access": "true",
    "login": "some",
    "password": "some"
    }
}</code></pre>
<h1>Готовый рецепт, усовершенствованный способ</h1>
<p>А можно использовать возможности defaultdict</p>
<pre><code>from collections import defaultdict
_default_data = lambda: defaultdict(_default_data)
data = _default_data()
# some logic here
print data["server"]
# some logic here
data["server"]["host"] = "127.0.0.1"
data["server"]["port"] = "22"
# some logic here
if data["configuration"]["ssh"]["login"]:
    print ("some logic") 
# some logic here
data["configuration"]["ssh"]["access"] = "true"
data["configuration"]["ssh"]["login"] = "some"
data["configuration"]["ssh"]["password"] = "some"

import json
print json.dumps(data, indent=2)</code>
<code>defaultdict(&lt;function &lt;lambda&gt; at 0x02565930&gt;, {})
{
  "configuration": {
    "ssh": {
      "access": "true", 
      "login": "some", 
      "password": "some"
    }
  }, 
  "server": {
    "host": "127.0.0.1", 
    "port": "22"
  }
}

</code></pre>
<p>Результат получается без всяких исключений и сложностей, и мы можем задавать любую структуру из подвложенных словарей без фактического определения самих объектов, а также получаем возможность проверки словаря без исключений и удобную стандартную форму записи словаря.</p>
<p>Все варианты кода можно посмотреть на нашей общем репозитории примеров<a href="https://github.com/atinfo/at.info-knowledge-base/tree/master/programming/python/code%20recipes/generate%20nested%20dicts" rel="nofollow">https://github.com/atinfo/at.info-knowledge-base/tree/master/programming/python/code%20recipes/generate%20nested%20dicts</a></p>
<p>Ну и кто хочет учиться python и автоматизации, милости прошу на <a href="http://lessons2.ru/" rel="nofollow">http://lessons2.ru</a></p>

<div class="wp_rp_wrap  wp_rp_plain" id="wp_rp_first"><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1800" data-post-type="none" ><a href="http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html" class="wp_rp_title">Python mock: добавление метода реального класса к mock объекту</a></li><li data-position="1" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="2" data-poid="in-1819" data-post-type="none" ><a href="http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html" class="wp_rp_title">ChromeDriver + Python + Browsermob proxy</a></li><li data-position="3" data-poid="in-2147" data-post-type="none" ><a href="http://poliarush.com/working/python-nosetest-stdout-stderr.html" class="wp_rp_title">Разделение stdout и stderr в python nosetest</a></li><li data-position="4" data-poid="in-2047" data-post-type="none" ><a href="http://poliarush.com/working/development/logging-and-decorators-in-python.html" class="wp_rp_title">Логирование и декораторы в python</a></li><li data-position="5" data-poid="in-1744" data-post-type="none" ><a href="http://poliarush.com/working/test-automation/how-to-parse-bad-html-with-python.html" class="wp_rp_title">Парсинг неправильного html c помощью стандартных библиотек Python</a></li><li data-position="6" data-poid="in-1967" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html" class="wp_rp_title">Выступил на конференции atdays 2013</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/python-how-to-create-nested-python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разделение stdout и stderr в python nosetest</title>
		<link>http://poliarush.com/working/python-nosetest-stdout-stderr.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=python-nosetest-stdout-stderr</link>
		<comments>http://poliarush.com/working/python-nosetest-stdout-stderr.html#comments</comments>
		<pubDate>Wed, 17 Jul 2013 15:26:22 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Работаю]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[заметки]]></category>
		<category><![CDATA[ИТ]]></category>
		<category><![CDATA[техника]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=2147</guid>
		<description><![CDATA[Проблема: в python есть популярный xUnit фреймворк nose, которым пользуются довольно много людей.  Когда подключаешь nose к continuous integration, то хочешь чтобы результаты были максимально видимыми и репрезентативными.  Но вот есть одна проблема, всю выходную информацию nose записывает в один поток, либо stdout либо stderr.  А как же быть, если нам нужно показать часть в [...]]]></description>
				<content:encoded><![CDATA[<p><strong>Проблема:</strong> в python есть популярный xUnit фреймворк nose, которым пользуются довольно много людей.  Когда подключаешь nose к continuous integration, то хочешь чтобы результаты были максимально видимыми и репрезентативными.  Но вот есть одна проблема, всю выходную информацию nose записывает в один поток, либо stdout либо stderr.  А как же быть, если нам нужно показать часть в stderr, а часть в stdout?</p>
<p><em><strong>Например </strong></em></p>
<p><i>Результат прогона полностью выводиться в stderr:</i></p>
<p><span style="color: #ff0000;">#1 Test 1 &#8230; ok</span><br />
<span style="color: #ff0000;">#2 Test 2 &#8230; FAIL</span><br />
<span style="color: #ff0000;">#3 Test 3 &#8230; ok</span><br />
<span style="color: #ff0000;">#4 Test 4 &#8230; ok</span><br />
<span style="color: #ff0000;">#5 Test 5 &#8230; FAIL</span></p>
<p><span style="color: #ff0000;">==============================<wbr />==============================<wbr />==========</span><br />
<span style="color: #ff0000;">FAIL: Test 2</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">Traceback (most recent call last):</span><br />
<span style="color: #ff0000;">  File &#8220;/home/katerina/Desktop/my_<wbr />tests/color.py&#8221;, line 11, in test_2</span><br />
<span style="color: #ff0000;">    self.assertEquals(1, 2)</span><br />
<span style="color: #ff0000;">AssertionError: 1 != 2</span></p>
<p><span style="color: #ff0000;">==============================<wbr />==============================<wbr />==========</span><br />
<span style="color: #ff0000;">FAIL: Test 5</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">Traceback (most recent call last):</span><br />
<span style="color: #ff0000;">  File &#8220;/home/katerina/Desktop/my_<wbr />tests/color.py&#8221;, line 23, in test_5</span><br />
<span style="color: #ff0000;">    self.assertEquals(1, 7)</span><br />
<span style="color: #ff0000;">AssertionError: 1 != 7</span></p>
<p><span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">XML: nosetests.xml</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">Ran 5 tests in 0.004s</span></p>
<p><span style="color: #ff0000;">FAILED (failures=2)</span></p>
<p><b><i><br />
</i></b><i>А надо чтоб результат выводился в 2 потока:</i></p>
<p>#1 Test 1 &#8230; ok<br />
<span style="color: #ff0000;">#2 Test 2 &#8230; FAIL</span><br />
#3 Test 3 &#8230; ok<br />
#4 Test 4 &#8230; ok<br />
<span style="color: #ff0000;">#5 Test 5 &#8230; FAIL</span></p>
<p><span style="color: #ff0000;">==============================<wbr />==============================<wbr />==========</span><br />
<span style="color: #ff0000;">FAIL: Test 2</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">Traceback (most recent call last):</span><br />
<span style="color: #ff0000;">  File &#8220;/home/katerina/Desktop/my_<wbr />tests/color.py&#8221;, line 11, in test_2</span><br />
<span style="color: #ff0000;">    self.assertEquals(1, 2)</span><br />
<span style="color: #ff0000;">AssertionError: 1 != 2</span></p>
<p><span style="color: #ff0000;">==============================<wbr />==============================<wbr />==========</span><br />
<span style="color: #ff0000;">FAIL: Test 5</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">Traceback (most recent call last):</span><br />
<span style="color: #ff0000;">  File &#8220;/home/katerina/Desktop/my_<wbr />tests/color.py&#8221;, line 23, in test_5</span><br />
<span style="color: #ff0000;">    self.assertEquals(1, 7)</span><br />
<span style="color: #ff0000;">AssertionError: 1 != 7</span></p>
<p><span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
<span style="color: #ff0000;">XML: nosetests.xml</span><br />
<span style="color: #ff0000;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<wbr />&#8212;&#8212;&#8212;-</span><br />
Ran 5 tests in 0.004s</p>
<p>FAILED (failures=2)</p>
<p>Вся соль в том, что nose основывает весь свой запуск на unittest. А в unittest используется механизм буферизации stdout и stderr, т.е. unittest все ловит, но в последствии все уходит в один поток. Этот поток по умолчанию stderr. Его конечно можно поменять, но все равно это запись содержимого прогона в один поток или stderr или stdout.</p>
<p><strong>Решение:</strong> простое решение &#8211; это переопределить TextTestResult и TextTestRunner при запуске тестов. Смотрим пример:</p>
<pre class="brush: python; gutter: true; first-line: 1">import unittest
import sys
import nose
from nose.core import TextTestRunner
from nose.result import TextTestResult
from cStringIO import StringIO

class Tests(unittest.TestCase):

    def test_1(self):
        """Test 1"""
        print 'something'
        self.assertEquals(1, 1)

    def test_2(self):
        """Test 2"""
        self.assertEquals(1, 1)

    def test_3(self):
        """Test 3"""
        self.assertEquals(1, 1)

    def test_4(self):
        """Test 4"""
        self.assertEquals(1, 1)

    def test_5(self):
        """Test 5"""
        print 'something'
        raise AssertionError("error")
        self.assertEquals(1, 1)

if __name__ == '__main__':
    class MyTextTestResult(TextTestResult):

        def addError(self, test, err):
            print &gt;&gt; sys.stderr, "%r ... error\n\t%r" % (test, err)

        def addFailure(self, test, err):
            print &gt;&gt; sys.stderr, "%r ... failure\n\t%r" % (test, err)

        def addSuccess(self, test):
            print &gt;&gt; sys.stdout, "%r ... ok" % test

    class MyTextTestRunner(TextTestRunner):

        def __init__(self):
            TextTestRunner.__init__(self, stream=StringIO())

        def _makeResult(self):
            return MyTextTestResult(self.stream,
                                    self.descriptions,
                                    self.verbosity,
                                    self.config)

    nose.main(testRunner=MyTextTestRunner())</pre>
<p>Пример можно скачать здесь <a href="https://github.com/polusok/nose-split-stderr-stdout">https://github.com/polusok/nose-split-stderr-stdout</a>. Это далеко не идеальное решение, но позволит Вам быстро решить вашу задачу.</p>
<p>Успехов и хорошего питонирования!</p>
<p>З.Ы. С 05.08 стартует следующая группа по обучению программированию на <a title="Онлайн курс Python для тестировщика" href="http://poliarush.com/trainings/python" target="_blank">python для начинающих</a>. Еще можно записаться!</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-2047" data-post-type="none" ><a href="http://poliarush.com/working/development/logging-and-decorators-in-python.html" class="wp_rp_title">Логирование и декораторы в python</a></li><li data-position="1" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="2" data-poid="in-1800" data-post-type="none" ><a href="http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html" class="wp_rp_title">Python mock: добавление метода реального класса к mock объекту</a></li><li data-position="3" data-poid="in-1819" data-post-type="none" ><a href="http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html" class="wp_rp_title">ChromeDriver + Python + Browsermob proxy</a></li><li data-position="4" data-poid="in-1744" data-post-type="none" ><a href="http://poliarush.com/working/test-automation/how-to-parse-bad-html-with-python.html" class="wp_rp_title">Парсинг неправильного html c помощью стандартных библиотек Python</a></li><li data-position="5" data-poid="in-2220" data-post-type="none" ><a href="http://poliarush.com/working/python-how-to-create-nested-python.html" class="wp_rp_title">[Рецепт] Создание вложенных словарей для тестовых нужд без особых проблем, пример на Python</a></li><li data-position="6" data-poid="in-1967" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html" class="wp_rp_title">Выступил на конференции atdays 2013</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/python-nosetest-stdout-stderr.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Логирование и декораторы в python</title>
		<link>http://poliarush.com/working/development/logging-and-decorators-in-python.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=logging-and-decorators-in-python</link>
		<comments>http://poliarush.com/working/development/logging-and-decorators-in-python.html#comments</comments>
		<pubDate>Mon, 08 Apr 2013 16:29:20 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ИТ]]></category>
		<category><![CDATA[техника]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=2047</guid>
		<description><![CDATA[Вопрос логирования очень часто возникает при автоматизации тестирования. Каждый кто автоматизировал больше одного теста знает, что логи это ключ к сэкономленным часам анализа ошибок и разборов поломанных тестов. Как правильно выполнить логирование для Вашего проекта? Не знаю, каждый проект это отдельная история, которая должна рассматриваться в отдельности. (Обращайтесь, будем разбираться!) Но я хочу внести некоторые [...]]]></description>
				<content:encoded><![CDATA[<p>Вопрос логирования очень часто возникает при автоматизации тестирования. Каждый кто автоматизировал больше одного теста знает, что логи это ключ к сэкономленным часам анализа ошибок и разборов поломанных тестов.</p>
<p>Как правильно выполнить логирование для Вашего проекта? Не знаю, каждый проект это отдельная история, которая должна рассматриваться в отдельности. (Обращайтесь, будем разбираться!) Но я хочу внести некоторые свои комментарии в данный процесс.</p>
<p>Меня попросили посмотреть на код и показать, как можно выводить документацию для каждого метода в лог. В python это лучше всего сделать с помощью декораторов. Декораторы &#8211; это мощная штука! В общем, меньше слов и больше кода.</p>
<pre class="brush: python; gutter: true; first-line: 1">import logging

def method_decorator(func):
    def wrapper(self, *argv, **kwargv):
        logging.basicConfig(filename='myapp.log', level=logging.INFO)
        logging.info(func.__doc__)
        return func(self, *argv, **kwargv)
    return wrapper

class Something1(object):

    @method_decorator
    def method1(self):
        """documentation thru method decorator for method 1"""
        pass

    def method2(self):
        """documentation thru method decorator for method 2"""
        pass

    @method_decorator
    def method3(self):
        """documentation thru method decorator for method 3"""
        pass

s1 = Something1()
s1.method1()
s1.method2()
s1.method3()

# or thru class decorator

def class_decorator(cls):
    for name, method in cls.__dict__.iteritems():
        if not name.startswith('_'):
            setattr(cls, name, method_decorator(method))
    return cls

@class_decorator
class Something2(object):

    def method1(self):
        """documentation thru class decorator for method 1"""
        pass

    def method2(self):
        """documentation thru class decorator for method 2"""
        pass

    def method3(self):
        """documentation thru class decorator for method 3"""
        pass

s2 = Something2()
s2.method1()
s2.method2()
s2.method3()

#check mixed execution
s1.method1()
s2.method1()</pre>
<p>Т.е. мы описываем необходимый читабельный комментарий как docstring для методов, и когда эти методы вызываются, в лог записывается читабельная информация. В первом случае, можно использовать декоратор для методов, который можно использовать по требованию. А второй класс показывает, как можно включить данное логирование для всех методов класса. Или же Вы можете задать любую необходимую вам логику в class_decorator().</p>
<p>Вот, что мы получаем в логе:</p>
<pre class="brush: bash; gutter: true; first-line: 1">INFO:root:documentation thru method decorator for method 1
INFO:root:documentation thru method decorator for method 3
INFO:root:documentation thru class decorator for method 1
INFO:root:documentation thru class decorator for method 2
INFO:root:documentation thru class decorator for method 3
INFO:root:documentation thru method decorator for method 1
INFO:root:documentation thru class decorator for method 1</pre>
<p>Ну а теперь давайте подключим это к каким-то юнит-тестам. Например, это может выглядеть так.</p>
<pre class="brush: bash; gutter: true; first-line: 1">import logging
import unittest
import random
from functools import wraps

def method_decorator(func):
    @wraps(func)
    def wrapper(self, *argv, **kwargv):
        logging.basicConfig(filename='myapp.log', 
            level=logging.INFO, format='%(message)s')
        logging.info("\t- %s" % func.__doc__)
        return func(self, *argv, **kwargv)
    return wrapper

def class_decorator(cls):
    for name, method in cls.__dict__.iteritems():
        if not name.startswith('_'):
            setattr(cls, name, method_decorator(method))
    return cls

class MyTestingException(Exception):

    def __init__(self, value):
        self.msg = value

    def __str__(self):
        return "%s\n%s" % (self.msg, open("myapp.log").read())

@class_decorator
class Something(object):

    def _generate_number(self):
        if random.randint(0, 10) == 5:
            raise MyTestingException("Please have a look to details:")
        return random.randint(0, 2)

    def method1(self):
        """log to system to make some actions"""
        return self._generate_number()

    def method2(self):
        """registered account with additional credits"""
        return self._generate_number()

    def method3(self):
        """buy subscription for defined account"""
        return self._generate_number()

class TestSomething(unittest.TestCase):

    def setUp(self):
        with open("myapp.log", "w") as f:
            f.truncate()
        self.s = Something()
        self.data = {'some data': [1, 2, 3]}

    def test_method1(self):
        self.s.method1()
        self.s.method2()
        self.s.method3()
        self.assertEquals(self.s.method1(), 0)

    def test_method2(self):
        self.s.method3()
        self.s.method2()
        self.s.method1()
        self.assertEquals(self.s.method2(), 1)

    def test_method3(self):
        self.s.method1()
        self.s.method3()
        self.s.method2()
        self.assertEquals(self.s.method3(), 2)

if __name__ == '__main__':
    unittest.main()</pre>
<p>Что дает следующие результаты:</p>
<pre class="brush: bash; gutter: true; first-line: 1">EFE

======================================================================

ERROR: test_method1 (__main__.TestSomething)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "demo.py", line 64, in test_method1

    self.s.method3()

  File "demo.py", line 12, in wrapper

    return func(self, *argv, **kwargv)

  File "demo.py", line 50, in method3

    return self._generate_number()

  File "demo.py", line 37, in _generate_number

    raise MyTestingException("Please have a look to details:")

MyTestingException: Please have a look to details:

	- log to system to make some actions

	- registered account with additional credits

	- buy subscription for defined account

======================================================================

ERROR: test_method3 (__main__.TestSomething)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "demo.py", line 77, in test_method3

    self.assertEquals(self.s.method3(), 2)

  File "demo.py", line 12, in wrapper

    return func(self, *argv, **kwargv)

  File "demo.py", line 50, in method3

    return self._generate_number()

  File "demo.py", line 37, in _generate_number

    raise MyTestingException("Please have a look to details:")

MyTestingException: Please have a look to details:

	- log to system to make some actions

	- buy subscription for defined account

	- registered account with additional credits

	- buy subscription for defined account

======================================================================

FAIL: test_method2 (__main__.TestSomething)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "demo.py", line 71, in test_method2

    self.assertEquals(self.s.method2(), 1)

AssertionError: 2 != 1

----------------------------------------------------------------------

Ran 3 tests in 0.003s

FAILED (failures=1, errors=2)</pre>
<p>Как всегда, пишите, если у Вас есть вопросы! Удачи и хорошего Вам питонирования! <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-2147" data-post-type="none" ><a href="http://poliarush.com/working/python-nosetest-stdout-stderr.html" class="wp_rp_title">Разделение stdout и stderr в python nosetest</a></li><li data-position="1" data-poid="in-1819" data-post-type="none" ><a href="http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html" class="wp_rp_title">ChromeDriver + Python + Browsermob proxy</a></li><li data-position="2" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="3" data-poid="in-1800" data-post-type="none" ><a href="http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html" class="wp_rp_title">Python mock: добавление метода реального класса к mock объекту</a></li><li data-position="4" data-poid="in-1744" data-post-type="none" ><a href="http://poliarush.com/working/test-automation/how-to-parse-bad-html-with-python.html" class="wp_rp_title">Парсинг неправильного html c помощью стандартных библиотек Python</a></li><li data-position="5" data-poid="in-2220" data-post-type="none" ><a href="http://poliarush.com/working/python-how-to-create-nested-python.html" class="wp_rp_title">[Рецепт] Создание вложенных словарей для тестовых нужд без особых проблем, пример на Python</a></li><li data-position="6" data-poid="in-705" data-post-type="none" ><a href="http://poliarush.com/working/development/agile-manifest.html" class="wp_rp_title">Agile манифест</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/development/logging-and-decorators-in-python.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Жизненные советы от Алекса Дубаса</title>
		<link>http://poliarush.com/thinking/live-commnets-video.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=live-commnets-video</link>
		<comments>http://poliarush.com/thinking/live-commnets-video.html#comments</comments>
		<pubDate>Sun, 03 Mar 2013 21:58:46 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<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://poliarush.com/?p=2013</guid>
		<description><![CDATA[Жизнь приносит нам слезы и радость, смех и разочарование. Люди, отношения, семья, здоровье, родители, зависть &#8230; Это лишь небольшая часть того, о чем мы думаем или, к сожалению, не думаем каждый день. А стоило бы. Ведь это и есть жизнь! Да кстати о жизни, посмотрите видео. Не пожалеете! А для тех, кто знает английский могут посмотреть английскую [...]]]></description>
				<content:encoded><![CDATA[<p>Жизнь приносит нам слезы и радость, смех и разочарование. Люди, отношения, семья, здоровье, родители, зависть &#8230; Это лишь небольшая часть того, о чем мы думаем или, к сожалению, не думаем каждый день. А стоило бы. Ведь это и есть жизнь!</p>
<p>Да кстати о жизни, посмотрите видео. Не пожалеете!</p>
<p><iframe src="http://www.youtube.com/embed/vypPMeTmmeU" frameborder="0" width="663" height="373"></iframe></p>
<p>А для тех, кто знает английский могут посмотреть английскую версию (оригинал) (как всегда, в СНГ сами сделать ничего не могут <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p><iframe src="http://www.youtube.com/embed/sTJ7AzBIJoI" frameborder="0" width="663" height="373"></iframe></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-936" data-post-type="none" ><a href="http://poliarush.com/thinking/main-goal-is-to-achieve-goal.html" class="wp_rp_title">Главная цель &#8211; достижение!</a></li><li data-position="1" data-poid="in-1016" data-post-type="none" ><a href="http://poliarush.com/thinking/fortune-woman.html" class="wp_rp_title">Фортуна &#8211; женщина</a></li><li data-position="2" data-poid="in-966" data-post-type="none" ><a href="http://poliarush.com/everyday/trip-to-orphanage-house.html" class="wp_rp_title">Поездка в денишевский дошкольный детский дом</a></li><li data-position="3" data-poid="in-956" data-post-type="none" ><a href="http://poliarush.com/thinking/help-children.html" class="wp_rp_title">Помощь детишкам</a></li><li data-position="4" data-poid="in-731" data-post-type="none" ><a href="http://poliarush.com/thinking/forces-of-nature.html" class="wp_rp_title">[Фильм] Силы природы</a></li><li data-position="5" data-poid="in-679" data-post-type="none" ><a href="http://poliarush.com/everyday/newyears-feelings.html" class="wp_rp_title">Новогоднее настроение</a></li><li data-position="6" data-poid="in-863" data-post-type="none" ><a href="http://poliarush.com/thinking/simple-and-complex.html" class="wp_rp_title">Мудрость дня: простое и сложное</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/thinking/live-commnets-video.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как сдать ISTQB сертификацию в Украине?</title>
		<link>http://poliarush.com/working/testing/istqb.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=istqb</link>
		<comments>http://poliarush.com/working/testing/istqb.html#comments</comments>
		<pubDate>Tue, 19 Feb 2013 11:21:10 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Tестирование]]></category>
		<category><![CDATA[istqb]]></category>
		<category><![CDATA[ИТ]]></category>
		<category><![CDATA[сертификация]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1980</guid>
		<description><![CDATA[Так как я являюсь обладателем аж 3х сертификаций данной организации, мне часто задают одни и те же вопросы. Вот недавно снова пришел подобный емейл. Значит надо оформить статью и потом высылать ее всем . Как я буду писать ее, да просто в формате вопросов, которые мне задают и моих ответов. Если Вы хотите спросить еще какие-то [...]]]></description>
				<content:encoded><![CDATA[<p>Так как я являюсь обладателем <a href="http://poliarush.com/working/testing/istqb-certification-test-analyst.html" target="_blank">аж 3х сертификаций данной организации</a>, мне часто задают одни и те же вопросы. Вот недавно снова пришел подобный емейл. Значит надо оформить статью и потом высылать ее всем <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Как я буду писать ее, да просто в формате вопросов, которые мне задают и моих ответов. Если Вы хотите спросить еще какие-то вопросы, you are welcome! Буду добавлять информацию по мере надобности.</p>
<ul class="check">
<li><em>Как проходит подготовка к Foundation Level экзамену?</em><br />
выдаются задания и есть определенное время<br />
вы решаете и cдаете и все <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><em>Вам было достаточно почитать примеры и доп. литературу?</em><br />
для меня да<br />
для других не сильно<br />
есть много ресурсов, где можно найти примерочные тесты</li>
<li><em>Основывается ли экзамен на общепризнанных прадигмах тестирования?</em><br />
 <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  интересный вопрос, но для меня не понятный, что Вы имеете ввиду</li>
<li><em>Какие основные &#8220;подводные камни&#8221; Вы заметили в экзамене?</em><br />
много разных вариантов определения какого-то термина<br />
ну и надо знать все подходы, я бы сказал так<br />
если вы прочитали книгу, вы сможете без проблем сдать экзамен</li>
<li><em>Какова стоимость сдачи экзамена в Украине?</em><br />
125 евро</li>
<li><em>Как проходит регистрация, и к кому обращаться? (Александр Тарасенко редко реагирует на письма/звонки)</em><br />
именно к Тарасенко и нужно<br />
но в общем, начальный уровень можно сдать в любом prometric центре<br />
так что можно не заморачиваться на счет тарасенка<br />
<a href="https://www.isqi.org/en/e-exams.html" target="_blank">https://www.isqi.org/en/e-exams.html</a></li>
<li><em>В каком виде выдаётся сертификат?</em><br />
в бумажном, приходят на почту</li>
<li><em>И по литературе &#8211; какие книги Вы бы посоветовали? </em><br />
FOUNDATIONS OF SOFTWARE TESTING, ISTQB CERTIFICATION, Dorothy Graham, Erik van Veenendaal, Isabel Evans, Rex Black (2 книги 2008 и 2012 годов)<br />
Advanced Software Testing, Rex Black (3 книги)</li>
<li><em>Какого рода вопросы для foundation level?</em><br />
Вопросы, которые подразумевают выбор одного или несколько вариантов правильных ответов из перечисленных вариантов.</li>
<li><em>Я прочитала на Вашем сайте, что вы сдали ISTQB Advanced Test Analyst экзамен.<br />
</em><em>Какими материалами Вы пользовались при подготовке кроме силлабуса и стандартной книги?<br />
</em><em>Остались ли у Вас ссылки, если да, то поделитесь, пожалуйста.<br />
</em>Я пользовался стандартными книгами <a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Rockynook/dp/1933952199" target="_blank">Advanced Testing Vol1</a> и <a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Manager/dp/1933952369" target="_blank">Advanced Testing Vol2</a> и <a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Technical/dp/1933952393/ref=pd_bxgy_b_img_z" target="_blank">Advanced Testing Vol3</a> автор Rex Black.<br />
К сожалению, одного силлабуса не хватит для того, чтобы подготовиться к advance уровню.</li>
<li><em>ISTQB Advanced Test Analyst экзамен. Я знаю, что в экзаменационном тесте  возможны несколько вариантов правильных ответов. Есть ли в вопросе точное указание на их количество или они перечислены в одном пункте?</em><br />
Да некоторые вопросы могут содержать 1 или более правильных ответов, но об этом нигде не написано и не обозначено. Т.е. это будет вопросы с несколькими ответами и Вам надо будет отметить один или более правильных ответов. Но все таки в некоторых вопросах есть упоминание: &#8220;вычеркните все которые &#8230; &#8221; или &#8220;укажите все правильные варианты &#8230;&#8221;. В общем, надо просто быть внимательным к мелочам и деталям, а также пользоваться здравой логикой.</li>
<li><em>ISTQB Advanced Test Analyst экзамен. Я тоже недавно сдавала этот экзамен, но не сдала. Буду пересдавать. <span style="font-size: small;">При подготовке я пользовалась силлабусом и стандартной книгой. Но в тесте я встречала термины, о которых ничего не сказано в книге. </span>Так что я думаю, что нужны другие материалы для подготовки. </em><br />
Да силлабус и книги не гарантируют, что Вы будете знать все термины. Я вам так скажу, если Вы прочитаете все три книги, которые я указал, то сдавать будет проще, потому что одна книга дополняют другую. Плюс надо учитывать, что экзамены обновляются постоянно, а книги выпущены все один раз и там некоторая информация уже может быть устаревшей или же в авторы экзамена могли поменять смысл чего-либо. Потому тут так, читайте все литературу и проходите как можно больше заданий. Интернет вам поможет. Есть также круг людей, которые собираются и решают задачи вместе, а есть даже люди, которые учат, как сдать на этот сертификат.</li>
<li><em>ISTQB Advanced Test Analyst экзамен. И последний вопрос, знаете ли вы как начисляются баллы. Если в вопросе два ответа, а я выбрала только один, то сколько баллов будет за такой ответ?</em><br />
Я точной схемы начисления баллов не помню. Это нужно уточнять на месте. Если кто-то знает, буду рад добавить текст сюда.<br />
<strong>Updated:</strong> Я еще раз переспросила на счет кол-ва правильных ответов в rstqb. Вот что мне ответили &#8220;По умолчанию верный только один ответ, если не сказано иного. За верный ответ на вопросы уровня K2 начисляется 1 балл, на вопросы уровней K3 и K4 – по 2 балла&#8221;</li>
</ul>
<p>В общем, если у кого-то возникают похожие вопросы, пишите комментарий буду отвечать и набивать соответствующий FAQ</p>
<p>Что еще можно почитать?</p>
<p><a href="http://automated-testing.info/t/kakie-eshhe-est-vidy-sertifikaczii-dlya-testirovshhikov-krome-istqb-ctfl-ctal/1464" target="_blank">http://automated-testing.info/forum/&#8230;.istqb-ctfl-ctal</a><br />
<a href="http://automated-testing.info/t/istqb/1613" target="_blank">http://automated-testing.info/forum/&#8230;-istqb</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-807" data-post-type="none" ><a href="http://poliarush.com/working/testing/istqb-certification-test-analyst.html" class="wp_rp_title">ISTQB сертификация &#8211; Аналитик по тестированию</a></li><li data-position="1" data-poid="in-559" data-post-type="none" ><a href="http://poliarush.com/working/testing/istqb-certification.html" class="wp_rp_title">ISTQB сертификация</a></li><li data-position="2" data-poid="in-370" data-post-type="none" ><a href="http://poliarush.com/thinking/do-you-really-need-certification.html" class="wp_rp_title">Нужна ли сертификация техническим специалистам?!</a></li><li data-position="3" data-poid="in-473" data-post-type="none" ><a href="http://poliarush.com/everyday/what-is-good-coach.html" class="wp_rp_title">Что такое хороший тренер</a></li><li data-position="4" data-poid="in-715" data-post-type="none" ><a href="http://poliarush.com/working/top-10-outsourcing-companies.html" class="wp_rp_title">Топ 10 аутсорсинговых компаний 2009 года</a></li><li data-position="5" data-poid="in-1023" data-post-type="none" ><a href="http://poliarush.com/working/%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%b2%d0%be%d0%b9-%d0%bc%d0%be%d0%bc%d0%b5%d0%bd%d1%82-%d1%82%d0%b5%d1%81%d1%82%d0%be%d0%b2%d0%be%d0%b9-%d1%81%d1%82%d1%80%d0%b0%d1%82%d0%b5%d0%b3%d0%b8%d0%b8-%d0%b4.html" class="wp_rp_title">Ключевой момент тестовой стратегии &#8220;думай&#8221;</a></li><li data-position="6" data-poid="in-1701" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-test-automaiton-on-sikluli.html" class="wp_rp_title">Вебинар по автоматизации на Sikuli</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/testing/istqb.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Выступил на конференции atdays 2013</title>
		<link>http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-do-robotframework-extention-on-python</link>
		<comments>http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html#comments</comments>
		<pubDate>Sun, 10 Feb 2013 13:45:21 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Работаю]]></category>
		<category><![CDATA[Тренинги]]></category>
		<category><![CDATA[at.info]]></category>
		<category><![CDATA[atdays]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[доклад]]></category>
		<category><![CDATA[ИТ]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1967</guid>
		<description><![CDATA[На этих выходных (09.02.2013) я проводил и выступал на конференции Test Automation Days. За конференцию еще буду писать отдельно, а вот просто хочу поделиться слайдами моего доклада, как быстро расширять robot framework под свои потребности на python. А также можно почитать:Растим начинающих и опытных автоматизаторовТренинг основы автоматизации &#8211; отчет по следующей группе Тренинг по WebDriver [...]]]></description>
				<content:encoded><![CDATA[<p>На этих выходных (09.02.2013) я проводил и выступал на конференции <a href="http://atdays.com">Test Automation Days</a>. За конференцию еще буду писать отдельно, а вот просто хочу поделиться слайдами моего доклада, как быстро расширять <a href="http://poliarush.com/trainings/robotframework">robot framework</a> под свои потребности на <a href="http://poliarush.com/trainings/python">python</a>.</p>
<p style="text-align: center;"><iframe style="border-style: solid; border-color: #cccccc; border-bottom-width: 0px; margin-bottom: 5px;" src="http://www.slideshare.net/slideshow/embed_code/16452253" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="597" height="486"></iframe></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1751" data-post-type="none" ><a href="http://poliarush.com/thinking/test-automation-basics-trainin.html" class="wp_rp_title">Растим начинающих и опытных автоматизаторов</a></li><li data-position="1" data-poid="in-1905" data-post-type="none" ><a href="http://poliarush.com/working/trainings/test-automation-basics-training-comments.html" class="wp_rp_title">Тренинг основы автоматизации &#8211; отчет по следующей группе </a></li><li data-position="2" data-poid="in-1570" data-post-type="none" ><a href="http://poliarush.com/working/kiev-webdriver-training-180802012.html" class="wp_rp_title">Тренинг по WebDriver в Киеве</a></li><li data-position="3" data-poid="in-1800" data-post-type="none" ><a href="http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html" class="wp_rp_title">Python mock: добавление метода реального класса к mock объекту</a></li><li data-position="4" data-poid="in-2147" data-post-type="none" ><a href="http://poliarush.com/working/python-nosetest-stdout-stderr.html" class="wp_rp_title">Разделение stdout и stderr в python nosetest</a></li><li data-position="5" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="6" data-poid="in-1708" data-post-type="none" ><a href="http://poliarush.com/thinking/news-on-test-automation.html" class="wp_rp_title">Почему жаркое лето перешло и жаркую зиму? Конференция, тренинги &#8230;</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тренинг основы автоматизации &#8211; отчет по следующей группе</title>
		<link>http://poliarush.com/working/trainings/test-automation-basics-training-comments.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=test-automation-basics-training-comments</link>
		<comments>http://poliarush.com/working/trainings/test-automation-basics-training-comments.html#comments</comments>
		<pubDate>Fri, 25 Jan 2013 16:57:14 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Тренинги]]></category>
		<category><![CDATA[at.info]]></category>
		<category><![CDATA[заметки]]></category>
		<category><![CDATA[ИТ]]></category>
		<category><![CDATA[ощущения]]></category>
		<category><![CDATA[тренинг]]></category>
		<category><![CDATA[украина]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1905</guid>
		<description><![CDATA[Провел очередной тренинг по основам автоматизации тестирования ПО. Собралась группа 13 человек из разных проектов и с разными навыками. Должен констатировать факт, что все-таки осведомленность специалистов начального и среднего уровня об автоматизации тестирования остается на низком уровне. А ведь в Украине выполняется множество  проектов по автоматизации. Меня посетила мысль, почему так происходит. Автоматизация &#8211; это промежуточное звено перед чем-то [...]]]></description>
				<content:encoded><![CDATA[<p>Провел очередной <a title="Тренинг основы автоматизации тестирования" href="http://poliarush.com/trainings/test-automation-basics" target="_blank">тренинг по основам автоматизации тестирования ПО</a>. Собралась группа 13 человек из разных проектов и с разными навыками. Должен констатировать факт, что все-таки <strong>осведомленность специалистов начального и среднего уровня об автоматизации тестирования остается на низком уровне.</strong> А ведь в Украине выполняется множество  проектов по автоматизации.</p>
<p>Меня посетила мысль, почему так происходит. <strong>Автоматизация &#8211; это промежуточное звено перед чем-то большим.</strong> Очень мало людей остается именно в этой роли. Поэтому специалист по автоматизации тестирования существует в среднем 2-3 года, а потом движется дальше. Соответственно,  этим и объясняется количество людей, занятых в автоматизации. Хотя по истории проведения <a title="Тренинги" href="http://poliarush.com/trainings" target="_blank">своих авторских тренингов</a> должен сказать, что все больше людей интересуется автоматизацией. Потому что методы разработки ПО заставляют команды использовать автоматизацию, хотят они этого или нет. Без этого просто быстро нельзя поставить ПО заказчику. При этом получается определенная пропасть в знаниях между специалистами, которые знают автоматизацию и теми, кто ее не знает.</p>
<p>В общем, это лирика <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <strong>Тренинг прошел успешно. По балам приблизительно 4.6 из 5</strong>. Есть несколько моментов в тренинге, которые я переделаю, а также решил еще добавить немного live coding и живых демонстраций, чтобы тренинг стал более полезным и интересным. <a href="https://picasaweb.google.com/109412184458698562185/TestAutomationBasicsTrainingKiev2425012013" target="_blank">Фотографии</a> прикладываю.</p>
<p><object width="600" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="https://picasaweb.google.com/s/c/bin/slideshow.swf" /><param name="flashvars" value="host=picasaweb.google.com&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F109412184458698562185%2Falbumid%2F5837422253043457617%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><embed width="600" height="400" type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" flashvars="host=picasaweb.google.com&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F109412184458698562185%2Falbumid%2F5837422253043457617%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object><br />
Скоро у меня стартует <a title="Серия тренингов по автоматизации тестирования ПО" href="http://atdays.com/trainings/" target="_blank">марафон тренингов</a>. Группы полностью укомплектованы. Буду учить подрастающее поколение.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1751" data-post-type="none" ><a href="http://poliarush.com/thinking/test-automation-basics-trainin.html" class="wp_rp_title">Растим начинающих и опытных автоматизаторов</a></li><li data-position="1" data-poid="in-1570" data-post-type="none" ><a href="http://poliarush.com/working/kiev-webdriver-training-180802012.html" class="wp_rp_title">Тренинг по WebDriver в Киеве</a></li><li data-position="2" data-poid="in-1708" data-post-type="none" ><a href="http://poliarush.com/thinking/news-on-test-automation.html" class="wp_rp_title">Почему жаркое лето перешло и жаркую зиму? Конференция, тренинги &#8230;</a></li><li data-position="3" data-poid="in-1967" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html" class="wp_rp_title">Выступил на конференции atdays 2013</a></li><li data-position="4" data-poid="in-1396" data-post-type="none" ><a href="http://poliarush.com/working/donetsk-robotframework-training.html" class="wp_rp_title">Визит Донецка и его впечатления</a></li><li data-position="5" data-poid="in-1319" data-post-type="none" ><a href="http://poliarush.com/thinking/minsk-trainings-22062012.html" class="wp_rp_title">Минск, тренинги и впечатления!</a></li><li data-position="6" data-poid="in-1701" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-test-automaiton-on-sikluli.html" class="wp_rp_title">Вебинар по автоматизации на Sikuli</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/trainings/test-automation-basics-training-comments.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вторая встреча клуба iSpeaker Club &#8211; &#8220;Взаимодействие и поведение&#8221;</title>
		<link>http://poliarush.com/working/ispeaker-club/second-meetup.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=second-meetup</link>
		<comments>http://poliarush.com/working/ispeaker-club/second-meetup.html#comments</comments>
		<pubDate>Fri, 18 Jan 2013 08:43:34 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[iSpeaker Club]]></category>
		<category><![CDATA[ispeakerclub]]></category>
		<category><![CDATA[встреча]]></category>
		<category><![CDATA[люди]]></category>
		<category><![CDATA[поведение]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1893</guid>
		<description><![CDATA[Выступать красиво от природы дано не каждому, но это вполне развиваемый навык, которому можно и нужно учиться. А тем более, если Вы хотите расти профессионально и карьерно. Умение хорошо говорить, рассказывать и выступать дает Вам конкурентное преимущество практически по всех сферах нашей жизни. Вчерашний день (17.01.2013) ознаменовался в моей личной истории проведением второй встречи клуба публичных выступлений. [...]]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;">Выступать красиво от природы дано не каждому, но это вполне развиваемый навык, которому можно и нужно учиться. А тем более, если Вы хотите расти профессионально и карьерно. Умение хорошо говорить, рассказывать и выступать дает Вам конкурентное преимущество практически по всех сферах нашей жизни.</p>
<p style="text-align: left;">Вчерашний день (17.01.2013) ознаменовался в моей личной истории проведением <a href="http://www.facebook.com/groups/ispeakerclub/" target="_blank">второй встречи <strong>клуба публичных выступлений</strong></a>. Клуб iSpeaker нацелен именно на практику и развитие навыков публичных выступлений. Нашей главной темой было &#8220;Взаимодействие и поведение&#8221;. В результате встречи мы получили массу эмоций, практики и материалов, которые в основном представлены в нашей <a href="http://www.facebook.com/groups/ispeakerclub/" target="_blank">закрытой группе</a>. Тем не менее, я подготовил <a href="http://www.slideshare.net/poliarush/ispeaker-clubinteractionandbehaviour" target="_blank">небольшую интеллектуальную карту</a>, которой хочу с Вами поделиться.</p>
<p style="text-align: center;"><a href="http://poliarush.com/wp-content/uploads/2013/01/ispeaker-club-interaction-and-behaviour.gif" rel="shadowbox[sbpost-1893];player=img;" target="_blank"><img class="aligncenter  wp-image-1894" title="ispeaker club interaction and behaviour" src="http://poliarush.com/wp-content/uploads/2013/01/ispeaker-club-interaction-and-behaviour.gif" alt="ispeaker club interaction and behaviour" width="100%" /></a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1522" data-post-type="none" ><a href="http://poliarush.com/working/ispeaker-club-intro.html" class="wp_rp_title">iSpeaker Club &#8211; клуб публичных выступлений</a></li><li data-position="1" data-poid="in-1033" data-post-type="none" ><a href="http://poliarush.com/working/managers-meeting-at-22-june.html" class="wp_rp_title">Встреча управляющих людьми в ИТ компаниях &#8211; 22 июня!</a></li><li data-position="2" data-poid="in-746" data-post-type="none" ><a href="http://poliarush.com/everyday/cite.html" class="wp_rp_title">[Книга] Как привлекать удачу и управлять судьбой</a></li><li data-position="3" data-poid="in-966" data-post-type="none" ><a href="http://poliarush.com/everyday/trip-to-orphanage-house.html" class="wp_rp_title">Поездка в денишевский дошкольный детский дом</a></li><li data-position="4" data-poid="in-705" data-post-type="none" ><a href="http://poliarush.com/working/development/agile-manifest.html" class="wp_rp_title">Agile манифест</a></li><li data-position="5" data-poid="in-1319" data-post-type="none" ><a href="http://poliarush.com/thinking/minsk-trainings-22062012.html" class="wp_rp_title">Минск, тренинги и впечатления!</a></li><li data-position="6" data-poid="in-669" data-post-type="none" ><a href="http://poliarush.com/thinking/how-to-be-constructive.html" class="wp_rp_title">Как быть консруктивным в переговорах?</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/ispeaker-club/second-meetup.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ChromeDriver + Python + Browsermob proxy</title>
		<link>http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=chromedriver-python-browsermob-proxy</link>
		<comments>http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html#comments</comments>
		<pubDate>Wed, 05 Dec 2012 11:31:42 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[ИТ]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1819</guid>
		<description><![CDATA[Для бывалых автоматизаторов веб-приложений известно, как важно иметь под руками прокси сервер, с помощью которого можно решить целый ряд вопросов и проблем с веб-автоматизации. NTLM авторизация, блокирование сторонних сайтов не относящихся к тестированию вашего веб-приложения и т.д. В разных случаях работу с прокси решают по разному, какое-то время назад был придуман хороший проект под названием [...]]]></description>
				<content:encoded><![CDATA[<p>Для бывалых автоматизаторов веб-приложений известно, как важно иметь под руками прокси сервер, с помощью которого можно решить целый ряд вопросов и проблем с веб-автоматизации. NTLM авторизация, блокирование сторонних сайтов не относящихся к тестированию вашего веб-приложения и т.д. В разных случаях работу с прокси решают по разному, какое-то время назад был придуман хороший проект под названием <a title="browsermob-proxy" href="http://opensource.webmetrics.com/browsermob-proxy/" target="_blank">Browsermob-proxy</a>, который очень помогает при автоматизации.</p>
<p>David Burns <a title="browsermob-proxy-py" href="https://github.com/automatedtester/browsermob-proxy-py" target="_blank">написал клиент на python для использования прокси с помощью python</a> и даже приложил пример его использования для FirefoxDriver.</p>
<pre class="brush: python; gutter: true; first-line: 1">from browsermobproxy import Server
server = Server("path/to/browsermob-proxy")
server.start()
proxy = server.create_proxy()

from selenium import webdriver
profile  = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("google")
driver.get("http://www.google.co.uk")
proxy.har # returns a HAR JSON blob

server.stop()
driver.quit()</pre>
<p>Но вот для ChromeDriver примера нет, даже если хорошо погуглить. <a href="http://automated-testing.info/forum/kak-poymat-get-zapros#comment-4411" target="_blank">И люди, которые хотят использовать ChromeDriver, не знают</a>, как заставить цепочку <strong>ChromeDriver + Python + Browsermob proxy </strong>работать. Потому, что не знают, как правильно подключать прокси к ChromeDriver.</p>
<p>Заполняю этот пробел c соответствующим примером кода:</p>
<pre class="brush: python; gutter: true; first-line: 1">from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException, 
ElementNotVisibleException
from browsermobproxy import Server
import urlparse

server = Server(r"c:\browsermob\bin\browsermob-proxy.bat")
server.start()
proxy = server.create_proxy()
proxy.new_har()

chrome_options = webdriver.ChromeOptions()
url = urlparse.urlparse(proxy.proxy).path
chrome_options.add_argument('--proxy-server=%s' % url)
driver = webdriver.Chrome(
	executable_path=r"c:\chromedriver.exe", 
	chrome_options=chrome_options)
driver.get("http://google.com.ua/")
driver.find_element_by_id("gbqfsb").click()

print proxy.har

driver.quit()
server.stop()</pre>
<p>Детальных шагов не расписывал. Будут вопросы, пишите!</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1800" data-post-type="none" ><a href="http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html" class="wp_rp_title">Python mock: добавление метода реального класса к mock объекту</a></li><li data-position="1" data-poid="in-2047" data-post-type="none" ><a href="http://poliarush.com/working/development/logging-and-decorators-in-python.html" class="wp_rp_title">Логирование и декораторы в python</a></li><li data-position="2" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="3" data-poid="in-1744" data-post-type="none" ><a href="http://poliarush.com/working/test-automation/how-to-parse-bad-html-with-python.html" class="wp_rp_title">Парсинг неправильного html c помощью стандартных библиотек Python</a></li><li data-position="4" data-poid="in-2147" data-post-type="none" ><a href="http://poliarush.com/working/python-nosetest-stdout-stderr.html" class="wp_rp_title">Разделение stdout и stderr в python nosetest</a></li><li data-position="5" data-poid="in-2220" data-post-type="none" ><a href="http://poliarush.com/working/python-how-to-create-nested-python.html" class="wp_rp_title">[Рецепт] Создание вложенных словарей для тестовых нужд без особых проблем, пример на Python</a></li><li data-position="6" data-poid="in-1967" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html" class="wp_rp_title">Выступил на конференции atdays 2013</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Python mock: добавление метода реального класса к mock объекту</title>
		<link>http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=python-mock-how-add-method-from-real-class-to-mock-object</link>
		<comments>http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html#comments</comments>
		<pubDate>Wed, 21 Nov 2012 21:59:42 +0000</pubDate>
		<dc:creator>Михаил Поляруш</dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Работаю]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[заметки]]></category>
		<category><![CDATA[ИТ]]></category>

		<guid isPermaLink="false">http://poliarush.com/?p=1800</guid>
		<description><![CDATA[Я думаю многим из нас приходилось работать с юнит тестированием, но немногим приходилось работать с разработкой моков.  Для тех кто несильно знаком с этой концепцией могут почитать вводную статью. Так вот, в python есть прекрасная библиотека, которая называется mock. Все было бы хорошо, но к сожалению, у нее нет встроенных средств добавления метода реального класса [...]]]></description>
				<content:encoded><![CDATA[<p>Я думаю многим из нас приходилось работать с юнит тестированием, но немногим приходилось работать с разработкой моков.  Для тех кто несильно знаком с этой концепцией могут почитать вводную <a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank">статью</a>.</p>
<p>Так вот, в <a title="Онлайн курс Python для тестировщика" href="http://poliarush.com/trainings/python" target="_blank">python</a> есть прекрасная библиотека, которая называется <a href="http://www.voidspace.org.uk/python/mock/getting-started.html" target="_blank">mock</a>. Все было бы хорошо, но к сожалению, у нее нет встроенных средств добавления метода реального класса к уже созданному mock экземпляру класса. Зачем это нужно? (Возможно спросите вы)</p>
<p>Например, вы разрабатываете класс и какой-то метод для него. Вам необходимо протестировать только этот метод класса не вызывая остальных. Как это можно сделать? Вот примерно где-то так:</p>
<pre class="brush: python; gutter: true; first-line: 1">from mock import Mock
import new

class RealClass(object):
	def other_method(self):
		self.attribute_initiated_earlier = "class value"
	
	def real_method(self):
		return [self.attribute_initiated_earlier, 'password']

fake_object = Mock(spec=RealClass())
class_method = object.__getattribute__(RealClass, 'real_method')
fake_object.real_method = new.instancemethod(class_method, fake_object, Mock)
fake_object.attribute_initiated_earlier = "new value"
print fake_object.real_method()</pre>
<p><span id="more-1800"></span><br />
Если вам требуется более детальное описание и так упрощенного кода <img src='http://poliarush.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , пишите комментарии!</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><h3 class="related_post_title">А также можно почитать:</h3><ul class="related_post wp_rp" style="visibility: visible"><li data-position="0" data-poid="in-1725" data-post-type="none" ><a href="http://poliarush.com/working/how-to-deal-with-parametrize-python-docstring.html" class="wp_rp_title">Как параметризировать docstrings в Python?</a></li><li data-position="1" data-poid="in-1819" data-post-type="none" ><a href="http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html" class="wp_rp_title">ChromeDriver + Python + Browsermob proxy</a></li><li data-position="2" data-poid="in-2047" data-post-type="none" ><a href="http://poliarush.com/working/development/logging-and-decorators-in-python.html" class="wp_rp_title">Логирование и декораторы в python</a></li><li data-position="3" data-poid="in-2147" data-post-type="none" ><a href="http://poliarush.com/working/python-nosetest-stdout-stderr.html" class="wp_rp_title">Разделение stdout и stderr в python nosetest</a></li><li data-position="4" data-poid="in-1744" data-post-type="none" ><a href="http://poliarush.com/working/test-automation/how-to-parse-bad-html-with-python.html" class="wp_rp_title">Парсинг неправильного html c помощью стандартных библиотек Python</a></li><li data-position="5" data-poid="in-2220" data-post-type="none" ><a href="http://poliarush.com/working/python-how-to-create-nested-python.html" class="wp_rp_title">[Рецепт] Создание вложенных словарей для тестовых нужд без особых проблем, пример на Python</a></li><li data-position="6" data-poid="in-1967" data-post-type="none" ><a href="http://poliarush.com/working/how-to-do-robotframework-extention-on-python.html" class="wp_rp_title">Выступил на конференции atdays 2013</a></li></ul></div></div>
]]></content:encoded>
			<wfw:commentRss>http://poliarush.com/working/python-mock-how-add-method-from-real-class-to-mock-object.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
