gpt4 book ai didi

recursion - 递归函数的白盒和黑盒测试

转载 作者:行者123 更新时间:2023-12-01 13:22:43 25 4
gpt4 key购买 nike

我学习了迭代函数方面的白盒和黑盒测试。现在我需要对几个递归函数(在 F# 中)进行白盒和黑盒测试。对 gcd 采用以下递归算法:

gcd (m, n)
if (m % n) = 0 then
n
else
gcd n ( m % n)

对于白盒测试:我究竟应该如何覆盖算法的不同分支?天真地可以说有两个分支,但是当函数被调用不止一次时,可能的分支会明显增加。我应该使用会导致不同数量递归调用的参数进行测试,还是我应该如何确定要测试哪些值?

黑盒:我了解了黑盒测试的一般概念。我们应该查看我们可能希望在不了解其内部工作原理的情况下调用该函数的可能值。在这种情况下,我只是不确定我们可能想要用哪些值来调用它。一种方法可能只是从 gcd = 1 的两个值 m 和 n 开始,然后对值 m 和 gcd = 2 直到某个 gcd = n 的任意数字 n 执行相同的操作。这是应该如何处理这件事吗?

最佳答案

首先,我认为对于如何对递归函数进行白盒和黑盒测试没有一个单一的既定定义,但我是这样解释的。

白盒测试。我们希望根据函数的内部工作原理对其进行测试。对于递归函数,我认为这意味着我们要测试它进行的递归调用是否符合我们的预期。一种方法是记录所有递归调用。执行此操作的 gcd 的简单实现添加了一个参数来保存日志并将其与结果一起返回:

let rec gcd log m n = 
let log = (m, n)::log
if (m % n) = 0 then List.rev log, n
else gcd log n (m % n)

现在,对于一些两个参数,比如 54 和 22,您可以手动计算,决定递归调用的参数应该是什么,并为此编写一个测试:

let log, res = gcd [] 54 22
log |> shouldEqual [ (54, 22); (22, 10); (10, 2) ]

黑盒测试。在这里,我们假设我们不知道函数的具体工作原理,因此我们无法测试其内部结构。我们所能做的就是使用一些输入来测试它。考虑极端情况或棘手的输入可能是个好主意,因为这些可能会导致问题。给定一个简单的实现:

let rec gcd m n = 
if (m % n) = 0 then n
else gcd n (m % n)

我可能会为以下内容编写测试:

// A random case where one of the numbers is the result
gcd 100 50 |> shouldEqual 50
gcd 50 100 |> shouldEqual 50

// A random case where the only divisor is 1
gcd 13 123 |> shouldEqual 1
gcd 123 13 |> shouldEqual 1

// The following are problematic and I'm not sure what the right behaviour is
gcd 0 0 // This probably should not be allowed
gcd 10 -5 // This returns -5, but I'm not sure that's what we want

随机测试。您还可以使用随机测试(一种黑盒测试形式)自动生成多个测试用例。我至少可以想到两个随机测试:

  1. 生成两个随机数,ab 并检查 gcd a b = gcd b a。这只是测试一个非常基本的属性,但它可以涵盖相当多的情况。

  2. 选择一个随机数 a 和几个素数 p1, p2, ...。然后将质数分成两组并产生 a*p1*p3*p5a*p2*p4*p6。编写一个测试来检查这两个数字的 GCD 是否为 a

关于recursion - 递归函数的白盒和黑盒测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302471/

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