pytestを使用してオブジェクトが正しく作成されたことを確認するにはどうすればよいですか?

ジェイク

特定の形式で保存されたファイルと、ファイル内のデータに基づいてオブジェクトを作成するクラスがあります。

オブジェクトの各属性をテストして、ファイル/文字列のすべての値が正しく抽出されたことを確認したいと思います。

これが私がしていることの単純化されたバージョンです:

classlist.py

import re

class ClassList:
    def __init__(self, data):
        values = re.findall('name=(.*?)\$age=(.*?)\$', data)

        self.students = [Student(name, int(age)) for name, age in values]

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

test_classlist.py

import pytest
from classlist import ClassList

def single_data():
    text = 'name=alex$age=20$'
    return ClassList(text)

def double_data():
    text = 'name=taylor$age=23$' \
           'name=morgan$age=25$' 
    return ClassList(text)


@pytest.mark.parametrize('classinfo, expected', [
        (single_data(), ['alex']),
        (double_data(), ['taylor', 'morgan'])
])
def test_name(classinfo, expected):
    result = [student.name for student in classinfo.students]

    assert result == expected

@pytest.mark.parametrize('classinfo, expected', [
        (single_data(), [20]),
        (double_data(), [23, 25])
])
def test_age(classinfo, expected):
    result = [student.age for student in classinfo.students]

    assert result == expected

さまざまなデータに基づいてオブジェクトを作成し、それらをパラメーター化された値として使用したいと思います。

私の現在のセットアップは機能しますが、テストごとにオブジェクトを作成するという不必要な耳が聞こえます。一度作成してほしいです。

私が次のことをしようとすると:

...
@pytest.fixture(scope='module') # fixture added
def double_data():
    text = 'name=taylor$age=23$' \
           'name=morgan$age=25$' 
    return ClassList(text)


@pytest.mark.parametrize('classinfo, expected', [
        (single_data, ['alex']),
        (double_data, ['taylor', 'morgan']) # () removed
])
def test_name(classinfo, expected):
    result = [student.name for student in classinfo.students]

    assert result == expected
...

AttributeError: 'function' object has no attribute 'students'

...フィクスチャではなく関数を参照しているため、機能しません。

また、内のコードtest_nameとはtest_ageほとんど同じです。私の実際のコードでは、約12の属性に対してこれを行っています。これを単一の関数にマージする必要がありますか?どうやって?

テストコードをクリーンアップするにはどうすればよいですか?

ありがとう!

編集:

これは適切だと思いますが、自分の状況でどのように機能するのかわかりません。pytestフィクスチャに渡されたパラメータを変数として渡すことはできますか?

サルパラダイス

私の現在のセットアップは機能しますが、テストごとにオブジェクトを作成するという不必要な耳が聞こえます。一度作成してほしいです。

これは私には不必要な事前最適化のように聞こえますが、これを気にする場合は、モジュールレベルでテストするデータを作成する関数を実行して、1回だけ実行するようにします。

例えば:

...
def single_data():
    text = 'name=alex$age=20$'
    return ClassList(text)

def double_data():
    text = 'name=taylor$age=23$' \
           'name=morgan$age=25$' 
    return ClassList(text)


double_data_object = double_data()

single_data_object = single_data()


@pytest.mark.parametrize('classinfo, expected', [
        (single_data_object, ['alex']),
        (double_data_object, ['taylor', 'morgan'])
])
def test_name(classinfo, expected):
    result = [student.name for student in classinfo.students]

    assert result == expected

@pytest.mark.parametrize('classinfo, expected', [
        (single_data_object, [20]),
        (double_data_object, [23, 25])
])
def test_age(classinfo, expected):
...

さらに、test_nameとtest_ageのコードはほとんど同じです。私の実際のコードでは、約12の属性に対してこれを行っています。これを単一の関数にマージする必要がありますか?どうやって?

テストコードをクリーンアップするにはどうすればよいですか?

