読者です 読者をやめる 読者になる 読者になる

日々常々

ふつうのプログラマがあたりまえにしたいこと。

そうだ。Pythonしよう。

と思ったので。

とりあえずインストール

http://www.python.org/download/
なんか変わったインストーラーだなーとか思いながら素直にインストール。

とりあえず起動

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> 

「>>>」なんだー。へー。

適当に叩いてみる

>>> if 1:
... print "2"
  File "<stdin>", line 2
    print "2"
        ^
IndentationError: expected an indented block

…むぐ。ああ、Pythonはインデントが意味あるんだっけ。

>>> if 1:
...     print "2"
...
2
>>> if 1:
...  print "2"
...
2
>>> if 1:
...               print "a"
...
a

へーへー。(上からタブ、スペース1つ、スペースいっぱい)

>>> if 1:
...     if 2:
...    print "a"
  File "<stdin>", line 3
    print "a"
            ^
IndentationError: unindent does not match any outer indentation level
>>> if 1:
...    if 2:
...     print "3"
...
3

なるほど。インデントの深さに意味があるのね。

てことで「テスト駆動開発入門」の写経

流れがおかしい?いやいやそんな事は無い。


とりあえずそのまま書いてみる。

PS> cat test.py
class WasRun:
        def__init__(self, name):
                self.wasRun= None

test= WasRun("testMethod")
print test.wasRun
test.testMethod()
print test.wasRun

PS> python test.py
  File "test.py", line 2
    def__init__(self, name):
                           ^
SyntaxError: invalid syntax

あれ?……何かがおかしい。本のままなんだが。んー。
なんか def__init__ が怪しい。コンストラクタらしいから特殊なのかと思ったけども。スペース入れてみるか。

PS> cat test.py
class WasRun:
        def __init__(self, name):
                self.wasRun= None

test= WasRun("testMethod")
print test.wasRun
test.testMethod()
print test.wasRun

PS> python test.py
None
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test.testMethod()
AttributeError: WasRun instance has no attribute 'testMethod'

……通ったし。いきなり間違ってるとか、ハードル高すぎるだろこの本。

仮実装してエラーはでなくする。

PS> cat test.py
class WasRun:
        def __init__(self, name):
                self.wasRun= None

        def testMethod(self):
                pass

test= WasRun("testMethod")
print test.wasRun
test.testMethod()
print test.wasRun

PS> python test.py
None
None

順調順調……でもなく、色々とやらかしながら。

class WasRun:
        def __init__(self, name):
                self.wasRun= None
        def testMethod(self):
                self.wasRun=1
        def run(self):
                self.testMethod(self)

これは何が間違いだっけ。testMethodの呼び出しに引数突っ込んでるところか。

22章までやった

class TestCase:
	def __init__(self, name):
		self.name = name
	def setUp(self):
		pass
	def run(self):
		result = TestResult()
		result.testStarted()
		self.setUp()
		try:
			method = getattr(self, self.name)
			method()
		except:
			result.testFailed()
		self.tearDown()
		return result
	def tearDown(self):
		pass

class TestResult:
	def __init__(self):
		self.runCount = 0
		self.errorCount = 0
	def testFailed(self):
		self.errorCount = self.errorCount + 1
	def testStarted(self):
		self.runCount = self.runCount + 1
	def summary(self):
		return "%d run, %d failed" % (self.runCount, self.errorCount)

class WasRun(TestCase):
	def __init__(self, name):
		TestCase.__init__(self, name)
	def setUp(self):
		self.wasRun= None
		self.log = "setUp "
	def testMethod(self):
		self.wasRun=1
		self.log = self.log + "testMethod "
	def testBrokenMethod(self):
		raise Exception
	def tearDown(self):
		self.log = self.log + "tearDown "

class TestCaseTest(TestCase):
	def testTemplateMethod(self):
		self.test = WasRun("testMethod")
		self.test.run()
		assert("setUp testMethod tearDown " == self.test.log)
	def testResult(self):
		test = WasRun("testMethod")
		result = test.run()
		assert("1 run, 0 failed" == result.summary())
	def testFailedResult(self):
		test = WasRun("testBrokenMethod")
		result = test.run()
		assert("1 run, 1 failed" == result.summary())
	def testFailedResultFormatting(self):
		result = TestResult()
		result.testStarted()
		result.testFailed()
		assert("1 run, 1 failed" == result.summary())

TestCaseTest("testTemplateMethod").run()
TestCaseTest("testResult").run()
TestCaseTest("testFailedResult").run()
TestCaseTest("testFailedResultFormatting").run()

何となくわかった気にはなれました。