Java TDD,矩阵加法不起作用
真相:开始学习Java课程。这个讲座是关于收藏的,在概念上并没有什么太难的。所有的理论,而不是血液和内脏 实验室,是一系列与讲座完全无关的编码项目(或者大部分是无论如何) 这个实验室是关于测试驱动开发的。具体案文如下: 为执行矩阵的方法编写测试和实现 整数矩阵上的加法,如下所述。请注意,“x”和“y”必须 具有相同的尺寸;生成的矩阵也将具有相同的属性 尺寸Java TDD,矩阵加法不起作用,java,matrix,tdd,Java,Matrix,Tdd,真相:开始学习Java课程。这个讲座是关于收藏的,在概念上并没有什么太难的。所有的理论,而不是血液和内脏 实验室,是一系列与讲座完全无关的编码项目(或者大部分是无论如何) 这个实验室是关于测试驱动开发的。具体案文如下: 为执行矩阵的方法编写测试和实现 整数矩阵上的加法,如下所述。请注意,“x”和“y”必须 具有相同的尺寸;生成的矩阵也将具有相同的属性 尺寸 public int[][] add(int[][] x, int[][] y); 寻找 关于阵列的文档 挑战-在编写实现代码之前编写测试
public int[][] add(int[][] x, int[][] y);
寻找
关于阵列的文档
挑战-在编写实现代码之前编写测试。确保
你对矩阵加法的性质有很好的理解
在您尝试编写代码来执行它之前
有关矩阵加法的详细信息,请参见
以及引用的参考文献。注意矩阵加法的两个特性:
交换性和结合性——测试应该验证这些属性
我的测试代码第一次尝试
package tests;
import static org.junit.Assert.assertTrue;
import code.Homework4Practice;
import org.junit.Before;
import org.junit.Test;
public class ReferenceTests
{
private code.Homework4Practice _class;
@Before
public void setUp()
{
_class = new code.Homework4Practice();
}
@Test
public void addMatrice01()
{
int [][] a = {{1,2}, {1,0}};
int [][] b = {{1,0}, {1,2}};
int [][] expected = {{2,2}, {2,2}};
int [][] actual = _class.addMatrices(a, b);
assertTrue("Calling addMatrices with arguments \""+a+"\" and \""+b+"\" I expected the result to be {2,2} {2,2} but instead the result was " +arrayEquals(expected,actual));
}
private boolean arrayEquals(int[][] expected, int[][] actual) {
if (expected.length != actual.length) {
return false;
}
for (int i=0; i<expected.length; i++) {
if (expected[i] != actual[i]) {
return false;
}
}
return true;
}
}
package code;
public class Homework4Practice
{
public int[][] addMatrices (int[][] a, int[][]b)
{
int[][] answer = new int[a.length][a[0].length];
for (int row = 0; row < a.length; row++)
{
for (int col = 0; col < a.length; col++ )
{
answer[row][col] = a[row][col] + b[row][col];
}
}
return answer;
}
}
包测试;
导入静态org.junit.Assert.assertTrue;
导入代码。家庭作业4实践;
导入org.junit.Before;
导入org.junit.Test;
公共类引用测试
{
私人代码。家庭作业4实践课程;
@以前
公共作废设置()
{
_class=新代码.Homework4Practice();
}
@试验
公共无效addMatrice01()
{
int[]a={{1,2},{1,0};
int[]b={{1,0},{1,2};
int[][]应为{{2,2},{2,2};
int[][]实际值=_class.addMatrix(a,b);
assertTrue(“调用带有参数\“+a+”\”和\“+b+”\”的AddMatrix时,我预期结果为{2,2}{2,2},但结果为“+arrayEquals(预期,实际));
}
专用布尔数组相等(预期为int[]],实际为int[]]{
如果(预期的.length!=实际的.length){
返回false;
}
对于(inti=0;i,您的第一个问题是Java在默认情况下不会漂亮地打印数组,因此您需要编写一个arrayPrint
方法
然后,您可以将assertTrue
更改为以下内容:
`assertTrue("Expected {{2,2},{2,2}}, got " + arrayPrint(actual), arrayEquals(expected, actual));
如果断言失败,那是因为addMatrix
或arrayEquals
没有达到预期效果。断言消息应该会告诉您,然后您可以进行调试
至于如何着手做TDD,理论上你应该对待你的(不成文的)作为一个黑匣子:东西进去了,东西出来了,你不在乎转换是如何发生的。然后你可以为某些输入编写一些测试,测试你期望从盒子里出来的东西。在你的矩阵加法示例中,以下是一个完全合理的TDD测试用例:
Assert addMatrices({{1,2},{1,0}}, {{1,0},{1,2}}) == {{2,2},{2,2}}
换句话说,您的测试用例是完全可以接受的TDD,只要您在编写它时不知道addMatrix
是如何工作的。理论上,您可以使用这套测试来指导您的开发;如果您的测试失败,您应该能够从这些失败测试的输出中了解原因
我在实践中遇到的一个大问题是,如果你不知道函数应该做什么(例如,如果你不知道矩阵加法做什么),为该函数编写测试可能会很困难。如果这种情况发生在您身上,我没有任何好的建议,只能完全按照您所做的去做。我很困惑;您是在问在不知道代码的情况下如何编写测试吗?我想您只是希望在assertTrue()调用中使用逗号。而不是assertTrue(“blah”+arrayEquals(blah))
但是相反,assertTrue(“废话”,arrayEquals(废话))
@Jason Baker:我想是在一个坚果壳里,或者至少是一些有用的轻推。@CarlManaster解决了assertTrue行上的错误,谢谢,但我的测试仍然失败。那么打印出了什么错误呢?