问题标签 [plunit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
328 浏览

unit-testing - XSB Prolog 中的单元测试?

使用 XSB Prolog 的人如何进行单元测试?有图书馆吗?或者是否可以plunit在 XSB 中以某种方式使用 SWI-Prolog 的库?

如果没有可用的 XSB 测试库(或其他不兼容plunit的 Prolog),也许这个问题的一个变体可能是:你如何测试你的 Prolog 代码?您是否使用最喜欢的模式进行测试?

0 投票
0 回答
90 浏览

unit-testing - 在测试运行中忽略静默标志

我目前正在尝试使用PlUnit测试套件,但在测试期间遇到了关闭谓词输出的问题。

文档说我应该对类似的东西没问题set_test_options([silent(true)]).,但这似乎对我的测试运行没有任何影响。

我也尝试将这些选项放入我的load_test_files/1通话中,但它并没有改变任何东西。

如果有人可以提供有关此库的帮助,将不胜感激,因为我似乎误解了文档,并且在尝试查看此处失败的内容时无处可去。

0 投票
1 回答
529 浏览

prolog - prolog 中的代码验证

我将如何为此 Prolog 规则编写测试?

高性能标记 - 这就是我所拥有的。

希望这能让事情变得更清楚一些。

0 投票
2 回答
212 浏览

unit-testing - 在 SWI-Prolog 中声明仅在单个单元测试范围内为真的事实

作为这个问题的一个例子,我有一个非常简单的 Prolog 文件main.pl,我在其中定义了一些形状的颜色。

现在在下面我定义一个 predicate same_colour/2,如果两者S1S2是相同的颜色,这是真的。

顶层测试表明该谓词按预期工作。

我正在尝试使用 SWI-Prologs 单元测试框架plunit编写单元测试same_colour/2,但我想在每个单独的测试中声明仅在该测试范围内为真的事实。我已经尝试将setup选项用于单个测试,以及asserta,这两个都不起作用。以下所有测试均失败。

我也试过:

也就是说,首先声明colour(shape_a, colour_1)并且colour(shape_b, colour_1)是事实,进行测试,然后“取消声明”它们。但是,此测试也失败了。使用trace它似乎colour(shape_a, colour_1)从未被断言(或者至少在我的测试运行时不是真的。)

我现在可以理解为什么前两个测试不起作用了。在第一个我测试是否colour(shape_a, colour_1)为真,当它之前没有被声明时,第二个我只是不认为asserta在谓词定义中使用它是正确的。虽然感觉类似于我的第三次或第四次测试应该能够实现我想要做的事情?

0 投票
1 回答
2817 浏览

prolog - 如何在 prolog 中运行 plunit 测试

plunit在看似最微不足道的情况下,我很难执行测试。这是我的设置:

foo.pl

foo.plt

这在 swipl 中按预期工作:

但我似乎无法让 foo.plt 文件失败

test_something_else测试用例显然应该失败,但 plunit似乎run_tests/0不知道有任何测试要运行。

0 投票
2 回答
2679 浏览

unit-testing - 什么是 PL-Unit 中的“选择点测试成功”警告,我该如何解决?

我正在编写一个 prolog 程序来检查变量是否为 integer。我“返回”结果的方式很奇怪,但我认为这对于回答我的问题并不重要。

测试

我已经为此行为编写了通过单元测试;他们来了...

foo_test.pl

编码

这是通过这些测试的代码......

foo.pl

输出

测试通过了,这很好,但是当我运行它们时收到警告。这是运行测试时的输出...

  • 我正在使用 SWI-Prolog(多线程,64 位,版本 6.6.6)
  • 我尝试count_ints使用 将这两个谓词合并为一个;,但它仍然会产生相同的警告。
  • 我在 Debian 8 上(我怀疑它会有所作为)。

问题

  • 这个警告是什么意思?和...
  • 我该如何预防?
0 投票
1 回答
87 浏览

prolog - 非确定性谓词的 Prolog 单元测试

我正在尝试使用来自http://www.swi-prolog.org/pldoc/doc_for?object=section%28%27packages/plunit.html%27%29的 Prolog 单元测试 它给出了一个非确定性谓词的例子作为

我认为它只是测试列表 X == [a,b,c] 中的所有元素,测试它是否在列表 [a,b,c] 中。但是为什么会

报告wrong "all" answer:

0 投票
1 回答
402 浏览

unit-testing - 在 Prolog 中测试。如何运行单元测试来检查我的输出文件是否与我的文本文件匹配?

我正在使用 prolog (swipl) 实现一个自然语言生成器。

我有一个 .txt 测试文件,其中包含一些我应该能够以这种格式生成的短语:

等等...

我如何使用 plunit (或其他东西?)来检查我的测试文件的所有元素是否都在我的输出文件中返回真/假?

0 投票
1 回答
390 浏览

unit-testing - SWI-Prolog - 单元测试库 plunit - forall 选项如何使用?

对于我的词法分析器(标记器),所有ASCII 7 位字符(0x00 到 0x7F)都有一个特定的标记。由于 SWI-Prolog支持 Unicode,字符代码从 0x0000 到 0xFFFF。

在我的词法分析器中,由于有许多字符不会映射到特定标记,因此存在未知标记 (tokUnknown)。

为了确保代码在 0 到 127(0x00 到 0x7F)之间的所有字符都没有 tokUnknown,需要测试用例。

测试用例需要一个简单的词法分析器将字符转换为标记。

这是代码为 0 的字符的测试用例。

以这种方式编写测试需要 128 个不同的测试来检查tokUnknown.

SWI-Prolog 单元测试库plunit有一个选项forall来生成数据。

根据文档,测试应如下所示:

是否可以使用该forall选项仅编写一个测试用例而不是为该测试系列编写 128 个单独的测试用例?

您可以使用 forall 给出测试用例的工作版本吗?


跟进

forall 的模板是forall(:Generator).

当我第一次看到这个时,我完全糊涂了,几乎走开了回去写大量的测试,但坚持它知道这对于进行参数化测试应该是多么有价值和容易,例如JUnit 5NUnit 3。然后可以使用参数化测试进行模糊测试,并且可以增强模糊测试以生成反例,例如QuickCheckFsCheck


示例 1

在硬编码测试中

我想Code为每个测试创建一个更改的变量。我也知道 的约束Code,即 0 到 127。

因此,对于这个简单的生成器,所需要的只是一个谓词,它在调用时生成从 0 到 127 的值并将它们作为变量返回,例如Code.

between/3满足要求,例如

通过查看答案可以看出,只需将谓词赋予forall,例如


示例 2

该测试是检查所有单独的空白字符或 ASCII 7 位字符的空白字符序列是否返回 astokWhitespace并且空白字符是令牌的字符串值。

带有空格标记的自定义不是在标记中包含字符,但在这里包含它们是因为如果需要更容易删除它们然后想知道为什么 OP 不这样做。因为这是为了学习,所以包括在内。

硬编码测试

在这个例子中,变量是String,例如"\t",令牌中的值tokWhitespace,例如"\t"

单个空白字符是:

从几十年来编写词法分析器/标记化测试中学到的一个教训是,每个单独的字符都需要进行测试。此外,测试不应以与 lexer/tokenizer 中的检查相同的方式生成值。在这种情况下,测试不应该依赖,code_type/2因为它在词法分析器/标记器中使用,并且如果code_type/2在某些地方如何获得错误,测试将无法检测到它。所以测试用例将通过不同的方式获取字符,在这个例子中它们来自一个列表。

从几十年的递归代码测试中学到的第二个教训是,测试需要测试至少三个级别的深度。在此示例中,空白字符的测试将测试最多三个字符的序列。

第三个教训是,将函数组合与组合、排列、类型构造函数和类型析构函数等函数结合使用可以减少编写测试数据生成器的组合爆炸;相反,它们有助于测试用例的组合爆炸。要在 Prolog 中做到这一点,需要将功能概念转换为 Prolog 谓词。

基于这些教训,需要一些辅助谓词。

示例用法:

为了保持阅读forall更简单,创建了一个辅助谓词。

现在在测试中简单地使用生成器forall

用这么少的代码创建并运行所有这些测试(每个点代表一个单独的测试用例)。


示例 3

此示例测试一个非确定性谓词,因此需要使用findall。这也有用于谓词的两个输入参数和两个输出参数。

findall/3 的签名是

使用两个值与finall/3不是Template一个元组,例如(A,B),而是一个列表,例如[A,B],并且Bag是一个列表的列表,例如[["1",1],["2",2]],列表中的每个项目都是结果,内部列表中的项目是相应Template参数的值。

本例测试variation_number/4

0 投票
1 回答
86 浏览

unit-testing - 如何在 Prolog 中将输出捕获到控制台以进行验证?

假设我有一个 hello_name.pl:

我想在我的 plunit 中放入类似的东西