2017-04-13 80 views
1

我不知道如何为我有的代码编写单元测试。我理解代码中发生了什么,但我不知道如何去编写单元测试。我该如何去做这个单元测试?

我已经试过了,但我现在很难过。代码只是打印出一个名字数组,并去除特殊字符。我想测试代码的第一行并测试特殊字符是否被剥离。

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)); 
} 
+0

将要测试的第一部分提取到返回列表的方法,然后测试该方法。 –

+0

“测试代码的第一行并测试特殊字符是否被剥离”:这不是第一行所做的。它只是将字符串分割成由空格或连字符分隔的部分。 – Henry

+0

@亨利字符串被分割在代码的下半部分。第一行做你说的。我解释了它的错误。我只是想知道它如何作为单元测试进行测试。对于这两个步骤。我无法把我的头包在里面。 – Jay

回答

1

为了测试并更好地组织代码,应该将“动作”代码与“渲染”代码分开。这使得每个动作单元都易于测试:

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传递给代码,然后检查其内容。