1

しばらくの間、Faker ツール ( Python FakerPhp FakerRuby Faker ...) を使用して、テストまたはデモ データ用のフィクスチャを生成しています。

私は常に同じ生成されたデータを取得したいので、ランダムシード機能を使用します。これは非常に簡単な例です:

import unittest
from faker import Faker
fake = Faker()
fake.seed(4321)

# My model
class Contact(object):
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')

        c2 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c2.firstname, u'Anika')
        self.assertEqual(c2.lastname, u'Dare')

unittest.main()

わかりました、すべてが素晴らしいです。

次に、プロジェクトに取り組み、新しいフィールドを Contact に追加する必要があります。

class Contact(object):
    def __init__(self, firstname, lastname, city):
        self.firstname = firstname
        self.lastname = lastname
        self.city = city

テストを更新します:

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

        c2 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c2.firstname, u'Allison')
        self.assertEqual(c2.lastname, u'Dibbert')
        self.assertEqual(c2.city, u'West Leathabury')

1 回目と 2 回目のテストで "c2.firstname" と "c2.lastname" アサーションを見ると、私の苦労がわかります。フィクスチャ生成の途中で新しい偽のデータを挿入すると、次のすべてのアサーションを更新する必要があります。 .

小規模なテストなら問題ありませんが、複数回のテストは非常に苦痛です。

この問題に関するヒントはありますか?

多くの乱数発生器インスタンスを使用することを考えていますが、それは良い方向だと思いますか?

4

2 に答える 2

-1

Faker ライブラリの動作に依存するため、これは適切な単体テスト ケースではありません。Faker の作成者が名前のリストを変更すると、テスト ケースの結果が変わる可能性があります。同時に、コードはまったく変更されていない可能性があります。

優れたテスト ケースは自己完結型で、非常に具体的なコードをテストする必要があります。例えば

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(u'Deonte', u'Jaskolski', u'East Freddieside')
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

繰り返しますが、Django の観点からは、このテスト ケースは必要ありません。Django コードは十分にテストされています。モデル インスタンスが正しく初期化されているかどうかを確認するテスト ケースを作成するのは冗長です。

于 2014-01-23T08:45:53.790 に答える