Bazı değişmezleri paylaşan ve ortak bir arabirime sahip birkaç sınıfım var ve her biri için aynı testi otomatik olarak çalıştırmak istiyorum. Örnek olarak, bir veri kümesinin bölümlendirilmesi için farklı yaklaşımlar uygulayan birkaç sınıfa sahip olduğumu varsayalım. Buradaki ortak değişmez, bütün bu sınıflar için tüm bölümler üzerindeki kaynağın orijinal veri kümesine eşit olması gerektiği olurdu. Farklı sınıflar için aynı deneme vakası nasıl çalıştırılır?
class PartitionerInvariantsTests(unittest.TestCase):
def setUp(self):
self.testDataSet = range(100) # create test-data-set
def impl(self, partitioner):
self.assertEqual(self.testDataSet,
chain.from_iterable(partitioner(self.testDataSet))
O zaman bu sınıfın bir örneği ile test etmek istediğiniz sınıfların her biri için
impl
çağıran farklı bir işlevi ekleyin:
Şu anda ne var böyle bir şey görünüyor. Birden fazla test fonksiyonu için bunu yaparken sorun ortaya çıkıyor. 5 test fonksiyonum ve test etmek istediğim 5 sınıfa sahip olduğumu varsayalım. Bu, tüm testleri çağırmak için neredeyse aynı görünen 25 işlevi gerçekleştirir.
Düşündüğüm başka bir yaklaşım, şablonu süper sınıf olarak uygulamak ve sonra test etmek istediğim sınıfların her biri için bir alt sınıf oluşturmaktı. Alt sınıflar, sınıfın başlatılması için bir işlev sağlayabilir. Buradaki sorun, varsayılan test yükleyicinin (kullanışsız) temel sınıfın geçerli bir test vakası olduğunu düşünmesi ve bunu çalıştırmayı denemesidir ki bu başarısız olur.
Peki, önerileriniz nelerdir? Test etmek istediğiniz her Partitioner sınıf için
class PartitionerInvariantsTests(unittest.TestCase):
def test_impl(self):
self.assertEqual(self.testDataSet,
chain.from_iterable(self.partitioner(self.testDataSet))
class PartitionerATests(PartitionerInvariantsTests):
:
P.S. .: Ben Python 2.6
unittest o 'unittest.TestCase' devralan etmezse temel sınıfa çalıştırmayı dener misin? – nmichaels
@Nathon: Şimdi söylüyorsun, bunu henüz denemedim. –
@Nathon, fikrinizi bir yanıt olarak göndermek isterseniz, ben de mutlu bir şekilde benimkini sileceğim. – unutbu