私には、なかなか手がつけられないような厄介な問題があります。現在、django カスタム認証バックエンドの単体テストを作成しています。私たちのシステムには、実際には 2 つのバックエンドがあります。1 つは、組み込みの django バックエンドで、もう 1 つは、ユーザー情報を XML 形式で返す Java ベースの API にリクエストを送信するカスタム バックエンドです。今、私は単体テストを書いているので、そのようなシステムの外部にリクエストを送信したくありません.Java APIをテストしようとはしていません.最も堅牢な方法で。
私がテストしている機能はこのようなものです.url設定値は、ユーザー名とパスワードデータを認証してxmlを返すJavaサーバーのベースURLであり、サービス値はURLクエリを構築するための魔法です.それは私たちにとって重要ではありません:
@staticmethod
def get_info_from_api_with_un_pw(username, password, service=12345):
url = settings.AUTHENTICATE_URL_VIA_PASSWORD
if AUTH_FIELD == "username":
params = {"nick": username, "password": password}
elif AUTH_FIELD == "email":
params = {"email": username, "password": password}
params["service"] = service
encoded_params = urlencode([(k, smart_str(v, "latin1")) for k, v in params.items()])
try:
# get the user's data from the api
xml = urlopen(url + encoded_params).read()
userinfo = dict((e.tag, smart_unicode(e.text, strings_only=True))
for e in ET.fromstring(xml).getchildren())
if "nil" in userinfo:
return userinfo
else:
return None
したがって、xml を取得し、それを解析して dict にします。キー nil が存在する場合は、dict を返し、満足して認証を続行できます。明らかに、1 つの解決策は、何らかの方法で xml 変数のロジックをオーバーライドまたはモンキーパッチする方法を見つけることです。私はこの答えを見つけました:
urllib のような 1 つのモック/スタブ Python モジュールを作成するにはどうすればよいですか?
私はそのようなものを実装しようとしましたが、そこにある詳細は非常に大雑把であり、それを機能させることができなかったようです.
また、xml 応答をキャプチャし、それを test フォルダーのローカル ファイルに配置しました。これは、テスト関数の url パラメーターに渡されるモック応答として使用する方法を見つけることを目的としています。このようなものは、url をオーバーライドします。 :
@override_settings(AUTHENTICATE_URL_VIA_PASSWORD=(os.path.join(os.path.dirname(__file__), "{0}".format("response.xml"))))
def test_get_user_info_username(self):
self.backend = RemoteAuthBackend()
self.backend.get_info_from_api_with_un_pw("user", "pass")
ただし、関数が定義する URL 構築ロジック (つまり、「url + encoded_params」) も考慮する必要があります。繰り返しになりますが、応答ファイルの名前を連結された URL と同じ名前に変更することもできますが、これは機能の優れた単体テストではなく、「チート」のようなものになりつつあり、全体がますます脆弱になっています。これらのソリューションを使用する時間はありますが、とにかくそれは単なる固定具であり、可能であれば回避したいものでもあります.
また、django 開発サーバーで xml を提供し、関数をそのサーバーに向ける方法があるのではないかと考えました。それはより健全な解決策のように思えますが、そのようなことが可能または推奨されるかどうかについては、多くのグーグル検索では手がかりが得られませんでした。
したがって、理想的には、関数呼び出しでJava APIの代わりに「サーバー」をモックするか、関数がURLとして開くことができるxmlペイロードを何らかの形で提供するか、関数にモンキーパッチを適用できる必要がありますテスト自体、または...
モック ライブラリには、そのようなことを行うための適切なツールがありますか?
http://www.voidspace.org.uk/python/mock
したがって、この質問には 2 つのポイントがあります。1) 特定の問題をきれいな方法で解決したいと思います。さらに重要なのは、2) データ、Cookie、ドメイン外のリモート API からのユーザー認証などは?