2011-11-08 8 views
3

私はPythonとlibtcod roguelikeゲームライブラリを使ってゲームを作ろうとしています。Pythonでモジュールをテスト駆動型開発用にインポートするかどうかをテストするにはどうすればよいですか?

これまでのところ、私はPyMockを使用しています。テスト駆動型開発を学び始めたばかりなので、私は不正行為をしないと決めました。私は本当にそれを正しく行う習慣を身につけたいと思っています.TDDによれば、最初のコード行を書く前に、失敗したユニットテストが必要です。

私の「生産」コードの最初のテストは、その依存関係libcotdpyをインポートする必要があります。

私のテストファイル:

#!/usr/bin/python 
import pymock # for mocking and unit testing 
import game  # my (empty) production code file, game.py 

class InitializeTest(pymock.PyMockTestCase): 
    def test_libtcod_is_imported(self): 
     # How do I test that my production file imports the libtcodpy module? 

if __name__=="__main__": 
    import unittest 
    unittest.main() 

てください:

1)(のpython人)どのように私は、モジュールがロードされていることをテストするのですか?

2)(TDD people)私はこの基本的なことを何かテストするべきでしょうか?そうでない場合は、まずテストしなければならないことは何ですか?

答えて

6

1)'your_module' in sys.modules。あなたのライブラリーがすべきべきこと

2) : は実際にかかわらず、ことを使用しないでください? 「libcotdpyに依存していますか?」私はそうは思わない。

あなたはテスト駆動型ではないデザインを選択しました。

ライブラリの使い方を示すテストを作成します。どのように実装するのか考えないでください。たとえば、

player = my_lib.PlayerCharacter() 
assert player.position == (0, 0) # or whatever assert syntax `pymock` uses 
press_key('k') 
assert player.position == (0, 1) 

またはそれに類するもの。 (あなたのライブラリに何をしたいか、libtcodが提供する量は分かりません)

+0

これには、10億の増分が必要です。あなたは正しいです! **どのようにライブラリを使いたいかを示すテストを書く。どのように実装しようとしているのか考えないでください。** – Gutzofter

3

TDD(とBDD)について私が考えている方法は、受け入れテストレベルと受け入れテストレベルの2つのレベルですテストレベル。

私がする最初のことは、ストーリー(受諾基準)を書くことです。アプリケーションの中核機能は何ですか?明示的な1つの機能をエンドツーエンドのシナリオとして定義し、エンドツーエンドのシナリオを定義します。それはあなたの最初の話です。受け入れテスト(または統合テスト)フレームワークを使用して、そのためのテストを作成します。残念ながら、私はPythonツールを知らないのですが、JavaではJBehave、またはFITnesseを使用します。あなたのアプリケーションを「ブラックボックス」とみなす、非常に高度な、コードからは遠いものでしょう。何か "私の入力パラメータがxxxのとき、私はアプリケーションを実行し、期待される出力はyyyyです"というようなものです。

このテストを実行すると、基礎となるアプリケーションが存在しないために失敗します。赤色になるように最小限のクラスを作成します(そして例外はもうスローしません)。これは、TDDの第2段階であるユニットTDDを開始する必要があるときです。これは基本的にトップレベルからディテールまでの「降下分析」です。このフェーズでは、多くの異なるユニットをゲームに持ち込む赤と緑のリファクタのサイクルが多数含まれます。

時々、元の受け入れテストを再実行するか、ますます増大するアーキテクチャーと分析が仕様変更を余儀なくされた場合は修正してください(理論的にはその段階では発生しませんが、 、 よく)。受け入れテストが完全にグリーンになると、そのストーリー、リンス、リピートが完了します。

すべてのことがわかりました:純粋なTDD(私は単位TDDを意味します)は実用的ではありません。私はTDDが本当に好きですが、それを宗教的に従おうとすると、長期的には助けよりも面倒です。場合によっては、最初にテストを書くことなく、それがプロジェクトの他の部分とうまく合っているかどうかを確認し、潜在的にTDDを使用して書き直すアプローチをとることがあります。 しかし、ロット全体をカバーする受け入れテストがある限り、あなたは大丈夫ですです。

1

それをテストする方法があっても、それをしないことをお勧めします。

クライアントの観点から(外部)、SUT(ゲーム)によってどのような動作が提供されているかをテストします。あなたのテスト(またはあなたのユーザー)は、ライブラリを使ってこの動作を公開することを知る必要はありません。行動が壊れていない限り、あなたのテストは合格するはずです。

他の回答と同様に、依存関係は必要ありません。単純な解決策があるかもしれません(たとえば、ハッシュテーブルは、本質的にリレーショナルデータベースにジャンプした場所で実行される可能性があります)。テストに耳を傾ける...テストでは、動作を引き出します。

これにより、今後も一連のテストを修正することなく、依存関係を自由に変更することができます。

関連する問題