- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我用nose做测试采集,也想用它的doctest插件。我有一个模块需要固定装置才能导入。因此,我不能使用 nose 的模块固定装置,因为它们是从被测模块加载的。有没有办法在模块外为 nose-doctest 指定模块固定装置?
对于某些用例,一个选项是检测是否在 doctest 下运行并在模块开头应用夹具。我也有兴趣听到这个用例的答案。
但是,在某些情况下这是行不通的:当导入由于 SyntaxError
而失败时,任何模块代码都不会运行。就我而言,我主要开发与 python 2 和 python 3 兼容的代码(没有 2to3
)。然而,有一些特定于 python 3 的模块,当在 python 2 下运行时,根本不应该用 Nose 检查它们。我最好的选择是什么?
编辑:MWE(针对 SyntaxError
情况)
我有一个包含许多小模块的包,其中一些使用 python 3 语法。这是包结构:
~/pckg/
__init__.py
py3only.py
... (other modules)
tests/
test_py3only.py
有些测试写成unittest.TestCase
,但我也想测试文档字符串中的代码示例。 ~/pckg/__init__.py
是空的。
~/pckg/py3only.py:
def fancy_py3_func(a:"A function argument annotation (python 3 only syntax)"):
""" A function using fancy syntax doubling it's input.
>>> fancy_py3_func(4)
8
"""
return a*2
~/pckg/tests/test_py3only.py:
import sys, unittest
def setup_module():
if sys.version_info[0] < 3:
raise unittest.SkipTest("py3only unavailable on python "+sys.version)
class TestFancyFunc(unittest.TestCase):
def test_bruteforce(self):
from pckg.py3only import fancy_py3_func
for k in range(10):
self.assertEqual(fancy_py3_func(k),2*k)
在 python 3 上测试,所有内容都经过测试并通过(从封闭文件夹运行,例如 ~
):
~ nosetests3 -v --with-doctest pckg
Doctest: pckg.py3only.fancy_py3_func ... ok
test_bruteforce (test_py3only.TestFancyFunc) ... ok
在 python 2 上,~/pckg/tests/test_py2only.py
的模块 fixture 正确检测到情况并跳过测试。但是,我们从 ~/pckg/py3only.py
得到一个 SyntaxError
:
~ nosetests -v --with-doctest pckg
Failure: SyntaxError (invalid syntax (py3only.py, line 1)) ... ERROR
SKIP: py3only unavailable on python 2.7.6 (default, Mar 22 2014, 22:59:56)
类似于 ~/pckg/tests/test_py3only.py:setup_module()
的函数可以解决这个问题,如果我能让 nose
在它运行之前运行该代码doctest 插件甚至尝试导入该模块。
看来我最好的选择是编写一个适当的顶级测试脚本来处理测试的集合...
最佳答案
可以使用 nose-exclude 排除特定的测试文件、目录、类或方法 Nose 插件。它有 --exclude-*
选项。
要处理丢失的模块,您必须使用 mock
修补 sys.modules
。
F.e,mycalc
模块中有一个 Calc
类,但我无法访问它,因为它丢失了。还有两个模块,mysuper_calc
和 mysuper_calc3
,后者是 Python 3 特定的。这两个模块导入 mycalc
和 mysuper_calc3
不应该在 Python 2 下进行测试。如何在模块外对它们进行 doctest,这是在纯文本文件中?我认为这是OP的情况。
计算/mysuper_calc3.py
from sys import version_info
if version_info[0] != 3:
raise Exception('Python 3 required')
from mycalc import Calc
class SuperCalc(Calc):
'''This class implements an enhanced calculator
'''
def __init__(self):
Calc.__init__(self)
def add(self, n, m):
return Calc.add(self, n, m)
计算/mysuper_calc.py
from mycalc import Calc
class SuperCalc(Calc):
'''This class implements an enhanced calculator
'''
def __init__(self):
Calc.__init__(self)
def add(self, n, m):
return Calc.add(self, n, m)
现在模拟mycalc
,
>>> from mock import Mock, patch
>>> mock = Mock(name='mycalc')
模块 mycalc
有类 Calc
,它有方法 add
。我用 2+3
测试 SuperCalc
实例 add
方法。
>>> mock.Calc.add.return_value = 5
现在可以在 with
block 中有条件地导入补丁 sys.modules
和 mysuper_calc3
。
>>> with patch.dict('sys.modules',{'mycalc': mock}):
... from mysuper_calc import SuperCalc
... if version_info[0] == 3:
... from mysuper_calc3 import SuperCalc
计算/doctest/mysuper_calc_doctest.txt
>>> from sys import version_info
>>> from mock import Mock, patch
>>> mock = Mock(name='mycalc')
>>> mock.Calc.add.return_value = 5
>>> with patch.dict('sys.modules',{'mycalc': mock}):
... from mysuper_calc import SuperCalc
... if version_info[0] == 3:
... from mysuper_calc3 import SuperCalc
>>> c = SuperCalc()
>>> c.add(2,3)
5
文件 mysuper_calc_doctest.txt
必须在其自己的目录中单独存在,否则 nosetests
在非测试模块中搜索 doctest
。
PYTHONPATH=.. nosetests --with-doctest --doctest-extension=txt --verbosity=3
Doctest:mysuper_calc_doctest.txt ... 好
在 0.038 秒内运行 1 个测试
好的
围绕 nosetests
的包装器,用于检测 Python 3,它将没有语法错误的 .py 文件传递给 nosetests
mynosetests.py
import sys
from subprocess import Popen, PIPE
from glob import glob
f_list = []
py_files = glob('*py')
try:
py_files.remove(sys.argv[0])
except ValueError:
pass
for py_file in py_files:
try:
exec open(py_file)
except SyntaxError:
continue
else:
f_list.append(py_file)
proc = Popen(['nosetests'] + sys.argv[1:] + f_list,stdout=PIPE, stderr=PIPE)
print('%s\n%s' % proc.communicate())
sys.exit(proc.returncode)
关于python - 导入模块前的 nose-doctest 模块夹具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26440574/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!