2016-02-22 42 views
10

Şu anda bu py.test örneğini takip ediyorum ve sınıfları kullanmadığımda işe yarıyor, ancak test senaryolarını sınıflara girdiğimde başarısız oluyor. Yapabileceğim nasılPy.test: sınıfları test parametreleri

TypeError: test_1() takes exactly 3 arguments (1 given) 

: Ben

py.test test_suite.py 

şu hata mesajını alıyorum yürütmek zaman maalesef

import unittest 

import pytest 

class FixtureTestCase(unittest.TestCase): 

    @pytest.mark.parametrize("test_input,expected", [ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     self.assertEqual(a, b) 

:

Ben yazmayı başardı küçük harf şudur test_1 testlerinden oluşan bir pil üretmek için?

+1

sınıf ihtiyacı olduğu mu 'TestCase' sınıfının bir alt sınıfı? –

+0

Şu anda, zorunlu değildir, ihtiyacım olan şey, bir sınıf olarak tanımlanmış olan testleri parametrelendirmek için – pafede2

+1

'TestCase' yöntemlerinin olduğu parametreli testlerde olduğu gibi, bu eski sorunun cevabı hala geçerli gibi görünüyor: http: // stackoverflow. com/questions/18182251/does-pytest-parameterrized-test-work-with-unittest-class-based-tests Özetle: iki kavramın karıştırılması işe yaramaz. –

cevap

8

unittest.TestCase'dan alt sınıflarsanız, test yöntemleriniz ek argümanlara sahip olamaz. Kullandığınız neden sadece object gelen alt sınıfı ise, bu TestCase.assertEqual yöntemlerinin yerine düzenli assert ifadeleri kullanmak gerekecektir olsa (çalışacaktır.

import unittest 

import pytest 

class TestCase(object): 

    @pytest.mark.parametrize("test_input,expected", [ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     assert eval(a) == b 

Bu noktada olsa da, bu tür soru yalvarır sadece tanımlayıcı fonksiyonlar yerine, testler temelde aynı olacaktır, ancak daha az toplam boilerplate ve kod gerektirecektir.

+0

Bu teklif işe yarıyor, ancak pytest herhangi bir testi tanımlamıyor. Efsane "toplanan 0 öğe" yazdırır. Herhangi bir öneri? – pafede2

+0

Özür dilerim, aynı zamanda sınıf isminin onu test etmek için de 'Test' ile başlaması gerektiğini de belirtmek istedim. –

+0

Yanıtı daha yeni kabul ettim, ancak sınıfın unittest.TestCase miras kaldığı bir seçenek olup olmadığını merak ediyordum? – pafede2

0

Son olarak ve @Brendan Abel tarafından verilen yanıt göz önünde bulundurulduğunda ve yorumlar yapmak istediğim şeyi başarmayı başardım. yapılarak:

class TestCase(object): 

    @parameterized.expand([ 
    ("negative", -1.5, -2.0), 
    ("integer", 1, 1.0), 
    ("large fraction", 1.6, 1), 
    ]) 
    def test_floor(self, name, input, expected): 
     assert_equal(math.floor(input), expected) 


    @parameterized.expand([ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
    ]) 
    def test_1(self, a, b): 
     assert_equal(eval(a), b) 

Sonra nosetests komutla testleri yürütmek mümkün duyuyorum:

nosetests -v --with-id class.py 
İlgili konular