gpt4 book ai didi

language-agnostic - 我应该编写直接将输入映射到输出的测试,还是动态生成结果?

转载 作者:行者123 更新时间:2023-11-28 19:59:35 25 4
gpt4 key购买 nike

在我看来,写测试用例有两种方式:

  1. 将固定输入映射到固定输出并断言它们匹配
  2. 将生成的或固定的输入映射到动态输出并断言它们匹配

# Static testing:
assert_equal "test".upcase, "TEST"

# Dynamic testing:
assert_equal person.full_name, "#{person.title} #{person.first_name} #{person.last_name}"

当然,每种方法都有利有弊。复制实现细节感觉不对,但允许我生成示例数据并对其运行测试。硬编码值使正确的输出非常明确,但似乎并不适合重用代码。

前者是编写测试的常规方式吗?你混合搭配方法吗?后一种方法是否因为我没有想到的充分理由而被避免?

最佳答案

第二种方法,使用类似 check 的工具或 quickcheck ,但是……

Duplicating implementation details feels wrong

如果你复制那么你做错了。在你的代码中,你写下任务是什么以及如何精确地执行任务。在测试中,您给出了一些关于结果的不变量。

编辑

关于已知答案测试 (KAT) 的注释

与大多数概括一样,这在某些情况下并不适用。 KAT 在随机测试向量上占主导地位的一大领域是密码学(例如 block 密码),因为在大多数类型系统强制执行的内容(例如 block 大小)之外不应该有许多可见的不变量。要检查的一个属性是 decrypt(key,encrypt(key,msg)) == msg .

简单几何有一个稍微不同的问题,因为没有一组不变量真的是一个很好的检查 - 你可以说 0 < area(triangle) < triangle.width * triangle.height但这同样糟糕。我在这里的意思是,您应该为稍微更高级别的代码编写测试 - 一些更复杂的代码,实际上很有可能发生更改或被误认为是错误的。

随机测试向量的情况指示快速检查属性的好地方的一些代码属性包括

  1. 决定论
  2. 重要的
  3. 明确的不变量

使用串联的简单示例(将两个串联的列表组合成一个新列表):

假设我有一个函数 concat(xs,ys) = xs ++ ys .我可以检查什么?任何我希望是真的!长度?是的!元素?是的!

prop_len(xs,ys) = len(xs) + len(ys) = len(concat(xs,ys))
prop_elem(xs,ys) =
let cs = concat(xs,ys)
elem(head xs, cs) && elem(head ys, cs) && prop_elem(tail xs,ys) && prop_elem(xs,tail ys)
// Yes, I left out the error checking for empty list, sue me.

明白了吗?

关于language-agnostic - 我应该编写直接将输入映射到输出的测试,还是动态生成结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com