Lowdown:开始Java课程。讲座一直是关于收藏的,在概念上没什么太难的。所有理论,不是血液和胆量编码。
实验室,已经完成了一系列完全与讲座无关的编码项目(或者大部分都是如此)。本实验是关于测试驱动开发的。确切文本是这样的:
为执行矩阵的方法编写测试和实现 在整数矩阵上加法,如下所述。请注意" x"和" y"必须 具有相同的尺寸;得到的矩阵也会有相同的 尺寸。
public int[][] add(int[][] x, int[][] y);
请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html 关于数组的文档。
挑战 - 在编写实现代码之前编写测试。确保 您对矩阵添加的属性有很好的理解 在您尝试编写代码以执行它之前。
有关矩阵添加的更多信息,请参阅http://mathworld.wolfram.com/MatrixAddition.html 和那里引用的参考文献。注意矩阵加法的两个属性: 交换性和结合性---你应该验证这些属性。
我的测试代码首次尝试
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;
}
}
显然我遇到了assertTrue行的问题。
现在,我知道我遇到了麻烦,因为我必须实际编写代码(并查找)以添加矩阵,我知道如何从其他类中执行此操作,但我无法正确编写代码第一。所以这就是代码看起来像我正在尝试开发测试:
我要测试的代码
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;
}
}
由此我不知道如何真正去做这件事。似乎有很多关于TDD的在线资源,但我不确定如何在这里应用它。时间正在压倒我,我似乎无法在其他任何地方得到帮助。
我完全理解并理解TDD的重要性,但它在实施中显然无法实现。
感谢任何帮助人员。
答案 0 :(得分:1)
您的第一个问题是Java默认情况下不会打印出数组,因此您需要编写arrayPrint
方法。
然后,您可以将assertTrue
更改为以下内容:
`assertTrue("Expected {{2,2},{2,2}}, got " + arrayPrint(actual), arrayEquals(expected, actual));
如果你的断言失败,那是因为你的addMatrices
或arrayEquals
没有做到你所期望的。断言消息应告诉您哪个,然后您可以调试。
关于如何进行TDD,从理论上讲,你应该将你的(不成文的)功能视为一个黑盒子:东西进入,东西出来,你不关心这种转变是如何发生的。然后,您可以针对某些输入编写一些针对期望开箱即用的测试。在您的矩阵添加示例中,以下将是一个完全合理的TDD测试用例:
Assert addMatrices({{1,2},{1,0}}, {{1,0},{1,2}}) == {{2,2},{2,2}}
换句话说,只要您在编写时不知道addMatrices
如何工作,您的测试用例就完全可以接受TDD,。从理论上讲,您可以使用这套测试来指导您的开发;如果您未通过测试,您应该能够从失败测试的输出中了解原因。
我在实践中遇到的一个大问题是,如果你不知道该函数应该做什么(例如,如果你不知道矩阵的加法是什么),它可以难以为该功能编写测试。如果发生这种情况,除了你所做的事情之外,我没有任何好的建议。