【问题标题】:How to create test cases based off of truth table values?如何根据真值表值创建测试用例?
【发布时间】:2019-10-18 19:45:38
【问题描述】:

我正在从文档中的 spaCy 的令牌创建输出。使用真值表,我需要输出所有可能的场景进行测试。输入的数量可能因输入而异。如果可能的话,我希望以这种方式灵活地进行 3+ 输入:((a 和 b) 或 c)。

每个场景都有其输入的正(真)或负(假)方面(即当设置输入时或当未设置输入时),因为必须检查所有可能的情况。 对于 2 输入场景,目标是以下结果:

输入:当“输入 1 已设置”或“输入 2 不可用”时,则“检测到故障”。

输出:

  1. 案例一:

    • 输入 1 已设置
    • 输入 2 不可用
    • 检测到故障
  2. 案例 2:

    • 输入 1 未设置
    • 输入 2 不可用
    • 检测到故障
  3. 案例 3:

    • 输入 1 已设置
    • 输入 2 可用
    • 检测到故障
  4. 案例 4:

    • 输入 1 未设置
    • 输入 2 可用
    • 未检测到故障

对于 3 个或更多输入,它将成倍增加。

我没有问题将数组或列表中的字符串值格式化/提取为我的输出的正确格式。我的主要问题是通过 n 个输入和混合类型的逻辑进行迭代。

def truth_table(n):
    table = list(itertools.product([False, True], repeat=n))
    print(table)
truth_table(3)

这对我不起作用,因为它只处理输入而不是结果输出。

我考虑过将输入添加为元组,分配值 1 或 0 作为其正或负“版本”的指示符,并将我的真值表定义为 2D 列表。然后遍历真值表的每个位置,并使用指定的输入语句替换 0 和 1 值创建一个新的二维数组。

or_2 = [[0,0,0],
        [0,1,1],
        [1,0,1],
        [1,1,1]]

and_2 = [[0,0,0],
        [0,1,0],
        [1,0,0],
        [1,1,1]]

【问题讨论】:

  • 您需要为每个测试因子表征您的输出集。然后在这些集合上使用itertools.product 来生成所有组合。
  • 感谢您的评论。我知道你要去哪里,但我不清楚我将如何描述我的输出集。它似乎没有包含结果,所以我不知道该怎么做。

标签: python io logic itertools spacy


【解决方案1】:

每个因素的值集(不是“输出”集)是可能值的枚举。在这方面,您的输入似乎非常规范,因为该集合由一个状态字组成,其前面带有/不带有“not”字样。因此,你有集合

A     {"not set", "set"}
B     {"not available", "available"}
out   {"not Detected", "Detected"}

您可以通过分隔符“then”来区分输入和输出。您有 4 个用例,因为 AxB 有 4 个元素。

如果适合您的使用,您可以将这些集合引用为列表或字典。我不确定“x 类型的逻辑”是什么意思;如果您正在解析一个逻辑表达式,那么您需要准确查找该类型的解析器。

在给定的情况下,您需要提取每个子句的信息并将其体现到第三列“out”的正代中。请注意,我假设您的“then”关键字在逻辑上是“iff”。

state_1 = "set"
state_2 = "not available"
op_1 = operator.__or__

table = []
for in1, in2 in itertools.product(A, B):
    val1 = in1 == state_1
    val2 = in2 == state_2
    table.append([val1, val2, op_1(val1, val2)])

输出(`table 的值):

[[False, True, True],
 [False, False, False],
 [True, True, True],
 [True, False, True]]

随着更多的输入和更多的逻辑运算,您将需要转向解析机制并构建这些二元运算的树。

这会让你动起来吗?

【讨论】:

  • 是的,这让我的车轮转动起来了,非常感谢。当我尝试重新创建您的代码时,我在 for 循环中收到了 ValueError。 “没有足够的值来解压,预期 2,得到 1”。我不明白为什么。
  • 那是因为我在代码中添加了一个额外的容器(括号)。查看新代码;还有其他几个错误。
  • 我能够根据您的编辑找出这个示例。非常感谢你。这很有意义。我不太熟悉用 Python 构建树,所以我将不得不研究这个主题。但这是一个很棒的帮助!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多