<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-CH">
	<id>https://giswiki.ch/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mrueegg</id>
	<title>Geometa Lab OST - Benutzerbeiträge [de-ch]</title>
	<link rel="self" type="application/atom+xml" href="https://giswiki.ch/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mrueegg"/>
	<link rel="alternate" type="text/html" href="https://giswiki.ch/Spezial:Beitr%C3%A4ge/Mrueegg"/>
	<updated>2026-05-10T08:25:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41382</id>
		<title>Diskussion:Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41382"/>
		<updated>2012-09-13T12:25:35Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1a ====&lt;br /&gt;
&lt;br /&gt;
 curl -G -s --data-urlencode &amp;quot;q=Oberseestrasse 10 8640 Rapperswil&amp;quot; &amp;quot;http://nominatim.openstreetmap.org/search?format=json&amp;amp;addressdetails=1&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1b ====&lt;br /&gt;
&lt;br /&gt;
 curl -s &amp;quot;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 Web-Service Ansprechen mit Python ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
address_query = { &#039;q&#039;: &#039;Oberseestrasse 10 8640 Rapperswil&#039; }&lt;br /&gt;
encoded_address = urllib.urlencode(address_query)&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/search?format=json&amp;amp;&#039; + encoded_address&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)[0]&lt;br /&gt;
lat, lon = nominatim[&#039;lat&#039;], nominatim[&#039;lon&#039;]&lt;br /&gt;
print &#039;%s, %s&#039; % (lat, lon)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Reverse Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&#039;&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)&lt;br /&gt;
print nominatim[&#039;display_name&#039;]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41381</id>
		<title>Diskussion:Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41381"/>
		<updated>2012-09-13T06:03:23Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1a ====&lt;br /&gt;
&lt;br /&gt;
 curl -G -s --data-urlencode &amp;quot;q=Oberseestrasse 10 8640 Rapperswil&amp;quot; &amp;quot;http://nominatim.openstreetmap.org/search?format=json&amp;amp;addressdetails=1&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1b ====&lt;br /&gt;
&lt;br /&gt;
 curl -s &amp;quot;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 Web-Service Ansprechen mit Python ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
address_query = { &#039;q&#039;: &#039;Oberseestrasse 10 8640 Rapperswil&#039; }&lt;br /&gt;
encoded_address = urllib.urlencode(address_query)&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/search?format=json&amp;amp;&#039; + encoded_address&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)[0]&lt;br /&gt;
lat, lon = nomatim[&#039;lat&#039;], nomatim[&#039;lon&#039;]&lt;br /&gt;
print &#039;%s, %s&#039; % (lat, lon)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Reverse Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&#039;&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)&lt;br /&gt;
print nominatim[&#039;display_name&#039;]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41380</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41380"/>
		<updated>2012-09-13T05:36:08Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;, hier bei Python [http://docs.python.org/library/unittest.html unittest]). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;&#039;@&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
 @raises(ValueError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41379</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41379"/>
		<updated>2012-09-13T05:26:32Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;, hier bei Python [http://docs.python.org/library/unittest.html unittest]). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;&#039;@&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41378</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41378"/>
		<updated>2012-09-13T05:25:17Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;, hier bei Python [unittest http://docs.python.org/library/unittest.html]). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;&#039;@&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41377</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41377"/>
		<updated>2012-09-13T04:32:49Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;&#039;@&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41373</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41373"/>
		<updated>2012-09-12T14:21:22Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;&#039;@&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41372</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41372"/>
		<updated>2012-09-12T14:20:30Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &#039;&#039;test&#039;&#039; oder &#039;&#039;Test&#039;&#039; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &#039;&#039;((?:^|[b_.-])[Tt]est)&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;&#039;Fixtures&#039;&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41371</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41371"/>
		<updated>2012-09-12T14:19:45Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; für verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &amp;quot;test_&amp;quot; oder &amp;quot;Test_&amp;quot; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &amp;quot;((?:^|[b_.-])[Tt]est)&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;Fixtures&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41370</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41370"/>
		<updated>2012-09-12T14:17:31Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; f¨r verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &amp;quot;test_&amp;quot; oder &amp;quot;Test_&amp;quot; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &amp;quot;((?:^|[b_.-])[Tt]est)&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;Fixtures&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational(object):&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41369</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41369"/>
		<updated>2012-09-12T13:55:11Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen: Python &amp;amp; Nose (Python Library) installiert.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; f¨r verbose (en. für &amp;quot;gesprächig&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention (Abmachung), wobei verlangt wird, dass der Filename mit &amp;quot;test_&amp;quot; oder &amp;quot;Test_&amp;quot; beginnen muss (die exakte Definition ist eine Regular Expression  und sieht so aus: &amp;quot;((?:^|[b_.-])[Tt]est)&amp;quot; ).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests &#039;Fixtures&#039;. Diese können Sie wie folgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss Unit Testing Konvention &#039;xUnit&#039;). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration (siehe die Zeile mit &#039;@&#039;):&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
        &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self.__eq__(other)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41368</id>
		<title>Diskussion:Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41368"/>
		<updated>2012-09-12T13:54:42Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Aufgabe 1 ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from src.bank import BankAccount&lt;br /&gt;
from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test_deposit_on_empty_account():&lt;br /&gt;
    b = BankAccount()&lt;br /&gt;
    b.deposit(100)&lt;br /&gt;
    assert b.balance == 100&lt;br /&gt;
    &lt;br /&gt;
def test_deposit_with_initial_balance():&lt;br /&gt;
    b = BankAccount(10)&lt;br /&gt;
    b.deposit(100)&lt;br /&gt;
    assert b.balance == 110&lt;br /&gt;
&lt;br /&gt;
@raises(ValueError)&lt;br /&gt;
def test_withdraw_with_too_high_amount():&lt;br /&gt;
    b = BankAccount(10)&lt;br /&gt;
    b.withdraw(100)&lt;br /&gt;
&lt;br /&gt;
def test_withdraw_ok():&lt;br /&gt;
    b = BankAccount(110)&lt;br /&gt;
    b.withdraw(100)&lt;br /&gt;
    assert b.balance == 10&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from src.rational import *&lt;br /&gt;
from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def test_gcd():&lt;br /&gt;
    assert gcd(4, 4) == 4&lt;br /&gt;
    assert gcd(4, 2) == 2&lt;br /&gt;
    assert gcd(3, 6) == 3&lt;br /&gt;
    assert gcd(12, 9) == 3&lt;br /&gt;
    &lt;br /&gt;
@raises(ValueError)&lt;br /&gt;
def test_zero_denominator_raises_error():&lt;br /&gt;
    Rational(3, 0)&lt;br /&gt;
    &lt;br /&gt;
def test_add():&lt;br /&gt;
    r1 = Rational(7, 3)&lt;br /&gt;
    r2 = Rational(6, 3)&lt;br /&gt;
    assert Rational(13, 3) == r1 + r2&lt;br /&gt;
&lt;br /&gt;
def test_sub():&lt;br /&gt;
    r1 = Rational(12, 3)&lt;br /&gt;
    r2 = Rational(6, 3)&lt;br /&gt;
    assert Rational(2, 1) == r1 - r2&lt;br /&gt;
    &lt;br /&gt;
def test_mul():&lt;br /&gt;
    r1 = Rational(2, 3)&lt;br /&gt;
    r2 = Rational(4, 3)&lt;br /&gt;
    assert Rational(8, 9) == r1 * r2&lt;br /&gt;
    &lt;br /&gt;
def test_div():&lt;br /&gt;
    r1 = Rational(2, 3)&lt;br /&gt;
    r2 = Rational(4, 3)&lt;br /&gt;
    assert Rational(1, 2) == r1 / r2&lt;br /&gt;
&lt;br /&gt;
def test_str():&lt;br /&gt;
    assert &amp;quot;2/3&amp;quot; == str(Rational(2, 3))&lt;br /&gt;
    &lt;br /&gt;
def test_eq():&lt;br /&gt;
    r = Rational(2, 3)&lt;br /&gt;
    assert r == r&lt;br /&gt;
    assert Rational(4, 6) == r&lt;br /&gt;
    &lt;br /&gt;
def test_neq():&lt;br /&gt;
    assert Rational(3, 4) != Rational(2, 3)&lt;br /&gt;
&lt;br /&gt;
def test_float():&lt;br /&gt;
    assert 0.75 == float(Rational(3, 4))&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41367</id>
		<title>Diskussion:Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41367"/>
		<updated>2012-09-12T13:45:25Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: Die Seite wurde neu angelegt: „=== Aufgabe 1 ===   &amp;lt;nowiki&amp;gt; from src.bank import BankAccount from nose.tools import raises   def test_deposit_on_empty_account():     b = BankAccount()     b.dep…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Aufgabe 1 ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from src.bank import BankAccount&lt;br /&gt;
from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test_deposit_on_empty_account():&lt;br /&gt;
    b = BankAccount()&lt;br /&gt;
    b.deposit(100)&lt;br /&gt;
    assert b.balance == 100&lt;br /&gt;
    &lt;br /&gt;
def test_deposit_with_initial_balance():&lt;br /&gt;
    b = BankAccount(10)&lt;br /&gt;
    b.deposit(100)&lt;br /&gt;
    assert b.balance == 110&lt;br /&gt;
&lt;br /&gt;
@raises(ValueError)&lt;br /&gt;
def test_withdraw_with_too_high_amount():&lt;br /&gt;
    b = BankAccount(10)&lt;br /&gt;
    b.withdraw(100)&lt;br /&gt;
&lt;br /&gt;
def test_withdraw_ok():&lt;br /&gt;
    b = BankAccount(110)&lt;br /&gt;
    b.withdraw(100)&lt;br /&gt;
    assert b.balance == 10&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from src.rational import *&lt;br /&gt;
from nose.tools import raises&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def test_gcd():&lt;br /&gt;
    assert gcd(4, 4) == 4&lt;br /&gt;
    assert gcd(4, 2) == 2&lt;br /&gt;
    assert gcd(3, 6) == 3&lt;br /&gt;
    assert gcd(12, 9) == 3&lt;br /&gt;
    &lt;br /&gt;
@raises(ValueError)&lt;br /&gt;
def test_zero_denominator_raises_error():&lt;br /&gt;
    Rational(3, 0)&lt;br /&gt;
    &lt;br /&gt;
def test_add():&lt;br /&gt;
    r1 = Rational(7, 3)&lt;br /&gt;
    r2 = Rational(6, 3)&lt;br /&gt;
    assert Rational(13, 3) == r1 + r2&lt;br /&gt;
&lt;br /&gt;
def test_sub():&lt;br /&gt;
    r1 = Rational(12, 3)&lt;br /&gt;
    r2 = Rational(6, 3)&lt;br /&gt;
    assert Rational(2, 1) == r1 - r2&lt;br /&gt;
    &lt;br /&gt;
def test_mul():&lt;br /&gt;
    r1 = Rational(2, 3)&lt;br /&gt;
    r2 = Rational(4, 3)&lt;br /&gt;
    assert Rational(8, 9) == r1 * r2&lt;br /&gt;
    &lt;br /&gt;
def test_div():&lt;br /&gt;
    r1 = Rational(2, 3)&lt;br /&gt;
    r2 = Rational(4, 3)&lt;br /&gt;
    assert Rational(1, 2) == r1 / r2&lt;br /&gt;
&lt;br /&gt;
def test_str():&lt;br /&gt;
    assert &amp;quot;2/3&amp;quot; == str(Rational(2, 3))&lt;br /&gt;
    &lt;br /&gt;
def test_eq():&lt;br /&gt;
    assert Rational(2, 3) == Rational(2, 3)&lt;br /&gt;
    assert Rational(2, 3) != Rational(1, 3)&lt;br /&gt;
    &lt;br /&gt;
def test_float():&lt;br /&gt;
    assert 0.75 == float(Rational(3, 4))&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/WebServicesMitPython&amp;diff=41364</id>
		<title>Diskussion:Kurs Python richtig lernen/WebServicesMitPython</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/WebServicesMitPython&amp;diff=41364"/>
		<updated>2012-09-12T13:38:31Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: hat „Diskussion:Kurs Python richtig lernen/WebServicesMitPython“ nach „Diskussion:Kurs Python richtig lernen/Webservices“ verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Diskussion:Kurs Python richtig lernen/Webservices]]&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41363</id>
		<title>Diskussion:Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41363"/>
		<updated>2012-09-12T13:38:31Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: hat „Diskussion:Kurs Python richtig lernen/WebServicesMitPython“ nach „Diskussion:Kurs Python richtig lernen/Webservices“ verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 ====&lt;br /&gt;
&lt;br /&gt;
 curl -G -s --data-urlencode &amp;quot;q=Oberseestrasse 10 8640 Rapperswil&amp;quot; &amp;quot;http://nominatim.openstreetmap.org/search?format=json&amp;amp;addressdetails=1&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 ====&lt;br /&gt;
&lt;br /&gt;
 curl -s &amp;quot;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 3 Web-Service Ansprechen mit Python ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
address_query = { &#039;q&#039;: &#039;Oberseestrasse 10 8640 Rapperswil&#039; }&lt;br /&gt;
encoded_address = urllib.urlencode(address_query)&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/search?format=json&amp;amp;&#039; + encoded_address&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)[0]&lt;br /&gt;
lat, lon = nomatim[&#039;lat&#039;], nomatim[&#039;lon&#039;]&lt;br /&gt;
print &#039;%s, %s&#039; % (lat, lon)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Reverse Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&#039;&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)&lt;br /&gt;
print nominatim[&#039;display_name&#039;]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/WebServicesMitPython&amp;diff=41362</id>
		<title>Kurs Python richtig lernen/WebServicesMitPython</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/WebServicesMitPython&amp;diff=41362"/>
		<updated>2012-09-12T13:38:30Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: hat „Kurs Python richtig lernen/WebServicesMitPython“ nach „Kurs Python richtig lernen/Webservices“ verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Kurs Python richtig lernen/Webservices]]&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41361</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41361"/>
		<updated>2012-09-12T13:38:30Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: hat „Kurs Python richtig lernen/WebServicesMitPython“ nach „Kurs Python richtig lernen/Webservices“ verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nominatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul [http://docs.python.org/library/json.html json]. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
 curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 1&#039;&#039;: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 2&#039;&#039;: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen mit Hilfe des Parameters &#039;&#039;--data-urlencode&#039;&#039; dies zu übernehmen. Beispiel (Verwendung von &#039;&#039;-G&#039;&#039; für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
 curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
&lt;br /&gt;
cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nominatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 ====&lt;br /&gt;
Finden Sie mit cURL und Nominatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 ====&lt;br /&gt;
Nehmen Sie den gefundenen Längen- und Breitengrad und überprüfen Sie mit cURL, ob Nominatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 3 ====&lt;br /&gt;
Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41360</id>
		<title>Diskussion:Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Diskussion:Kurs_Python_richtig_lernen/Webservices&amp;diff=41360"/>
		<updated>2012-09-12T13:36:29Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: Die Seite wurde neu angelegt: „=== Web-Service Kennenlernen mit cURL ===  ==== Aufgabe 1 ====   curl -G -s --data-urlencode &amp;quot;q=Oberseestrasse 10 8640 Rapperswil&amp;quot; &amp;quot;http://nominatim.openstreetmap…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 ====&lt;br /&gt;
&lt;br /&gt;
 curl -G -s --data-urlencode &amp;quot;q=Oberseestrasse 10 8640 Rapperswil&amp;quot; &amp;quot;http://nominatim.openstreetmap.org/search?format=json&amp;amp;addressdetails=1&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 ====&lt;br /&gt;
&lt;br /&gt;
 curl -s &amp;quot;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&amp;quot; | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 3 Web-Service Ansprechen mit Python ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
address_query = { &#039;q&#039;: &#039;Oberseestrasse 10 8640 Rapperswil&#039; }&lt;br /&gt;
encoded_address = urllib.urlencode(address_query)&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/search?format=json&amp;amp;&#039; + encoded_address&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)[0]&lt;br /&gt;
lat, lon = nomatim[&#039;lat&#039;], nomatim[&#039;lon&#039;]&lt;br /&gt;
print &#039;%s, %s&#039; % (lat, lon)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Reverse Geocoding&lt;br /&gt;
import urllib&lt;br /&gt;
import simplejson as json&lt;br /&gt;
&lt;br /&gt;
url = &#039;http://nominatim.openstreetmap.org/reverse?format=json&amp;amp;lat=47.2241094&amp;amp;lon=8.8207634&amp;amp;zoom=18&#039;&lt;br /&gt;
connection = urllib.urlopen(url)&lt;br /&gt;
content = connection.read()&lt;br /&gt;
nominatim = json.loads(content)&lt;br /&gt;
print nominatim[&#039;display_name&#039;]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41354</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41354"/>
		<updated>2012-09-12T13:07:34Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 1 - Bank Account ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufgabe 2 - Rationale Zahlen ===&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41353</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41353"/>
		<updated>2012-09-12T13:04:14Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41352</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41352"/>
		<updated>2012-09-12T13:03:55Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41351</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41351"/>
		<updated>2012-09-12T13:03:44Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test42:&lt;br /&gt;
    def setUp(self): &lt;br /&gt;
        print &amp;quot;Setup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
        print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def test_life_the_universe_and_everything(self):&lt;br /&gt;
        assert 42 != 42&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41349</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41349"/>
		<updated>2012-09-12T13:02:26Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infos (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41347</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41347"/>
		<updated>2012-09-12T13:02:02Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu Nose finden Sie [http://nose.readthedocs.org/en/latest/testing.html hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41346</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41346"/>
		<updated>2012-09-12T13:00:06Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: /* Aufgabe 2 - Rationale Zahlen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41345</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41345"/>
		<updated>2012-09-12T12:54:06Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
  &lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41344</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41344"/>
		<updated>2012-09-12T12:53:47Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance &lt;br /&gt;
     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
 &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
 &lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
 &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
        &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
    &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41343</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41343"/>
		<updated>2012-09-12T12:51:44Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 &lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41342</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41342"/>
		<updated>2012-09-12T12:51:22Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
class Rational:&lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41341</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41341"/>
		<updated>2012-09-12T12:50:57Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    if b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
class Rational:&lt;br /&gt;
    &lt;br /&gt;
    def __init__(self, n, d):&lt;br /&gt;
        if d == 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Denominator must not be zero.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            g = gcd (n, d)&lt;br /&gt;
            self.n = n / g&lt;br /&gt;
            self.d = d / g&lt;br /&gt;
           &lt;br /&gt;
    def __add__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d + other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __sub__(self, other):&lt;br /&gt;
        return Rational(self.n * other.d - other.n * self.d,&lt;br /&gt;
                        self.d * other.d)&lt;br /&gt;
       &lt;br /&gt;
    def __mul__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.n, self.d * other.d)&lt;br /&gt;
   &lt;br /&gt;
    def __div__(self, other):&lt;br /&gt;
        return  Rational(self.n * other.d, self.d * other.n)&lt;br /&gt;
   &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % (self.n, self.d)&lt;br /&gt;
   &lt;br /&gt;
    def __float__(self):&lt;br /&gt;
        return  float(self.n) / float(self.d)&lt;br /&gt;
    &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        if self is other:&lt;br /&gt;
            return True&lt;br /&gt;
        elif type(self) != type(other):&lt;br /&gt;
            return False&lt;br /&gt;
        else:&lt;br /&gt;
            return self.n == other.n and self.d == other.d&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41340</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41340"/>
		<updated>2012-09-12T12:21:42Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance     &lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount      &lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
         if amount &amp;gt; self.balance:&lt;br /&gt;
             raise ValueError(&#039;Amount is higher than current balance&#039;)&lt;br /&gt;
         self.balance -= amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
 def gcd ( a, b ):&lt;br /&gt;
    if  b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
 class Rational:&lt;br /&gt;
     def __init__ ( self, a, b ):&lt;br /&gt;
        if  b == 0:&lt;br /&gt;
            raise ZeroDivisionError, ( &amp;quot;Denominator of a rational &amp;quot;&lt;br /&gt;
                &amp;quot;may not be zero.&amp;quot; )&lt;br /&gt;
        else:&lt;br /&gt;
            g  =  gcd ( a, b )&lt;br /&gt;
            self.n  =  a / g&lt;br /&gt;
            self.d  =  b / g&lt;br /&gt;
    def __add__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d + other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __sub__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d - other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __mul__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.n, self.d * other.d )&lt;br /&gt;
    def __div__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.d, self.d * other.n )&lt;br /&gt;
    def __str__ ( self ):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % ( self.n, self.d )&lt;br /&gt;
    def __float__ ( self ):&lt;br /&gt;
        return  float ( self.n ) / float ( self.d )&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41339</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41339"/>
		<updated>2012-09-12T12:19:19Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 from nose.tools import raises&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance&lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount&lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
        if amount &amp;gt; self.balance:&lt;br /&gt;
            raise ValueError&lt;br /&gt;
        self.balance -= amount&lt;br /&gt;
     def is_overdrawn(self):&lt;br /&gt;
         return self.balance &amp;lt; 0&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
 def gcd ( a, b ):&lt;br /&gt;
    if  b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
 class Rational:&lt;br /&gt;
     def __init__ ( self, a, b ):&lt;br /&gt;
        if  b == 0:&lt;br /&gt;
            raise ZeroDivisionError, ( &amp;quot;Denominator of a rational &amp;quot;&lt;br /&gt;
                &amp;quot;may not be zero.&amp;quot; )&lt;br /&gt;
        else:&lt;br /&gt;
            g  =  gcd ( a, b )&lt;br /&gt;
            self.n  =  a / g&lt;br /&gt;
            self.d  =  b / g&lt;br /&gt;
    def __add__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d + other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __sub__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d - other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __mul__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.n, self.d * other.d )&lt;br /&gt;
    def __div__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.d, self.d * other.n )&lt;br /&gt;
    def __str__ ( self ):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % ( self.n, self.d )&lt;br /&gt;
    def __float__ ( self ):&lt;br /&gt;
        return  float ( self.n ) / float ( self.d )&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41338</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41338"/>
		<updated>2012-09-12T12:03:37Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Wie Sie sehen, müssen wir nirgends angeben, welche Funktionen und Module Nose als Testfunktionen betrachtet. Für Funktionen und Module gibt es eine einfache Namenskonvention, die durch folgende regular expression beschrieben ist: ((?:^|[b_.-])[Tt]est)&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
Um das Werfen von Exceptions testen zu können, benutzen Sie folgende Nose Decoration:&lt;br /&gt;
&lt;br /&gt;
 @raises(ZeroDivisionError)&lt;br /&gt;
 def test_rational_zero_denominator_raises_error():&lt;br /&gt;
     r = Rational(3, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 - Bank Account ====&lt;br /&gt;
Testen Sie folgenden Code mit Nose (denken Sie auch an das Testen von Exceptions):&lt;br /&gt;
&lt;br /&gt;
 class BankAccount(object):&lt;br /&gt;
     def __init__(self, initial_balance=0):&lt;br /&gt;
         self.balance = initial_balance&lt;br /&gt;
     def deposit(self, amount):&lt;br /&gt;
         self.balance += amount&lt;br /&gt;
     def withdraw(self, amount):&lt;br /&gt;
        if amount &amp;gt; self.balance:&lt;br /&gt;
            raise ValueError&lt;br /&gt;
        self.balance -= amount&lt;br /&gt;
     def is_overdrawn(self):&lt;br /&gt;
         return self.balance &amp;lt; 0&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 - Rationale Zahlen ====&lt;br /&gt;
 def gcd ( a, b ):&lt;br /&gt;
    if  b == 0:&lt;br /&gt;
        return a&lt;br /&gt;
    else:&lt;br /&gt;
        return gcd(b, a % b)&lt;br /&gt;
&lt;br /&gt;
 class Rational:&lt;br /&gt;
     def __init__ ( self, a, b ):&lt;br /&gt;
        if  b == 0:&lt;br /&gt;
            raise ZeroDivisionError, ( &amp;quot;Denominator of a rational &amp;quot;&lt;br /&gt;
                &amp;quot;may not be zero.&amp;quot; )&lt;br /&gt;
        else:&lt;br /&gt;
            g  =  gcd ( a, b )&lt;br /&gt;
            self.n  =  a / g&lt;br /&gt;
            self.d  =  b / g&lt;br /&gt;
    def __add__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d + other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __sub__ ( self, other ):&lt;br /&gt;
        return Rational ( self.n * other.d - other.n * self.d,&lt;br /&gt;
                          self.d * other.d )&lt;br /&gt;
    def __mul__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.n, self.d * other.d )&lt;br /&gt;
    def __div__ ( self, other ):&lt;br /&gt;
        return  Rational ( self.n * other.d, self.d * other.n )&lt;br /&gt;
    def __str__ ( self ):&lt;br /&gt;
        return &amp;quot;%d/%d&amp;quot; % ( self.n, self.d )&lt;br /&gt;
    def __float__ ( self ):&lt;br /&gt;
        return  float ( self.n ) / float ( self.d )&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41337</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41337"/>
		<updated>2012-09-12T11:42:54Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;br /&gt;
&lt;br /&gt;
((?:^|[b_.-])[Tt]est)&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41336</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41336"/>
		<updated>2012-09-12T11:16:25Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
 def setUp(): &lt;br /&gt;
     print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): &lt;br /&gt;
     print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41335</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41335"/>
		<updated>2012-09-12T11:15:51Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
 def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     def tearDown(self):&lt;br /&gt;
         print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41334</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41334"/>
		<updated>2012-09-12T11:14:46Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nominatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul [http://docs.python.org/library/json.html json]. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
 curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 1&#039;&#039;: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 2&#039;&#039;: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen mit Hilfe des Parameters &#039;&#039;--data-urlencode&#039;&#039; dies zu übernehmen. Beispiel (Verwendung von &#039;&#039;-G&#039;&#039; für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
 curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
&lt;br /&gt;
cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e.&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nominatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 ====&lt;br /&gt;
Finden Sie mit cURL und Nominatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 ====&lt;br /&gt;
Nehmen Sie den gefundenen Längen- und Breitengrad und überprüfen Sie mit cURL, ob Nominatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 3 ====&lt;br /&gt;
Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41333</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41333"/>
		<updated>2012-09-12T11:14:06Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose).&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
 def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
     def tearDown(self): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip&#039;&#039;: Wundern Sie sich nicht, wenn Sie Ausgaben in Ihren Unit Tests mit &#039;&#039;print&#039;&#039; nicht auf Ihrer Konsole sehen. Nose fängt alle Ausgaben auf &#039;&#039;stdout&#039;&#039; auf und zeigt diese nur bei fehlgeschlagenen Tests an. Dieses Verhalten kann mit der Option &#039;&#039;-s&#039;&#039; unterbunden werden.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41332</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41332"/>
		<updated>2012-09-12T11:07:31Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
 $ nosetests&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
 def test_life_the_universe_and_everything():&lt;br /&gt;
     assert 42 != 42&lt;br /&gt;
&lt;br /&gt;
 def setUp(): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
 def tearDown(): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 test_life_the_universe_and_everything.setUp = setUp&lt;br /&gt;
 test_life_the_universe_and_everything.tearDown = tearDown&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen (setup, failing test, teardown).&lt;br /&gt;
&lt;br /&gt;
Nose erlaubt es Ihnen - neben Testfunktionen - Ihre Tests auch innerhalb einer Klasse zu schreiben (gemäss xUnit). Das gleiche Beispiel wie vorhin:&lt;br /&gt;
&lt;br /&gt;
 class Test42:&lt;br /&gt;
     def setUp(self): print &amp;quot;Setup&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
     def tearDown(self): print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
     def test_life_the_universe_and_everything(self):&lt;br /&gt;
         assert 42 != 42&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41331</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41331"/>
		<updated>2012-09-12T10:47:47Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 == 42&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
$ nosetests&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 == 42&lt;br /&gt;
test_life_the_universe_and_everything.setUp = lambda: print &amp;quot;setUp&amp;quot;&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = lambda: print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41330</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41330"/>
		<updated>2012-09-12T10:47:33Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Unit Testing mit Python und Nose&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie Unit Testing mit dem Python Test Runner Nose.&lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;2h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Einstieg ===&lt;br /&gt;
&lt;br /&gt;
Um Nose kennenzulernen starten wir mit einem Beispiel. Speichern Sie den folgenden Unit test in einem File &amp;quot;test_42.py&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 == 42&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie diesen Test wiefolgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
$ nosetests&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Output bekommen Sie eine kleine Statistik inkl. dem Fehlerstatus (OK/NOK). Möchten Sie detailliertere Infors (welche Tests durchgeführt wurden), dann verwenden Sie die Option &#039;&#039;-v&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Manchmal benötigen Sie für Ihre Unit Tests Fixtures. Diese können Sie wiefolgt definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def test_life_the_universe_and_everything():&lt;br /&gt;
    assert 42 == 42&lt;br /&gt;
&lt;br /&gt;
test_life_the_universe_and_everything.setUp = lambda: print &amp;quot;setUp&amp;quot;&lt;br /&gt;
test_life_the_universe_and_everything.tearDown = lambda: print &amp;quot;tearDown&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Führen Sie dieses Beispiel aus und verifizieren Sie, dass die Ausgaben Ihren Erwartungen entsprechen.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41329</id>
		<title>Kurs Python richtig lernen/Unit Testing</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Unit_Testing&amp;diff=41329"/>
		<updated>2012-09-12T10:14:39Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: Die Seite wurde neu angelegt: „=== Unit Testing mit Python ===“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Unit Testing mit Python ===&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41328</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41328"/>
		<updated>2012-09-12T09:55:27Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nominatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul [http://docs.python.org/library/json.html json]. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 1&#039;&#039;: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 2&#039;&#039;: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen mit Hilfe des Parameters &#039;&#039;--data-urlencode&#039;&#039; dies zu übernehmen. Beispiel (Verwendung von &#039;&#039;-G&#039;&#039; für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nominatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 1 ====&lt;br /&gt;
Finden Sie mit cURL und Nominatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 2 ====&lt;br /&gt;
Nehmen Sie den gefundenen Längen- und Breitengrad und überprüfen Sie mit cURL, ob Nominatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe 3 ====&lt;br /&gt;
Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41327</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41327"/>
		<updated>2012-09-12T09:45:12Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nominatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul [http://docs.python.org/library/json.html json]. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 1&#039;&#039;: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip 2&#039;&#039;: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen mit Hilfe des Parameters &#039;&#039;--data-urlencode&#039;&#039; dies zu übernehmen. Beispiel (Verwendung von &#039;&#039;-G&#039;&#039; für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nominatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nominatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den gefundenen Längen- und Breitengrad und überprüfen Sie mit cURL, ob Nominatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41326</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41326"/>
		<updated>2012-09-12T09:40:58Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nominatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
# cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing [http://docs.python.org/library/json.html json].&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41325</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41325"/>
		<updated>2012-09-12T09:40:40Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nomatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
# cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing [http://docs.python.org/library/json.html json].&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41324</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41324"/>
		<updated>2012-09-12T09:40:16Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nominatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier, um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nomatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
# cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing [http://docs.python.org/library/json.html json].&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41323</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41323"/>
		<updated>2012-09-12T09:39:52Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nomatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier, um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nomatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
# cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python  ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in der vorherigen Aufgabe durch, nun aber mit Python. Verwenden Sie das Python Modul [[urllib]] um einen Request an den Web Service zu machen und [http://docs.python.org/library/json.html json] für das JSON Parsing [http://docs.python.org/library/json.html json].&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41322</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41322"/>
		<updated>2012-09-12T08:57:44Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nomatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier, um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nomatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
# cURL macht daraus dann einen GET Request an http://hsr.ch/pythonrichtiglernen/?key=v%20a%20l%20u%20e&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Ansprechen mit Python ===&lt;br /&gt;
# Führen Sie die gleichen beiden Anfragen (Geocoding und Reverse Geocoding) wie in Aufgabe 1 mit Python durch.&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
	<entry>
		<id>https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41321</id>
		<title>Kurs Python richtig lernen/Webservices</title>
		<link rel="alternate" type="text/html" href="https://giswiki.ch/index.php?title=Kurs_Python_richtig_lernen/Webservices&amp;diff=41321"/>
		<updated>2012-09-12T08:31:48Z</updated>

		<summary type="html">&lt;p&gt;Mrueegg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übung &amp;quot;Web Services mit Python&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung lernen Sie die Verwendung von Web Services mit Python kennen. Wir verwenden dazu [http://wiki.openstreetmap.org/wiki/Nominatim Nomatim], einen Web service zur Geokodierung von OSM-Daten (Open Streetmap). &lt;br /&gt;
&lt;br /&gt;
Geschätzter Zeitaufwand für diese Übung: ca. &#039;&#039;&#039;1h&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Web-Service Kennenlernen mit cURL ===&lt;br /&gt;
&lt;br /&gt;
==== Einführung ====&lt;br /&gt;
cURL ist ein Werkzeug, mit dem Daten über eine Internetadresse herunter-/ und hochgeladen werden können. Es unterstützt zahlreiche Internetprotokolle wie HTTP, FTP, LDAP etc. Wir verwenden es hier, um uns ohne Programmieraufwand mit der Funktionsweise des Web Services bekannt zu machen. Als Dokumentation dient die [http://curl.haxx.se/docs/manpage.html Manpage von cURL]. &lt;br /&gt;
&lt;br /&gt;
Da wir in dieser Übung den Web Service mit JSON als Datenformat verwenden (Nomatim unterstützt auch HTML und XML) und dieses auf der Konsole ansprechend formatiert haben möchten, verwenden wir als pretty printer das JSON Python Modul. Hier ein Beispiel wie dieses verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl [options] [URL...] | python -mjson.tool&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tip 1: Verwenden Sie die Option &#039;&#039;-v&#039;&#039; (verbose), um genau zu sehen, wie der Request an den Web Service aussieht. Das hielt beim Debugging enorm.&lt;br /&gt;
Tip 2: Da das manuelle Erzeugen des URL encoded query strings an den Web Service URL etwas mühsam ist, können Sie cURL anweisen dies zu übernehmen mit Hilfe des Parameters &amp;quot;--data-urlencode&amp;quot;. Beispiel (-G für einen HTTP GET Request):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
curl -G --data-urlencode &amp;quot;key=v a l u e&amp;quot; http://hsr.ch/pythonrichtiglernen&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Dokumentation der Web Service API von Nomatim finden Sie [http://wiki.openstreetmap.org/wiki/Nominatim#Parameters hier].&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe ====&lt;br /&gt;
# Finden Sie mit cURL und Nomatim den Längen- und Breitengrad der HSR (Oberseestrasse 10, 8640 Rapperswil).&lt;br /&gt;
# Nehmen Sie den Längen- und Breitengrad und überprüfen Sie, ob Nomatim Ihnen die richtige Adresse der HSR liefert (reverse geocoding).&lt;/div&gt;</summary>
		<author><name>Mrueegg</name></author>
	</entry>
</feed>