如何使用 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