2013-05-03 25 views
6

Testlerim için bir yürütme sırasını ayarlamam gerekiyor, çünkü diğerlerinden önce bazı verilerin doğrulanması gerekiyor. Sipariş vermek mümkün mü?Python unittest üzerinde yürütme sırası

class OneTestCase(unittest.TestCase): 
    def setUp(self): 
     # something to do 
    def test_login (self): 
     # first test 
     pass 
    def test_other (self): 
     # any order after test_login 
    def test_othermore (self): 
     # any order after test_login 
if __name__ == '__main__': 
    unittest.main() 

sayesinde

+3

birim testi, testlerin üniter olduğunu gösterir. birbirlerine bağımlı olmaları gerekmiyor. – njzk2

+0

Haklısınız, ama sonra, bu tür bir davranışa sahip olmak gerektiğinde bir test yapmanın en iyi yolu olabilir, her seferinde bir test yapmak için giriş yaptığım zaman daha iyi olabilir mi? Başka bir şey yapmadan önce bir oturum açmaya ihtiyaç duyan bir sunucu için ve diğer yöntemler girişe dayalı bilgileri okuyor – Carlos

+3

Eğer gerçek bir sunucuyla gerçekten tel üzerinde etkileşiyorsanız, * birim * testi yapmıyorsunuz. – delnan

cevap

1

Daha yapmayın.

Testler bağımsız olmalıdır.

En iyi yapmak istediğiniz şeyi yapmak, kodu test tarafından çağrılan işlevlere koymak olabilir. Bunun gibi

:

def assert_can_log_in(self): 
    ... 

def test_1(self): 
    self.assert_can_log_in() 
    ... 

def test_2(self): 
    self.assert_can_log_in() 
    ... 

Hatta test sınıf bölünmüş ve Kurulum fonksiyonu içine iddiasını koymak. Ben testler bölünmüş ve ben test edilmelidir tüm durumlarda aracılığıyla daha iyi görebiliyorum çünkü genellikle fazla ve daha iyi testler yazma sınıfı bölmek

class LoggedInTests(unittest.TestCase): 
    def setUp(self): 
     # test for login or not - your decision 

    def test_1(self): 
     ... 

.

+0

da giriş test edilmeli, tamam olabilir mi? – Carlos

+0

Üzgünüz, anlamıyorum. – User

+3

Testlerin nasıl doğru yazılacağına dair uzun tartışmalar okuyorum. Gerçek şu ki, bazı testler, belirli bir duruma bağlıdır; Bir önceki testte, bu durumun oluşturulmasını test eden (örneğin, giriş yapılan) test edilebilir. Bu durumu oluşturmak zaman alıcı bir prosedür olabilir, bu nedenle testlerin süresini kısaltmak için tekrar kullanmak ve zincirleme testleri buna değer olabilir. Başka bir deyişle, sadece oturumları test etmek için giriş günlüğüne yaptığınız 100 kez kayıt prosedürünü sınayacaksınız. Yani, test ayrılığı konusunda çok felsefi olmak mantıklı değil. – Michael

18

Böyle yapabilirsiniz:

class OneTestCase(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     # something to do 
     pass 

    def test_01_login (self): 
     # first test 
     pass 
    def test_02_other (self): 
     # any order after test_login 
    def test_03_othermore (self): 
     # any order after test_login 

if __name__ == '__main__': 
    unittest.main(failfast=True, exit=False) 

Testler alfabetik sıralanır, bu yüzden tek yapmanız gereken sipariş almak için sayıları toplayın. Muhtemelen test kullanıcısı için failfast = True'u da ayarlamak istersiniz, bu yüzden ilk test başarısız olur olmaz hemen başarısız olur.

+3

Neredeler bunlar sıralanıyor? Buna güvenebilir miyim? – User

+2

unittest bunları güvenilir bir şekilde alfabetik olarak sıralar. – Michael

+0

@User Bkz. Python docs: "Çeşitli test durumlarının çalıştırılacağı sıra, test işlev adlarının dizeler için yerleşik sıralamaya göre sıralanmasıyla belirlenir." – mloskot

İlgili konular