我该如何去做这个单元测试?
问题描述:
我不知道如何为我有的代码编写单元测试。我理解代码中发生了什么,但我不知道如何去编写单元测试。我该如何去做这个单元测试?
我已经试过了,但我现在很难过。代码只是打印出一个名字数组,并去除特殊字符。我想测试代码的第一行并测试特殊字符是否被剥离。
firstNameParts = new ArrayList<String>(Arrays.asList(first.split("(|-)")));
System.out.println("Length of First Name Parts: " + firstNameParts.size());
for (int i = 0; i < firstNameParts.size(); i++) {
System.out.println("First Name Part " + i + ":" + firstNameParts.get(i));
// strip out special chars
firstNameParts.set(i,firstNameParts.get(i).replaceAll("[^A-Za-z]+", ""));
System.out.println("Stripped First Name Part " + i + ":" + firstNameParts.get(i));
}
答
为了测试并更好地组织代码,应该将“动作”代码与“渲染”代码分开。这使得每个动作单元都易于测试:
static List<String> extractNameParts(String name) {
return new ArrayList<String>(Arrays.asList(first.split("[ -]")));
}
static String removeSpecialChars(String str) {
return str.replaceAll("[^A-Za-z]+", "");
}
这些显然很容易测试,因为它们只做一件事。
请注意,方法的名称基本上是代码中注释的变体。作为一个经验法则,不是写评论,而是创建一个方法。这样做正式命名代码,使其可重用和可测试。你的代码看起来更整洁,更易读。
下面是它可能是什么样子:
firstNameParts = extractNameParts(first);
System.out.println("Length of First Name Parts: " + firstNameParts.size());
for (int i = 0; i < firstNameParts.size(); i++) {
String namePart = firstNameParts.get(i);
System.out.println("First Name Part " + i + ":" +);
firstNameParts.set(i, removeSpecialChars(namePart);
System.out.println("Stripped First Name Part " + i + ":" + namePart);
}
至于测试的输出,你可以有你的代码打印到指定PrintStream
(其中System.out
就是其中之一),而不是假设代码打印到控制台。然后,您可以让您的测试代码将PrintStream
传递给代码,然后检查其内容。
将要测试的第一部分提取到返回列表的方法,然后测试该方法。 –
“测试代码的第一行并测试特殊字符是否被剥离”:这不是第一行所做的。它只是将字符串分割成由空格或连字符分隔的部分。 – Henry
@亨利字符串被分割在代码的下半部分。第一行做你说的。我解释了它的错误。我只是想知道它如何作为单元测试进行测试。对于这两个步骤。我无法把我的头包在里面。 – Jay