Pythonでコード化されているユニットテストスイートをプロジェクトに組み込むことに関心があるかもしれません(そして、それがソリューションに関係している場合は、Redis、PostgreSQL、およびいくつかのサードパーティライブラリを使用します) )達成したい利点は次のとおりです。
これを行うのに役立つ優れたツール/ライブラリは何ですか?そして最も重要なこととして、BDDをPythonプロジェクトに組み込むための良い方法は何ですか?
どうもありがとうございました!任意の提案をいただければ幸いです。
pyspecs を試してください。テストを読みやすくし、開発中に常に実行することは、このプロジェクトを作成する上での私の主な目標の2つでした。
from pyspecs import given, when, then, and_, the, this
with given.two_operands:
a = 2
b = 3
with when.supplied_to_the_add_function:
total = a + b
with then.the_total_should_be_mathmatically_correct:
the(total).should.equal(5)
with and_.the_total_should_be_greater_than_either_operand:
the(total).should.be_greater_than(a)
the(total).should.be_greater_than(b)
with when.supplied_to_the_subtract_function:
difference = b - a
with then.the_difference_should_be_mathmatically_correct:
the(difference).should.equal(1)
# run_pyspecs.py
| • given two operands
| • when supplied to the add function
| • then the total should be mathmatically correct
| • and the total should be greater than either operand
| • when supplied to the subtract function
| • then the difference should be mathmatically correct
(ok) 6 passed (6 steps, 1 scenarios in 0.0002 seconds)
レタスやビヘイビアなどのBDDフレームワークはありますが(ドキュメントとサンプルでより適切に選択できます)、それなしで開始したと述べました。だから私の答えはこの状況にもっと関連するでしょう。
オリジナルのBDDは、JUnitのフォークから始まりました。これは、テストに「testSomething」という名前を付けるように求める代わりに、「shouldDoSomething」という名前を付けるように求めてきました。それはあなたが物事に集中し続けることになっていた方法です。
だから私は自分のプロジェクトでも同じように行きました。私は「test_should _...」で始まるテストに名前を付け始め、わかりやすい名前を付けようとしました。これがBDDを実行する方法であり、テストが正確に何をすべきかに集中し、テスト名を通常の文に変換するものを書くのは簡単です(もちろん、必要な場合)。 (特にスクリプト言語では)役に立たない名前(BDDフレームワークの場合のテスト名など)に時間を費やしたくないので、このアプローチは特効薬だと思います。
私はC#の Machine.Specifications に触発された Contexts と呼ばれるBDDフレームワークに取り組んできました。
Contextsは、テストケースをクラス全体に分散させることで、テストに対してユーザー中心の説明文(BDDの本質)を書くことを奨励します。テストの配置/実行/アサートフェーズは個々の短いメソッドに入れられ、コンテキストは名前に基づいてどのメソッドがどれであるかを判断します。
写真は千の言葉を話すので、readmeの例を次に示します。
import requests
class WhenRequestingAResourceThatDoesNotExist:
def given_that_we_are_asking_for_a_made_up_resource(self):
self.uri = "http://www.github.com/itdontexistman"
self.session = requests.Session()
def because_we_make_a_request(self):
self.response = self.session.get(self.uri)
def the_response_should_have_a_status_code_of_404(self):
assert self.response.status_code == 404
def the_response_should_have_an_HTML_content_type(self):
assert self.response.headers['content-type'] == 'text/html'
def cleanup_the_session(self):
self.session.close()
コンテキストには、パラメーター化されたテスト、「アサーションの書き換え」(py.testに触発された)、プラグインフレームワークなどの多くの最新機能もあります。
私はコンテキストを使用して、それ自体だけでなく他のいくつかのプロジェクト(Python以外のプロジェクトも含む)をテストし、テスト用三角形のすべてのレベルで理解可能な動作テストを生成することを発見しました(受け入れ用に設計されていないユニットテストとは異なります)テスト、または単体テスト用に設計されていないレタス)。