如何使用 PlUnit 改进错误报告?
How can I improve error reporting using PlUnit?
我正在使用 SWI-Prolog 编写测试 PlUnit 并希望提供更好的错误消息,也许是通过区分我所得到的与我所期望的。
以下最小工作示例 (MWE) 举例说明了我所追求的:
:- module(mwe, [parse_int/2]).
parse_int(Str, Num) :- number_string(Num, Str):
:- begin_tests(mwe).
:- use_module(mwe).
testcase("1", 1).
testcase("10", 10).
testcase("100000000000", 10000000000). % Oops
test("parse int", [forall(testcase(Text, Want))]) :-
parse_int(Text, Got),
assertion(Got = Want).
:- end_tests(mwe).
输出为:
% PL-Unit: mwe ..
ERROR: /home/bkim/Projects/swifun/mwe.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): assertion failed
Assertion: 100000000000=10000000000
false.
A differ,类似于 go-cmp,可以呈现如下结果:
- 100000000000
+ 10000000000
哪个比较容易一目了然
我找不到对一般 Prolog 术语执行此类检查的任何东西,越接近 edit distance between lists 的示例。
您应该将比较移动到测试规则的头部:
test("parse int", [forall(testcase(Text, Want)), Got = Want]) :-
parse_int(Text, Got).
这样可以更明确地表达您希望测试表达的内容。它允许 PlUnit 提供更多信息输出:
ERROR: /home/isabelle/foo.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): wrong answer (compared using =)
ERROR: Expected: 10000000000
ERROR: Got: 100000000000
我正在使用 SWI-Prolog 编写测试 PlUnit 并希望提供更好的错误消息,也许是通过区分我所得到的与我所期望的。
以下最小工作示例 (MWE) 举例说明了我所追求的:
:- module(mwe, [parse_int/2]).
parse_int(Str, Num) :- number_string(Num, Str):
:- begin_tests(mwe).
:- use_module(mwe).
testcase("1", 1).
testcase("10", 10).
testcase("100000000000", 10000000000). % Oops
test("parse int", [forall(testcase(Text, Want))]) :-
parse_int(Text, Got),
assertion(Got = Want).
:- end_tests(mwe).
输出为:
% PL-Unit: mwe ..
ERROR: /home/bkim/Projects/swifun/mwe.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): assertion failed
Assertion: 100000000000=10000000000
false.
A differ,类似于 go-cmp,可以呈现如下结果:
- 100000000000
+ 10000000000
哪个比较容易一目了然
我找不到对一般 Prolog 术语执行此类检查的任何东西,越接近 edit distance between lists 的示例。
您应该将比较移动到测试规则的头部:
test("parse int", [forall(testcase(Text, Want)), Got = Want]) :-
parse_int(Text, Got).
这样可以更明确地表达您希望测试表达的内容。它允许 PlUnit 提供更多信息输出:
ERROR: /home/isabelle/foo.pl:11:
test parse int (forall bindings = ["100000000000",10000000000]): wrong answer (compared using =)
ERROR: Expected: 10000000000
ERROR: Got: 100000000000