一方面,我们有自动化测试,可以检查一个特定的例子。另一方面,我们有基于属性的测试(如 QuickCheck),在这种测试中,我们提供属性,而框架提供示例,但我们可能需要解释如何生成示例。
在这两个极端之间,存在编写单个测试或属性并在多个用户提供的示例上运行的可能性。Haskell 测试领域中存在哪些实用工具,可帮助编写此类参数化测试?
以下是 Python 的 pytest 的一个具体示例。我想检查 `len` 函数对各种输入是否给出正确的输出。这可以通过编写一个单一的测试来完成,该测试检查某个输入的长度是否符合测试者的期望,并使用多个输入示例和相应的预期结果对测试进行参数化。
在Haskell中是否有类似的东西?
在这两个极端之间,存在编写单个测试或属性并在多个用户提供的示例上运行的可能性。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中是否有类似的东西?