我有一个名为Menu.java的类,它用作我的程序的接口。用jUnit测试
在这个Menu.java类中,我有一个switch/case块,它充当我的菜单Options。
基本上,我想用jUnit来测试每个case在switch/case块中的输出,但是我正在努力寻找最好的方法来做到这一点。
为每个菜单操作最好有一个单独的jUnit TestCase?然后使用单个TestUnit来运行所有情况?还是有更好的办法可以做到这一点?
非常感谢。
我有一个名为Menu.java的类,它用作我的程序的接口。用jUnit测试
在这个Menu.java类中,我有一个switch/case块,它充当我的菜单Options。
基本上,我想用jUnit来测试每个case在switch/case块中的输出,但是我正在努力寻找最好的方法来做到这一点。
为每个菜单操作最好有一个单独的jUnit TestCase?然后使用单个TestUnit来运行所有情况?还是有更好的办法可以做到这一点?
非常感谢。
一般来说,每个类都有一个相应的测试类。所以你会有一个MenuTest.java来匹配你的Menu.java。这允许您快速查找与特定文件关联的测试,因为命名约定。
然后,理想情况下,每个测试将有一个测试方法与之相关联。因此,如果您的交换机有10个案例,则最终将有10个测试方法,每个案例一个。这使您可以快速找出发生故障的选项,因为您可以分别获得每个测试的反馈。
请注意,TestCase是JUnit 3.如果可能,请使用JUnit 4测试(org.junit。*),这些注释将使用@Test注释进行注释。
我会为每个可能的工作流程使用单个测试用例。理想情况下,每个测试用例都会有一个断言,根据这个指南可能会更容易。一般来说,你想保持你的单元测试小而简洁。
然后我会把所有的测试用例放在同一个测试类中,只要它们属于同一个测试类。
我会为Menu.java(MenuTest.java)创建一个类。我会为每个菜单选项编写一个测试用例。如果你有GUI的东西,将其与逻辑分开。
无需测试GUI或其管道。
在你的情况下,我会为所有选项使用单个测试用例。你需要的东西是这样的:
import org.junit.Test;
import org.junit.Assert;
import your.project.Menu;
public class MenuTest {
@Test
public void testCase() {
Menu menu = new Menu();
assertEquals("1",menu.runCase("bar"));
assertEquals("2",menu.runCase("foo"));
//etc
}
}
如果您正在测试此交换机接收不同参数的方法,可以考虑使用一个参数化测试用例。其优点是,它更容易跟踪的需要,如果你的开关改变而改变什么:
这里是如何与TestNG工作(查找“参数化测试案例”的JUnit)
// This method will provide data to any test method that declares that
// its Data Provider is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Foo", new Integer(36) },
{ "Bar", new Integer(37)},
};
}
// This test method declares that its data should be supplied by the
// Data Provider named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
这是将所有断言包含在一个测试用例中的做法非常糟糕。如果第一个失败,你不知道其余的会通过还是失败。它也使得你的测试用例无法独立,因为它们都处于一种测试方法中。查看所有其他答案。 – Kane
@凯恩我不同意你的看法。目标是测试具体的方法。所以测试用例正在测试它,它不需要多少断言。此外,我看到丑陋的每一个不必要的样板方法都有自己的调用不同的参数和预期结果的相同功能。 – dhblah
每种方法可以有多个测试用例。事实上,这是一个很好的做法,因为给定的方法可能有很多可能的路径,并且单独的测试用例要好得多。将所有断言填充到一个方法中会留下前面提到的问题:如果失败,您不知道事后发生的断言的状态。 – Kane