我开始common test
在 erlang 中用作我的测试框架。
假设我有一个函数,我希望只接受正数,并且在任何其他情况下它都会崩溃。
positive_number(X) when > 0 -> {positive, X}.
我想测试一下
positive_number(-5).
不会成功完成。
我如何测试这种行为?在其他语言中,我会说测试用例预计会出现一些错误或异常,并且如果它在测试中的功能不会为无效的无效参数抛出任何错误,则会失败。如何通过普通测试做到这一点?
更新:
我可以让它工作
test_credit_invalid_input(_) ->
InvalidArgument = -1,
try mypackage:positive_number(InvalidArgument) of
_ -> ct:fail(not_failing_as_expected)
catch
error:function_clause -> ok
end.
但我认为这太冗长了,我想要类似的东西:
assert_error(mypackage:positive_number, [-1], error:function_clause)
我假设通用测试在某个地方有这个,并且我对框架缺乏适当的了解,这使我采取了如此冗长的解决方案。
更新: 受迈克尔回应的启发,我创建了以下函数:
assert_fail(Fun, Args, ExceptionType, ExceptionValue, Reason) ->
try apply(Fun, Args) of
_ -> ct:fail(Reason)
catch
ExceptionType:ExceptionValue -> ok
end.
我的测试变成了:
test_credit_invalid_input(_) ->
InvalidArgument = -1,
assert_fail(fun mypackage:positive_number/1,
[InvalidArgument],
error,
function_clause,
failed_to_catch_invalid_argument).
但我认为它只是有效的,因为assert_fail
调用比try....catch
在每个测试用例中都更具可读性。
我仍然认为 Common Test 中应该存在一些更好的实现,IMO 在每个项目中重复实现这个测试模式是一种丑陋的重复。