想象一下,我已经实现了一个Bar在模块中调用的实用程序(可能是一个类)foo,并为它编写了以下测试.
test_foo.py:
from foo import Bar as Implementation
from pytest import mark
@mark.parametrize(<args>, <test data set 1>)
def test_one(<args>):
<do something with Implementation and args>
@mark.parametrize(<args>, <test data set 2>)
def test_two(<args>):
<do something else with Implementation and args>
<more such tests>
Run Code Online (Sandbox Code Playgroud)
现在想象一下,在未来我希望能够编写相同接口的不同实现.我希望这些实现能够重用为上述测试套件编写的测试:唯一需要改变的是
Implementation<test data set 1>,<test data set 2>等等.所以我正在寻找一种以可重用的方式编写上述测试的方法,这将允许接口的新实现的作者能够通过将实现和测试数据注入其中来使用测试,而无需修改包含测试原始规范的文件.
在pytest中这样做的好方法是什么呢?
================================================== ==================
================================================== ==================
这是一个单元测试版本(不漂亮但是)有效.
define_tests.py:
# Single, reusable definition of tests for the interface. Authors of
# new …Run Code Online (Sandbox Code Playgroud) 这段代码
int clash;
struct Foo {
decltype(clash) clash;
};
Run Code Online (Sandbox Code Playgroud)
在clang上静默编译,但无法在gcc上编译给出错误
错误:'int Foo :: clash'的声明[-fpermissive]
错误:从'int clash'改变'clash'的含义[-fpermissive]
看起来错误需要2个成分:
阴影必须由类成员完成(如果它是函数的本地范围则没有问题).
在声明[阴影名称]之前,必须在阴影范围内使用decltype([阴影名称]).
我的问题是双重的:
考虑以下四种功能(python,numba,cython和smart给定的相同的整数输入时),其计算相同的反应
def python(n):
total = 0
for m in range(1,n+1):
total += m
return total
from numba import jit
numba = jit(python)
cpdef int cython(int n):
cdef int total = 0
cdef int m
for m in range(1, n+1):
total += m
return total
def smart(n):
return n * (n + 1) // 2
Run Code Online (Sandbox Code Playgroud)
他们的执行时间让我感到有些惊讶
numba运行时间独立于n(虽然cython是线性的n)numba 比...慢 smart这立即引发了两个问题:
smart …打字
import pyqtgraph as pg
pg.plot([1,2,3,2,3])
Run Code Online (Sandbox Code Playgroud)
进入标准 Python REPL 将打开一个包含数据图的窗口。在 IPython REPL 或 Jupyter 控制台中输入完全相同的代码,不会打开这样的窗口。
[可以通过键入 来显示该窗口pg.QtGui.QApplication.exec_(),但随后 REPL 会被阻止。
或者,当尝试退出 REPL 并需要确认时,会出现该窗口。
这两点都非常令人不满意。]
如何使用 IPython REPL 进行基本的交互式 pyqtgraph 绘图?
[在 IPython 5.1.0 和 Jupyter 5.0.0 以及 Python 3.5 和 3.6 以及 PyQt4 和 PyQt5(无 PySide)中观察到所描述的行为]
以下示例显示了如何在中将可调用的任意python连接到鼠标运动事件GraphicsWindow。对于按键事件,您将如何做?
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
app = pg.mkQApp()
win = pg.GraphicsWindow()
pl = win.addPlot()
pl.plot([x*x for x in range(-10,11)])
def mouseMoved(evt):
print("Mouse moved event: {}".format(evt))
pl.scene().sigMouseMoved.connect(mouseMoved)
def keyPressed(evt):
print("Key pressed")
# The scene doesn't have an equivalent signal for key presses
# pl.scene().sigKeyPressed.connect(keyPress)
app.exec_()
Run Code Online (Sandbox Code Playgroud) 考虑以下调用 numpy.nextafter
>>> from numpy import nextafter
>>> nextafter( 0.1, -1)
0.099999999999999992
>>> nextafter( 0.1, +1)
0.10000000000000002
>>> nextafter( 1 , -1)
0.99999999999999989
>>> nextafter( 1 , +1)
1.0
>>> nextafter(10 , -1)
9.9999999999999982
>>> nextafter(10 , +1)
9.9999999999999982
Run Code Online (Sandbox Code Playgroud)
我希望第二个参数为正的所有情况都返回一个大于第一个参数的值;并且只要第二个参数小于零,结果就会小于第一个参数。
表现出的行为不符合我的期望,特别是:
这是错误还是功能?
这些示例是在 Python 3.6.1 上使用 Numpy 1.13.1 生成的
一方面,我们有自动化测试,检查一个具体的例子.另一方面,我们在QuickCheck中进行了基于属性的测试,我们提供了属性,而框架提供了示例,但我们可能必须解释如何生成示例.
在这两个极端之间的某个地方是编写单个测试或属性并在多个用户提供的示例上运行它的可能性.Haskell测试环境中有哪些实用程序可以帮助编写这样的参数化测试?
作为一个具体的例子,这里是如何在Python中完成的pytest.我想检查该len函数是否为各种输入提供了正确的输出.这可以通过编写单个测试来完成,该测试检查某些输入的长度是测试人员期望的长度,并使用大量输入示例和相应的预期结果对测试进行参数化.
from pytest import mark
param = mark.parametrize
@param('input, expected',
(('' , 0),
('a' , 1),
('b' , 1),
('ab', 2),
('xx', 3), # deliberate mistake
('xyz', 3),
('aaabc', 5)
))
def test_len(input, expected):
assert len(input) == expected
Run Code Online (Sandbox Code Playgroud)
哪个产生这样的ouptut:
len_test.py::test_len[-0] PASSED [ 14%]
len_test.py::test_len[a-1] PASSED [ 28%]
len_test.py::test_len[b-1] PASSED [ 42%]
len_test.py::test_len[ab-2] PASSED [ 57%]
len_test.py::test_len[xx-3] FAILED [ 71%] (appears red)
len_test.py::test_len[xyz-3] PASSED [ 85%]
len_test.py::test_len[aaabc-5] PASSED [100%]
========================= FAILURES ==========================
______________________ test_len[xx-3] _______________________ …Run Code Online (Sandbox Code Playgroud)