Kombination von doctest and unittest

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gast

Guten Morgen!

ich bin gerade mit dem Python angefangen. So auch ein Anfangsfrage:-)

ich wollte Schritte für Schritte fit machen, so habe ich zunächst mit doctest angefangen. Und probiert mit testmod und testfile, beide sind mit meinem Beispiel funktioniert. Nun wollte ich doctest mit dem unittest kombinieren, dann taucht das Problem, obwohl ich voll nach dem Tutorial mein Beispiel nachgebaut.

Die Fehlermeldung ist wegen der Datei mit testfile(einfilebeimir), die allein schon ohne Fehler funnktiniert.

>python doctest_unittest.py -v
Traceback (most recent call last):
File "doctest_unittest.py", line 8, in ?
suite.addTest(doctest.DocTestSuite(mod))
File "C:\Programme\Python241\lib\doctest.py", line 2297, in DocTestSuite
raise ValueError(module, "has no tests")
ValueError: (<module 'simp_doctest' from 'C:\Datenaustausch\PythonProjekte\simp_doctest.pyc'>, 'has no tests')

Ich habe geprüft, pyc Datei ist auch aktueller als py Datei.

Bitte um Hinweis oder Fehlersuchtips!

HL
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wäre nicht schlecht, wenn du ein kleines Beispiel postest.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Hallo Leonidas,

kein problem, mache ich gern, wenn ich eine Lösung oder Tips bekomme!

Danke im voraus!


*************
alle Dateien sind im gleichen Verzeichnis
*************

==========
die Code mit Problem!

========

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import unittest
import doctest

#the following code works
#~ import my_doctest
#~ suite = unittest.TestSuite()
#~ suite.addTest(doctest.DocTestSuite(my_doctest))
#~ runner = unittest.TextTestRunner()
#~ runner.run(suite)

# the following do not!
import simp_doctest, my_doctest

for mod in simp_doctest, my_doctest:
		suite.addTest(doctest.DocTestSuite(mod))

runner = unittest.TextTestRunner()
runner.run(suite)

********Fehlermeldung ***************

Code: Alles auswählen

Traceback (most recent call last):
  File "doctest_unittest.py", line 17, in ?
    suite.addTest(doctest.DocTestSuite(mod))
  File "C:\Programme\Python241\lib\doctest.py", line 2297, in DocTestSuite
    raise ValueError(module, "has no tests")
ValueError: (<module 'simp_doctest' from 'C:\Datenaustausch\PythonProjekte\simp_doctest.pyc'>, 'has no tests')
>Exit code: 1
***********************

================
the first one (not from me, ich habe nur abgeschrieben, or copy/paste):
ich nenne my_doctest.py

Das ist OK
==================

Code: Alles auswählen

"""
This is the "example" module.

The example module supplies one function, factorial().  For example,

>>> factorial(5)
120
"""


def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    If the result is small enough to fit in an int, return an int.
    Else return a long.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> [factorial(long(n)) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(30)
    265252859812191058636308480000000L
    >>> factorial(30L)
    265252859812191058636308480000000L
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    >>> factorial(30.1)
    Traceback (most recent call last):
        ...
    ValueError: n must be exact integer
    >>> factorial(30.0)
    265252859812191058636308480000000L

    It must also not be ridiculously large:
    >>> factorial(1e100)
    Traceback (most recent call last):
        ...
    OverflowError: n too large
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result

def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()

============================
the second nenne ich simp_doctest.py

dies braucht eine TXT-Datei
auch OK
================

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
#5.2.1

def _test():
	import doctest
	#doctest.testmod()
	doctest.testfile("simp_example.txt")
	
if __name__ == "__main__":
	_test()

=============
die dazugehörige TXT-Datei wird als simp_example.txt genannt
==============

Code: Alles auswählen

The simp_example module
====================

Using ""factorial"
-------------------

This ist an example text file 
>>> from my_doctest import factorial

Now use it:
>>> factorial(6)
120

===================
Edit (Leonidas): Code in Tags gesetzt.
BlackJack

Das Modul `simp_doctest.py` enthält keine Tests in docstrings. Genau das sagt auch die Fehlermeldung.
Gast

Hallo BJ,

Du hast recht, dort sieht man kein docstrings, aber es ist in eine TXT-Datei versteckt. Wenn man die simp_doctest.py direkt ausführt, bekommt man doch noch ein testcase!

noch eine Idee :roll:

HL
BlackJack

Im Modul sind deshalb trotzdem keine docstrings. Beim importieren wird der Code ja auch gar nicht ausgeführt.

Beim ausführen von `simp_doctest.py` bekommst Du auch keinen Testcase im Sinne von Unit-Testing, sondern Du testest einfach die docstrings in der externen Datei.

Edit:

In der Doku zum `doctest` Modul gibt's auch ein `DocFileSuite` Objekt. Das sollte aus externen Textdateien einen Testcase machen können.
Antworten