これを行うにはいくつかの方法がありますが、あなたの例から、クラスに等式マジックメソッド提供し、Studentそれを使用してコードをテストします(オブジェクトの正常な表現のreprも追加します)。

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return (self.name, self.age) == (other.name, other.age)

    def __repr__(self):
        return 'Student(name={}, age={})'.format(self.name, self.age)

次に、テストは次のようになります。

@pytest.mark.parametrize('classinfo, expected', [
        (single_data(), [Student('alex', 20)]),
        (double_data(), [Student('taylor', 23), Student('morgan', 25)]),
])
def test_student(classinfo, expected):
    assert classinfo.students == expected

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ArrayList の toString を返す/実装するにはどうすればよいですか? また、オブジェクトが正しく作成されたことを確認したいだけですか?

分類Dev

3つのオブジェクトを変換して位置を入れ替えるにはどうすればよいですか?ただし、オブジェクトがすでに移動している位置にオブジェクトが移動していないことを確認してください。

分類Dev

コンストラクタなしでオブジェクトが正しく初期化されていることを確認するにはどうすればよいですか?

分類Dev

reactとjavascriptを使用してオブジェクトの配列がnullかどうかを確認するにはどうすればよいですか?

分類Dev

getLoggerが新しいオブジェクトを作成したかどうかを確認するにはどうすればよいですか?

分類Dev

Travis-CIがGitHubリポジトリと正しく同期されていることを確認するにはどうすればよいですか?

分類Dev

オブジェクトのタイプがこれと等しいことをC#で確認するにはどうすればよいですか?

分類Dev

Raycastを使用して、子ゲームオブジェクトがマウスクリックされたことを確認するにはどうすればよいですか?

分類Dev

オブジェクトがまだ作成されているかどうかを確認するにはどうすればよいですか?

分類Dev

PHPを使用してJSONオブジェクトにデータを正しく作成して追加するにはどうすればよいですか?

分類Dev

JSONスキーマ:配列に、指定された値を持つプロパティを持つオブジェクトが少なくとも1つ含まれていることを確認するにはどうすればよいですか?

分類Dev

オブザーバブル内のオブジェクトが条件を満たすことを確認するにはどうすればよいですか?

分類Dev

非オブジェクトのプロパティを取得しようとしています->オブジェクトが存在することを確認するにはどうすればよいですか

分類Dev

Vue v-if内で、オブジェクトの配列内のオブジェクトが指定されたキーに対して特定の値を持っているかどうかを確認するにはどうすればよいですか?

分類Dev

オブジェクトがgolangで作成された後にメソッドが使用されることを確認するにはどうすればよいですか?

分類Dev

プロジェクトで最新のJavaライブラリを使用していることを確認するにはどうすればよいですか?

分類Dev

C#MongoDBドライバーを使用して、ネストされたオブジェクトのプロパティを等しくすることができない、強く型付けされたフィルターを作成するにはどうすればよいですか?

分類Dev

オブジェクトが別のオブジェクトのプロパティにプロパティとしてネストされているかどうかを確認するにはどうすればよいですか?

分類Dev

Eclipseプロジェクトがtychoを効果的に使用していることを確認するにはどうすればよいですか

分類Dev

PyQt5がMacに正しくインストールされていることを確認するにはどうすればよいですか?

分類Dev

新しく作成されたコネクタがまっすぐであることを確認するにはどうすればよいですか?

分類Dev

配列にオブジェクトの値が含まれていることを確認するにはどうすればよいですか

分類Dev

AndroidでJSONオブジェクトがJSON配列または文字列を返すことを確認するにはどうすればよいですか?

分類Dev

Jekyllが正しくインストールされていることを確認するにはどうすればよいですか?

分類Dev

マップを使用して、ネストされたオブジェクトの配列内にキーが存在するかどうかを確認するにはどうすればよいですか?

分類Dev

オブジェクトがラムダであることを正しく判断するにはどうすればよいですか?

分類Dev

OpenCvを使用して画像に新しく表示されたオブジェクトのリストを取得するにはどうすればよいですか?

