我想学习TDD,以便在科学编程(量子化学(中使用线性代数(或基本上使用矩阵(。然而,由于中间体是未知的,有时唯一已知的是最终结果,我不知道如何做到这一点。
你能告诉我你将如何在上面的例子中做TDD吗?
for i,j = start1:end1, k,l = start2:end2
A[i,j] = B[i,k] * C[k,l] * D[l,j]
end
其中A是在函数中计算的新矩阵
其中B C D是预定义的矩阵
其中start1、start2、end1、end2是预定义的整数。
在通常的程序中,我有大约20个这样的块。所以我想我对新的A一无所知。
我遇到的大多数错误都是简单的打字错误,比如
B[k,i]
而不是上述
如果最终结果是错误的,我唯一能做的调试方案是把所有东西都写两次,然后检查两个A,希望我没有两次犯同样的打字错误。
你能告诉我在上面的例子中你将如何进行TDD吗?
好消息是,您正在从根本上处理一个函数。
A = function(B,C,D,start1,end1,start2,end2)
我认为引入测试有两种通用方法
1( 从简单的问题开始——一个接一个的矩阵,单位矩阵;每次你计算出答案应该是什么,并检查功能是否产生了正确的答案
2( 从简单的验证开始-你可以从确保答案具有正确的行和列数开始,将其中一个输入加倍将输出加倍,等等。Nat Pryce对Diamond Kata的演示应该会让你了解这可能是如何工作的。
我用来测试矩阵乘法例程的一种技术是使用只有一个1的矩阵,其他都是零。设E(i,j(为矩阵
E(i,j)[k,l] = delta(i,k)*delta(j,l)
(在[i,j]处有1,在其他地方有0(代数表明
E(i,j)*E(i',j') = delta(j,i')*E(i,j')
测试是为了检查乘法例程是否获得所有具有nxn矩阵的pow(n,4(元组i,j,i',j'的写答案。
我的一个朋友向我展示了如何测试这些函数
这是通过模拟矩阵来完成的
你可以想象
B[i,k]
作为
function B(i,k):
return B[i,k]
现在,您可以通过创建一个跟踪输入的列表来测试这些
这将提供以下功能。
function B(i,k):
list.append(i,k)
return B[i,k]
然后可以根据哪个索引更快来测试这个列表。这首先取决于列或行,以及如何定义循环,但您要么会得到以下内容:
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
或
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3
现在,问题函数中的B[i,k]
和B[k,i]
将生成不同的列表,因此您可以检测错误,从而进行测试。