【发布时间】:2019-01-11 14:38:12
【问题描述】:
一方面,我们有检查一个特定示例的自动化测试。另一方面,我们有基于属性的测试,例如 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
产生这样的输出:
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] _______________________
len_test.py:15: in test_len
assert len(input) == expected
E AssertionError: assert 2 == 3
E + where 2 = len('xx')
============ 1 failed, 6 passed in 0.04 seconds =============
Haskell 中有类似的东西吗?
【问题讨论】: