2017-02-20 2 views
13

Ich schrieb ein Python-Skript, um alle meine Tests automatisch für mich durchzuführen und einen HTML-Bericht zu generieren. Ich habe neulich discover für Unittests entdeckt, die es mir erlauben, alle Unittests in einem bestimmten Verzeichnis auszuführen, ohne sie explizit zu benennen, und ich würde meine Doktests auf die gleiche Weise machen wollen, anstatt jedes Modul explizit importieren zu müssen.Wie kann ich doctests mit der Testentdeckung von unittest integrieren?

Ich habe einige Informationen darüber gefunden, wie man das unter https://docs.python.org/2/library/doctest.html macht, habe es aber nicht wirklich verstanden. Könnten Sie mir bitte helfen mit discover mit meinem Doctests?

Python test discovery with doctests, coverage and parallelism ist verwandt, aber immer noch nicht meine Frage beantworten.

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' gilt als Etalon für Tests in Python heutzutage, also ich Ich würde es empfehlen, es auszuprobieren. Es sieht so aus, als hätte es auch eine gute Unterstützung für Doctests: http://doc.pytest.org/en/latest/doctest.html – yedpodtrzitko

Antwort

4

Lets herauszufinden, was passiert dort

1) unittest.discovery

Es hat keine Ahnung von Doctests als Doctests ist ein anderes Framework. So unittest ist nicht dazu gedacht, doctests out of the box zu entdecken. Das bedeutet, Sie werden sie zusammen

von Hand müssen kleben

2) doctest

Es ist im Wesentlichen ein separater Rahmen obwohl es einige Verleimung Klassen hat Doctests in Unittest-ähnliche Testfälle zu konvertieren. https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

3) entdecken

Haben Sie nicht bekommen, was discover du meinst, ich nehme an, es ist

python -m unittest discover 

Wenn nicht und Sie sprechen https://pypi.python.org/pypi/discover dann, wenn ich nur vergessen - es ist ein Backport für frühere Versionen von Python

4) was zu tun ist

entweder streuen viel load_tests Haken in Ihrem Code wie hier https://docs.python.org/2.7/library/doctest.html#unittest-api beschrieben oder Code ein Verfahren alle Module zu sammeln, um Ihre an einem Ort und wandeln sie in ein DocTestSuite [s] https://docs.python.org/2.7/library/doctest.html#doctest.DocTestSuite

Aber ehrlich gesagt weder Ansatz macht jeden heutzutage Sinn, wie es läuft darauf hinaus:

$ py.test --doctest-modules 

oder

$ nosetests --with-doctest 

Natürlich coverage und viele Glocken & Pfeifen werden auch von diesen Gerüsten geliefert, und Sie können weiterhin am unitest haften.TestCase, und Sie müssen nicht einmal eine coverage_module erstellen, so würde ich in einer von ihnen graben und dann versuchen, mit Ihrer eigenen Lösung zu kommen

Verwandte Themen