質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Python 3.x

    2438questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

異常系(http status 400)テストコードをもっとスッキリかけないか(他にも良い書き方はないか)・・・

解決済

回答 1

投稿 2017/11/21 16:22

  • 評価
  • クリップ 0
  • VIEW 81

tomato_unagi

score 11

現在動作してる異常テストコードの型チェックを簡略化できないか
考えているのですが妙案が浮かびません。
exe関数にリクエストで来る項目を定義しておき、各要素に受け付けない型をfor文で回して
そのたびにexeを起動させています。

もう少し効率のいい、記述量の少ない書き方はありますでしょうか??
こんな書き方もできるぞ!!といった私と全く違う書き方でも教えてくださると幸いです。
よろしくお願いします。
使用言語はpython3.6.1
TestCase、noseのeqを使用しています
サンプルでこんな感じでかいてますというのを載せています。
実際はもっと煩雑なJSONで、項目数ももっと多いのでできれば簡略化させたい・・・

class PostTestCase(TestCase):
    _BASE_URL = "/api/hoge/fuga/1"

    def test_post_validation_err(self):
        # area, person
        verification_factor = [True, 1, [1], {"a": 1}]
        for i in verification_factor:
            res = self.exe(
                i,
                "taro",
                24,
                13
            )
            eq_(400, res.status_code)

       res = self.exe(
                "Tokyo",
                i,
                24,
                13
            )
            eq_(400, res.status_code)

    def exe(self, area, person, age, id):
        return client.post(
            self._BASE_URL, data=json.dumps([dict(
                area=area,
                person=person,
                age=age,
                id=id,
                )
            )]),
            content_type="application/json"
        )
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

私は依存ライブラリが少なめのpython_wrap_casesを好んで使っています。

少しトリッキーですが、_INVALID_DATA次第でいくらでもケースを増やせて、なおかつ実行時にいい感じの出力をしてくれる様にしてみました。

from itertools import chain
from itertools import repeat
from functools import partial
from functools import update_wrapper
import json
from unittest import TestCase

from python_wrap_cases import wrap_case


def partial_with_doc(fn, *args, **kwargs):
    return update_wrapper(partial(fn, *args, **kwargs), fn)


def post(path, data, content_type="application/json", **kwargs):
    # return 400
    return client.post(
        path,
        data=json.dumps(data),
        content_type=content_type,
        **kwargs,
    ).status_code


@wrap_case
class PostTestCase(TestCase):
    def assertBadRequest(self, verb, path, **kwargs):
        """Check if request ends up with 400"""
        self.assertEqual(400, verb(path, **kwargs))

    _INVALID_DATA = chain(
        zip([True, 1, [1], {"a": 1}], repeat("taro")),
        zip(repeat("Tokyo"), [True, 1, [1], {"a": 1}]),
    )
    for _i, (_area, _person) in enumerate(_INVALID_DATA):
        locals()["test_post_validation_err_%d" % _i] = wrap_case(
            path="/api/hoge/fuga/1",
            data=dict(area=_area, person=_person, age=23, id=13),
        )(partial_with_doc(assertBadRequest, verb=post))
    del _INVALID_DATA, _i, _area, _person


if __name__ == "__main__":
    from unittest import main
    main(verbosity=2)

 実行時の出力例

test_post_validation_err_0_data({'area': True, 'person': 'taro', 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_1_data({'area': 1, 'person': 'taro', 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_2_data({'area': [1], 'person': 'taro', 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_3_data({'area': {'a': 1}, 'person': 'taro', 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_4_data({'area': 'Tokyo', 'person': True, 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_5_data({'area': 'Tokyo', 'person': 1, 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_6_data({'area': 'Tokyo', 'person': [1], 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR
test_post_validation_err_7_data({'area': 'Tokyo', 'person': {'a': 1}, 'age': 23, 'id': 13})_path(/api/hoge/fuga/1) (__main__.PostTestCase)
Check if request ends up with 400 ... ERROR

投稿 2017/11/21 21:24

編集 2017/11/21 21:27

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 00:51

    ありがとうございます!このライブラリは使用したことがなかったですね・・・
    ライブラリのページも見てきました。私が作成したものよりだいぶstepsを減らすことができそうです
    トリッキーとおっしゃられてますが、私はかっこいいコードだなあと思いました。
    とても勉強になります。ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

  • 解決済

    Kerasで学習済みモデルを初期化できない

    kerasを使って学習済みモデルの評価をしようとしています。しかし、重みを設定するとタイトルのようなエラーが出てしまいました。フィルタ数、つまり最初のnOutoutPlaneは32

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    (Python)構文間違い

    構文間違い(SyntaxError: invalid syntax)と怒られましたけど、 どこが間違っているのかを教えてください。 コード: class michael:

  • 解決済

    【python】ファイルダイアログで選択したパスをTextCtrlに表示したい

    pythonの練習でGUIアプリを作成してます。 モジュールはwxpythonを利用して、ファイルダイアログで取得したパスをTextCtrlに表示させたいのですが、どのようにすれ

  • 解決済

    【wxpython】二つのテキスト画面のスクロールを同期させたい

    GUIで二つのテキスト画面を表示して、スクロールを同期させれず苦戦しています。 wxpythonのTextCtrl(style=wx.TE_MULTILIN)を二つ用意して、

  • 解決済

    python の unittest で実行する関数を限定したい。

    python の unittest で、実行する関数を限定することは、簡単に可能なのでしょうか? 下記の https://docs.python.jp/3/library/un

  • 解決済

    __slot__を用いた構造体が作成できない(python)

    前提・実現したいこと 講義でslotを用いた構造体が出されたのですが、言われたとおりに試しにプログラムをを作ったところ動作しません。エラー自体の意味は理解できるのですが、具体的にど

  • 解決済

    リストの情報を他のクラスに渡す

    前提・実現したいこと 随時更新されていくリストの情報を他のクラスに渡したい 発生している問題・エラーメッセージ 今現在三目並べのプログラムを作っていますが、盤の情報を se

同じタグがついた質問を見る

  • Python 3.x

    2438questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。