2017-02-20 67 views
13

Napisałem skrypt Pythona, aby automatycznie wykonał wszystkie moje testy i wygenerował raport HTML. Odkryłem discover dla unittests drugi dzień, który pozwala mi uruchomić wszystkie unittests w danym katalogu bez wyraźnego ich nazewnictwa, a ja naprawdę chciałbym móc zrobić moi doctests w ten sam sposób, zamiast importować każdy moduł wyraźnie.Jak mogę zintegrować testy z wykrywaniem testu Unittest?

znalazłem kilka informacji o tym, jak to zrobić w https://docs.python.org/2/library/doctest.html ale tak naprawdę nie rozumiem. Czy możesz pomóc mi w używaniu discover z moimi testami?

Python test discovery with doctests, coverage and parallelism jest powiązany, ale nadal nie jest odpowiedź na moje pytanie.

coverage_module

import coverage 
import doctest 
import unittest 
import os 

# import test_module 
import my_module 

cov = coverage.Coverage() 
cov.start() 

# running doctest by explicity naming the module 
doctest.testmod(my_module) 

# running unittests by just specifying the folder to look into 
testLoad = unittest.TestLoader() 
testSuite = testLoad.discover(start_dir=os.getcwd()) 
runner = unittest.TextTestRunner() 
runner.run(testSuite) 

cov.stop() 
cov.save() 
cov.html_report() 
print "tests completed" 

test_module

import unittest 
import doctest 

from my_module import My_Class 


class My_Class_Tests(unittest.TestCase): 
    def setUp(self): 
     # setup variables 

    def test_1(self): 
     # test code 

# The bit that should load up the doctests? What's loader, tests, and ignore though? 
# Is this in the right place? 
def load_tests(loader, tests, ignore): 
    tests.addTests(doctest.DocTestSuite(module_with_doctests)) 
    return tests 

if __name__ == '__main__': 
    unittest.main() 
+5

'pytest' jest uważany etalon do testów w Pythonie w dzisiejszych czasach, więc polecam to sprawdzić. Wygląda na to, że ma również dobre poparcie dla doctestów: http://doc.pytest.org/en/latest/doctest.html – yedpodtrzitko

Odpowiedz

4

Pozwala zorientować się, co się tam dzieje

1) unittest.discovery

Nie ma pojęcia o doktrynie, ponieważ doctests to inna struktura. Tak więc unittest nie powinien odkrywać doctestów po wyjęciu z pudełka. Oznacza to, że trzeba skleić je razem ręcznie

2) doctest

Jest to taka oddzielna struktura choć ma kilka klas klejenie do konwersji doctests do unittest podobny testami. https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

3) odkryć

Nie dostać co discover znaczy, przypuszczam, że to

python -m unittest discover 

Jeśli nie i mówisz https://pypi.python.org/pypi/discover potem po prostu o nim zapomnieć - to backport dla wcześniejszych wersji python

4) co zrobić

albo rozproszyć wiele load_tests haków całej kodzie jak opisano tutaj https://docs.python.org/2.7/library/doctest.html#unittest-api lub kod metodę, aby zebrać wszystkie moduły Twój mieć w jednym miejscu i przekształcić je w DocTestSuite [s] https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

Ale szczerze ani podejście ma jakiś sens w dzisiejszych czasach, ponieważ sprowadza się do:

$ py.test --doctest-modules 

lub

$ nosetests --with-doctest 

Oczywiście coverage i wiele dzwonków &, gwizdki są również dostarczane przez te ramy i możesz trzymać się do unittest.TestCase, a ty nawet nie trzeba tworzyć coverage_module więc wbijam do jednego z nich, a następnie próbując wymyślić własne rozwiązanie