我想用pytest编写一个测试,当函数在不同的运行中有不同的结果时会失败。一个简单的例子是hash("abc")
在终端上:
$> python -c 'print(hash("abc"))'
7757446167780988571
$> python -c 'print(hash("abc"))'
-1754122997235049390
然而,在一次运行中,我们当然有:
>>> hash("abc")
-2233283646379253139
>>> hash("abc")
-2233283646379253139
我如何编写一个测试(使用pytest)来测试使用不同进程/运行的函数结果的一致性,以便hash("abc")
失败?
背景是我实现了一个DB访问函数,它比较了pickle / dilled字典的二进制字符串。但是,对于同一个字典,这些字符串会因运行而异。 我想测试一致性,因为如果dict已经在函数中,函数不应该添加到数据库中。
答案 0 :(得分:0)
它是一个被黑客攻击的解决方案,但您可以使用流程来实现目标。
import subprocess
def test_hash():
# Create the command
cmd = ['python', '-c', 'print(hash("abc"), end="")']
# Run a sub-process
other_hash = subprocess.check_output(cmd)
assert hash('abc') != int(other_hash)
答案 1 :(得分:0)
基于Dov Benyomin Sohacheskis的回答,我最终得到了以下解决方案来解决测试函数与测试夹具和所有函数的一致性的更复杂的问题。
我会在这里发布,因为它也可能对其他人有帮助。
我假设fixture
将args
和kwargs
保存到要测试的函数中。
import tempfile
import dill
import functools
import subprocess
def test_consistency_of_f(fixture):
args, kwargs = fixture
f = functools.partial(function_to_be_tested, *args, **kwargs)
with tempfile.TemporaryDirectory() as td:
fn = os.path.join(td, 'test.dill')
with open(fn, 'wb') as fi:
dill.dump(f, fi)
cmd = """import dill
with open('{}', 'rb') as fi:
f=dill.load(fi)
print(f())
""".format(fn)
cmd = ['python', '-c', cmd]
s1 = subprocess.check_output(cmd)
s2 = subprocess.check_output(cmd)
if not s1 == s2:
print(1, s1)
print(2, s2)
assert s1 == s2