練習47-自動化テスト-愚かな法学Python 3

5647 ワード

練習47.テストの自動化


ゲームの機能が正常かどうかを確認するには、ゲームにコマンドを何度も入力する必要があります.この過程は非常に退屈だ.コードをテストするために小さなコードを書くことができたらもっといいのではないでしょうか.プログラムを変更したり、新しいものを追加したりすると、「テストを走ってください」だけで、これらのテストはプログラムが正常に動作していることを確認することができます.これらの自動テストはすべてのバグをキャプチャしませんが、コマンドを繰り返し入力してコードを実行する必要がなく、多くの時間を節約できます.
このセクションから、今後、各練習には「見える」という部分はなくなり、代わりに「テストすべき」(What You Should Test)部分があります.これからは、自分が書いたすべてのコードの自動化テストを書く必要があります.これにより、より良いプログラマーになります.
なぜ自動化テストを書く必要があるのか説明しようとしません.私があなたに伝えたいのは、あなたはプログラマーになりたいと思っていますが、プログラムの役割は退屈で冗長な仕事を自動化することです.テストソフトウェアは間違いなく退屈で冗長なので、コードを書いてテストの仕事をさせたほうがいいです.
これはあなたが必要とするすべての説明であるはずです.ユニットテストを書く理由は、脳をより丈夫にすることです.あなたはこの本を読んで、多くのコードを書いて、いくつかのことを実現させました.あなたが書いた他のコードが読めるコードをさらに書きます.このコードを書いてあなたが書いた他のコードをテストする過程は、あなたが前に書いたコードを明確に理解するように強制します.同時に、これらのコードが実現する機能とその原理を明確に理解し、細部への注意をさらに向上させます.

テスト例を書く


非常に簡単なコードを例に、前節で作成したプロジェクトのスケルトンに構築される簡単なテストを書きます.
まず、あなたのプロジェクトスケルトンからex 47というプロジェクトを作成します.次の手順に従います.コードを直接与えるのではなく、言語の説明で教えてあげます.そうすれば、考える機会を与えることができます.
  • プロジェクトスケルトンをex 47にコピーします.
  • すべてのNAMEファイルの名前をex 47に変更します.
  • すべてのファイルのNAME単語を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です.
  • 作成したモジュールごとにテストを書きます.
  • テストケース(関数)はできるだけ短くしますが、あまり整然と見えなくても大丈夫で、テストケースは一般的に少し乱れています.
  • テスト例が少し乱れていても、きれいにして、中の重複したコードを削除してみましょう.コードの重複を回避するための補助関数を作成します.今度コードを変更してテストを変更する必要があるときは、私の提案に感謝します.コードを繰り返すと、テストの変更が難しくなります.
  • 最後の1つは、あまりテストを気にしないでください.場合によっては、コードとテストをすべて削除し、コードを再設計することがより良い方法です.

  • あなたは


    Exercise 47セッション
    $ nosetests
    ...
    -----------------------------------------------------------------
    Ran 3 tests in 0.008s OK
    

    もしすべてが正常であれば、あなたはこれを見るはずです.エラーを作って、出力結果が何なのか見てから、コードを正しく修正してみましょう.

    練習を付け加える

  • nosetests関連ドキュメントを読んで、他の代替案を理解してください.
  • Pythonの「doc tests」を理解して、このテスト方法がもっと好きかどうか見てみましょう.
  • ゲームのRoomを改善し、それを使ってゲームを再構築します.今回はコードを書きながら、ユニットテストを書く必要があります.

  • よくある質問


    私が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をインストールすればいいかもしれません.