特定の形式で保存されたファイルと、そのファイルのデータに基づいてオブジェクトを作成するクラスがあります。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属性のためにこれをやっています。これは単一の関数にマージできますか?どうやって?
テストコードをクリーンアップするにはどうすればよいですか?
ありがとうございます!
編集:
私はこれが関連している感じが、私はそれが私の状況のために動作させる方法がわからないよ:Can params passed to pytest fixture be passed in as a variable?
私は平等マジックメソッドを使ってみましたが、実際のコードでは約12の属性があります(その中にはかなり長いものがあります)ので、それらを比較して問題のどこにあるのかを正確に判断することは困難です。書式を改善するだけですか?それとも良い方法がありますか? – Jake
@jakeは、等価メソッドまたはユニットテストを作成する際の問題ですか?クラスを使用してデータを格納しているように聞こえる場合は、[namedtuple](https://docs.python.org/3/library/collections.html#collections.namedtuple)または[attrs](https:// pypi.python.org/pypi/attrs/17.2.0)モジュールを使用しています。これらのメソッドは無料で提供されており、これらのユースケースに適しています。 – salparadise