Django和docfiles中的测试

时间:2011-09-29 08:06:09

标签: python django testing doctest

我的Django测试套件遇到了一个小问题。

我正在开发一个可以在Django和Plone(http://pypi.python.org/pypi/jquery.pyproxy)中运行的Python包。 所有测试都作为doctests编写,可以在Python代码中编写,也可以在单独的docfiles文件中编写(例如README.txt)。

我可以让这些测试运行正常,但Django只是不计算它们:

[vincent ~/buildouts/tests/django_pyproxy]> bin/django test pyproxy
...
Creating test database for alias 'default'...

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

但如果我有一些失败的测试,它会正确显示:

[vincent ~/buildouts/tests/django_pyproxy]> bin/django test pyproxy
...
Failed example:
    1+1
Expected nothing
Got:
    2
**********************************************************************
1 items had failures:
   1 of  44 in README.rst
***Test Failed*** 1 failures.
Creating test database for alias 'default'...

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

这就是我现在宣布测试套件的方式:

import os
import doctest
from unittest import TestSuite

from jquery.pyproxy import base, utils

OPTIONFLAGS = (doctest.ELLIPSIS |
           doctest.NORMALIZE_WHITESPACE)

__test__ = {
    'base': doctest.testmod(
        m=base,
        optionflags=OPTIONFLAGS),

    'utils': doctest.testmod(
        m=utils,
        optionflags=OPTIONFLAGS),

    'readme': doctest.testfile(
        "../../../README.rst",
        optionflags=OPTIONFLAGS),

    'django': doctest.testfile(
        "django.txt",
        optionflags=OPTIONFLAGS),

    }

我想在宣布测试套件时我做错了什么,但我不知道究竟是什么。

感谢您的帮助, 文森特

1 个答案:

答案 0 :(得分:1)

我终于使用suite()方法解决了问题:

import os
import doctest
from django.utils import unittest

from jquery.pyproxy import base, utils

OPTIONFLAGS = (doctest.ELLIPSIS |
               doctest.NORMALIZE_WHITESPACE)

testmods = {'base': base,
            'utils': utils}
testfiles = {'readme': '../../../README.rst',
             'django': 'django.txt'}

def suite():
    return unittest.TestSuite(
        [doctest.DocTestSuite(mod, optionflags = OPTIONFLAGS)
         for mod in testmods.values()] + \
        [doctest.DocFileSuite(f, optionflags = OPTIONFLAGS)
         for f in testfiles.values()])

显然,调用doctest.testfiledoctest.testmod时的问题是测试是直接运行的。 使用DocTestSuite / DocFileSuite构建列表,然后测试运行器运行它们。