我正在考虑测试一些算法的实现
如果您考虑TDD / BDD焦点......测试将是
Scenario: doubling search
Given an ordered array "[2,3,4,5,6,7]"
When I look for "4" with "doubling search" in it
Then the result must be "2"
我想确保我的算法运行良好......那么,您将如何测试算法实现?
答案 0 :(得分:3)
您以相同的方式测试算法的每个实现:获取输入,手动计算您的预期输出,并将其与算法为您提供的输出进行比较。
如果您使用带接口的语言执行此操作,则可以使用类型接口的参数进行通用测试,并让实际测试通过您的实现调用它。这可确保所有算法都根据其界面进行相同的测试。
// double search implemented by using the search and multiplying by 2
algorithm multDoubleSearch
define input array
define input search
for each i in array
if i = search * 2
return index of i
end
return -1
end.
// double search implemented by dividing the values by 2
algorithm divDoubleSearch
define input array
define input search
for each i in array
if i / 2 = search
return index of i
end
return -1
end.
test mytest
define array {2 3 4 5 6 7}
define search 2
define resultMult = multDoubleSearch(array,search)
assert resultMult == 2 // 4 is index 2, assuming 0 indexed
define resultDiv = divDoubleSearch(array,search)
assert resultDiv == 2 // 4 is index 2, assuming 0 indexed
end.
答案 1 :(得分:2)
这取决于你手边有什么。
除了通常的测试,你手动提供输入和输出来测试极端情况和一些其他输入(参见JUnit或类似的框架,实际上任何流行的语言),你也可能写一个低效但简单的版本的算法(或者确切地说是产生相同结果的任何东西,通常不是完全相同的算法)并针对所有可能的输入进行测试,或者如果使用Fuzztester和一些随机化不可能。
后者的一个例子是针对SelectionSort测试复杂的排序算法(比如说heapsort)。如果你优化代码并且已经有一个经过试验和测试的版本(这本身就是一种递归问题),这也很有效。
在您的特定情况下,您可以将您的版本与简单的二进制搜索进行比较 - 标准库当然已经具有这种搜索 - 使用随机输入创建随机大小的数组也不应该是一个问题。