分類Dev

これをjavascriptを使用してオブジェクトまたは配列として解析するにはどうすればよいですか?

分類Dev

オブジェクトがすでに破壊されているかどうかを確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    ArrayList の toString を返す/実装するにはどうすればよいですか? また、オブジェクトが正しく作成されたことを確認したいだけですか?

  2. 2

    3つのオブジェクトを変換して位置を入れ替えるにはどうすればよいですか?ただし、オブジェクトがすでに移動している位置にオブジェクトが移動していないことを確認してください。

  3. 3

    コンストラクタなしでオブジェクトが正しく初期化されていることを確認するにはどうすればよいですか?

  4. 4

    reactとjavascriptを使用してオブジェクトの配列がnullかどうかを確認するにはどうすればよいですか?

  5. 5

    getLoggerが新しいオブジェクトを作成したかどうかを確認するにはどうすればよいですか?

  6. 6

    Travis-CIがGitHubリポジトリと正しく同期されていることを確認するにはどうすればよいですか?

  7. 7

    オブジェクトのタイプがこれと等しいことをC#で確認するにはどうすればよいですか?

  8. 8

    Raycastを使用して、子ゲームオブジェクトがマウスクリックされたことを確認するにはどうすればよいですか?

  9. 9

    オブジェクトがまだ作成されているかどうかを確認するにはどうすればよいですか?

  10. 10

    PHPを使用してJSONオブジェクトにデータを正しく作成して追加するにはどうすればよいですか?

  11. 11

    JSONスキーマ:配列に、指定された値を持つプロパティを持つオブジェクトが少なくとも1つ含まれていることを確認するにはどうすればよいですか?

  12. 12

    オブザーバブル内のオブジェクトが条件を満たすことを確認するにはどうすればよいですか?

  13. 13

    非オブジェクトのプロパティを取得しようとしています->オブジェクトが存在することを確認するにはどうすればよいですか

  14. 14

    Vue v-if内で、オブジェクトの配列内のオブジェクトが指定されたキーに対して特定の値を持っているかどうかを確認するにはどうすればよいですか?

  15. 15

    オブジェクトがgolangで作成された後にメソッドが使用されることを確認するにはどうすればよいですか?

  16. 16

    プロジェクトで最新のJavaライブラリを使用していることを確認するにはどうすればよいですか?

  17. 17

    C#MongoDBドライバーを使用して、ネストされたオブジェクトのプロパティを等しくすることができない、強く型付けされたフィルターを作成するにはどうすればよいですか?

  18. 18

    オブジェクトが別のオブジェクトのプロパティにプロパティとしてネストされているかどうかを確認するにはどうすればよいですか?

  19. 19

    Eclipseプロジェクトがtychoを効果的に使用していることを確認するにはどうすればよいですか

  20. 20

    PyQt5がMacに正しくインストールされていることを確認するにはどうすればよいですか?

  21. 21

    新しく作成されたコネクタがまっすぐであることを確認するにはどうすればよいですか?

  22. 22

    配列にオブジェクトの値が含まれていることを確認するにはどうすればよいですか

  23. 23

    AndroidでJSONオブジェクトがJSON配列または文字列を返すことを確認するにはどうすればよいですか?

  24. 24

    Jekyllが正しくインストールされていることを確認するにはどうすればよいですか?

  25. 25

    マップを使用して、ネストされたオブジェクトの配列内にキーが存在するかどうかを確認するにはどうすればよいですか?

  26. 26

    オブジェクトがラムダであることを正しく判断するにはどうすればよいですか?

  27. 27

    OpenCvを使用して画像に新しく表示されたオブジェクトのリストを取得するにはどうすればよいですか?

  28. 28

    これをjavascriptを使用してオブジェクトまたは配列として解析するにはどうすればよいですか?

  29. 29

    オブジェクトがすでに破壊されているかどうかを確認するにはどうすればよいですか?

ホットタグ

アーカイブ