我正在尝试将我的SWI Prolog应用程序迁移到GNU Prolog中。不幸的是,我在单元测试方面有一个问题。在SWIPL中,我们可以简单地使用plunit模块并编写像下面这样的测试用例:
:- begin_tests(my_tests).
test(my_predicate_test) :- my_predicate(Result), assertion(Result == [foo, bar]).
test(second_test) :- foo(10, X), assertion(X == "hello world").
:- end_tests(my_tests).
但是如何在GNU Prolog中实现单元测试?甚至一些额外的库,如crisp,也不能用于gprolog。
您可以使用lgtunit
。这里总结了它的主要特点。大多数测试都可以按原样运行,或者很容易转换。使用您的示例:
:- object(tests, extends(lgtunit)).
:- uses(lgtunit, [assertion/1]).
:- uses(user, [my_predicate/1, foo/2]).
test(my_predicate_test) :-
my_predicate(Result),
assertion(Result == [foo, bar]).
test(second_test) :-
foo(10, X),
assertion(X == "hello world").
:- end_object.
该工具支持多种测试方言,其中一些是plunit
常见的。例如
:- object(tests, extends(lgtunit)).
:- uses(user, [my_predicate/1, foo/2]).
test(my_predicate_test, true(Result == [foo, bar]) :-
my_predicate(Result).
test(second_test, true(X == "hello world")) :-
foo(10, X).
:- end_object.
假设你正在测试普通的Prolog代码(假设你正在使用GNU Prolog), Logtalk的Prolog标准遵从套件提供了大量的示例。
您还可以导出多种行业标准的测试结果,如TAP和xUnit,并生成报告以方便浏览(参见例如https://infradig.github.io/trealla/)。
有关测试的进一步建议,请参阅这些博客文章。