練習47-自動化テスト-愚かな法学Python 3
5647 ワード
練習47.テストの自動化
ゲームの機能が正常かどうかを確認するには、ゲームにコマンドを何度も入力する必要があります.この過程は非常に退屈だ.コードをテストするために小さなコードを書くことができたらもっといいのではないでしょうか.プログラムを変更したり、新しいものを追加したりすると、「テストを走ってください」だけで、これらのテストはプログラムが正常に動作していることを確認することができます.これらの自動テストはすべてのバグをキャプチャしませんが、コマンドを繰り返し入力してコードを実行する必要がなく、多くの時間を節約できます.
このセクションから、今後、各練習には「見える」という部分はなくなり、代わりに「テストすべき」(What You Should Test)部分があります.これからは、自分が書いたすべてのコードの自動化テストを書く必要があります.これにより、より良いプログラマーになります.
なぜ自動化テストを書く必要があるのか説明しようとしません.私があなたに伝えたいのは、あなたはプログラマーになりたいと思っていますが、プログラムの役割は退屈で冗長な仕事を自動化することです.テストソフトウェアは間違いなく退屈で冗長なので、コードを書いてテストの仕事をさせたほうがいいです.
これはあなたが必要とするすべての説明であるはずです.ユニットテストを書く理由は、脳をより丈夫にすることです.あなたはこの本を読んで、多くのコードを書いて、いくつかのことを実現させました.あなたが書いた他のコードが読めるコードをさらに書きます.このコードを書いてあなたが書いた他のコードをテストする過程は、あなたが前に書いたコードを明確に理解するように強制します.同時に、これらのコードが実現する機能とその原理を明確に理解し、細部への注意をさらに向上させます.
テスト例を書く
非常に簡単なコードを例に、前節で作成したプロジェクトのスケルトンに構築される簡単なテストを書きます.
まず、あなたのプロジェクトスケルトンからex 47というプロジェクトを作成します.次の手順に従います.コードを直接与えるのではなく、言語の説明で教えてあげます.そうすれば、考える機会を与えることができます.
*.pyc
ファイルをすべて削除して、フォルダがきれいであることを確認します.もしあなたが詰まったら、帰って練習46を調べてもいいです.もしこれらの手順を完成できないなら、何度も練習する必要があります.
警告!
nosetests
コマンドを実行してテストを実行することを覚えておいてください.python3.6 ex47_tests.py
を直接入力して実行できますが、そんなに簡単には実行できません.テストファイルごとにこのコマンドを実行する必要があります.次に、簡単なファイルex 47/gameを作成します.py、コードを入れてテストすることができます.これは非常に小さなクラスで、コードは次のとおりです.
game.py
1 class Room(object):
2
3 def __init__(self, name, description):
4 self.name = name
5 self.description = description
6 self.paths = {}
7
8 def go(self, direction):
9 return self.paths.get(direction, None)
10
11 def add_paths(self, paths):
12 self.paths.update(paths)
このファイルがあれば、ユニットテストのスケルトンをこのように変更します.
ex47_tests.py
1 from nose.tools import *
2 from ex47.game import Room
3
4
5 def test_room():
6 gold = Room("GoldRoom",
7 """This room has gold in it you can grab. There's a
8 door to the north.""")
9 assert_equal(gold.name, "GoldRoom")
10 assert_equal(gold.paths, {})
11
12 def test_room_paths():
13 center = Room("Center", "Test room in the center.")
14 north = Room("North", "Test room in the north.")
15 south = Room("South", "Test room in the south.")
16
17 center.add_paths({'north': north, 'south': south})
18 assert_equal(center.go('north'), north)
19 assert_equal(center.go('south'), south)
20
21 def test_map():
22 start = Room("Start", "You can go west and down a hole."
23 west = Room("Trees", "There are trees here, you can go east.")
24 down = Room("Dungeon", "It's dark down here, you can go up.")
25
26 start.add_paths({'west': west, 'down': down})
27 west.add_paths({'east': start})
28 down.add_paths({'up': start})
29
30 assert_equal(start.go('west'), west)
31 assert_equal(start.go('west').go('east'), start)
32 assert_equal(start.go('down').go('up'), start)
このファイルはあなたをex 47に導入しました.ゲームモジュールのRoomクラスは、この上でテストすることができます.次いで、
test_
で始まる関数の一連のテストが行われる.各テスト例には、1つ以上の部屋を作成し、部屋の機能があなたが望むものと同じかどうかを確認するコードがあります.基本的な部屋機能をテストし、パスをテストし、地図全体をテストしました.ここで最も重要な関数は
assert_equal
で、あなたが設定した変数とRoomで設定した経路があなたの期待と一致することを保証します.エラーの結果が得られると、nosetests
にエラーメッセージが印刷され、エラーの場所を見つけて修正することができます.テストガイド
テストでは、以下の厳密ではないガイドラインに従って行うことができます.
tests/
ディレクトリの下に配置され、BLAH_tests.py
と命名されます.そうしないと、nosetests
はテストスクリプトを実行しません.このようにすると、テストコードと他のコードが混同されないようにするメリットもあります.aiちゃん注:ここのBLAH_tests.py
はやんちゃな書き方(BLAHはくだらないことの意味)で、BLAH
をあなたのNAME
に置き換えるべきで、この練習の中でex47
です.あなたは
Exercise 47セッション
$ nosetests
...
-----------------------------------------------------------------
Ran 3 tests in 0.008s OK
もしすべてが正常であれば、あなたはこれを見るはずです.エラーを作って、出力結果が何なのか見てから、コードを正しく修正してみましょう.
練習を付け加える
よくある質問
私が
nosetests
を実行している間に文法エラー(syntax error)を受け取りました.もしあなたがこのようなプロンプトを受け取ったら、エラープロンプトがどのように言っているのかを見て、エラーのどの行または前の行を修正します.nosetests
のようなツールは、あなたのコードとテストコードを実行するので、Pythonを実行しながら文法エラーを発見します.なぜex 47を導入できなかったのか.game ?
ex47/__init__.py
ファイルを作成したことを確認し、練習46に戻って作成方法を見てみましょう.問題がここにない場合は、macOS/Linuxシステム:export PYTHONPATH=.
Windowsシステム:
$env :PYTHONPATH = "$env :PYTHONPATH ; . "
最後に、Pythonではなく
nosetests
でテストを行っていることを確認します.nosetests
を運転していたときにUserWarning
が見えました.2つのバージョンのPythonをインストールしているか、distribute
ではないか、帰って練習46についてdistribute
またはpip
をインストールすればいいかもしれません.