2014-10-20 28 views
5

Python'un bir yöntemdeki tüm onaylamayı yürütmesine ve başarısız olan tüm durumları başarısızlığa uğratmak yerine, başarısız olduğunu bildirmenin bir yolu var mı?Unittest içinde döngü için

class MyTestCase(TestCase): 
    def test_a(self): 
     with open('testcase.txt') as ifile: 
      for iline in ifile: 
       self.assertEqual(iline, 'it is a test!') 
+1

Hataları bir araya getiren ve hepsini raporlayan bir birim sınama çerçevesi görmedim. Standart, ilk arızada başarısız olmak gibi görünüyor. – TGH

+1

@TGH: Bende; [googletest] (https://code.google.com/p/googletest/wiki/Primer) başarısızlık ve "ASSERT" makrolarını derhal iptal eden "EXPECT" makrolarına sahiptir. – user2357112

+0

@ user2357112 Çok ilginç. Çerçevenin yaratıcısı tarafından yapılan tasarım tercihi olduğu için mantıklı. Ortak bir örüntü, başarısız olduğunda istisnalar atmak ve eğer istenirse kendi istisnalarını uygulamak için onu arayan kişiye bırakmaktır. – TGH

cevap

7

Python 3.4, subTest içerik yöneticisini tanıttı.

class MyTestCase(TestCase): 
    def test_a(self): 
     with open('testcase.txt') as ifile: 
      for iline in ifile: 
       with self.subTest(line=iline): 
        self.assertEqual(iline, 'it is a test!') 

subTest olmadan bunu başarmak için çirkin yolu, bir try blok içinde self.assert* arama yapmak yakalandı hataları baskı, ve en az bir testi başarısız olursa açıkça döngü sonra AssertionError yükseltmektir gibi Kodunuz bakacağız.

+0

Python 2.7 ... – lucemia

+1

@lucemia için bir alt test bulmam gerekiyor sanırım altTest, istediğinizi elde etmenin en kolay yoludur, ancak istisnalar basmak için bir döngüde 'try..except 'özelliğini de kullanabilirsiniz. – vaultah

+0

Alt testlerle ilgili problem, bazen gerekli olabileceği gibi, her bir alt test için 'setUp' otomatik olarak çağrılmamasıdır. Ancak, kesinlikle alt testler içinde elle self.setUp() olarak çağrılabilir. –

1

Genellikle hayır. Birim testleri ilk başta durur. Tüm satırları karşılaştırmak istiyorsanız, yerel bir listeye sahip olmanız ve ardından farklı satırları listeye koymanız gerekir. Sonra liste uzunluğunun sıfır olduğunu belirtin. Veya yerel bir boole değişkeni.

3

Alternatif olarak, ddt package yardımıyla bir veri tabanlı test yapabilirsiniz:

DDT (Veriye Dayalı Testler) Farklı testi ile çalışan tek test durumu çoğalmaya sağlar veri ve birden çok test vakası olarak görünmesini sağlayın.

import unittest 
from ddt import ddt, data 

@ddt 
class FooTestCase(unittest.TestCase): 
    @data('it is a test!', 'it is a test!', 'something else') 
    def test_lines(self, value): 
     self.assertEqual(value, 'it is a test!') 

ddt da data coming from a file olabilir, ama bir JSON dosyası olmalıdır.

İlgili konular