java - JUnit如何测试多个函数

标签 java unit-testing testing junit

我的问题是:如果我有一个方法来测试,让我们说一个代表一个人的对象的构造函数: public void Person(String name){this.name = name;},创建一个这样的测试用例是不是很愚蠢:

public class PersonTest {

@Test
public void testPerson() throws myException{
    // First thing I want to test
    try {
        new Person("name to looooooooooooooong");
        fail("This test was supposed to throw an exception: name too long");
    } catch (Exception e) {
        if (e instanceof myException)
            assertEquals("MSG: name not valid!", "Name not valid", e.getMessage());
    }
    //Second thing I want to test
    try {
        new Person("name to short");
        fail("This test was supposed to throw an exception: name too short");
    } catch (Exception e) {
        if (e instanceof myException)
            assertEquals("MSG: name not valid!", "Name not valid", e.getMessage());
    }
    //Oter things I want to test ...
}

或者我应该为每个对象创建一个测试套件,为每个要测试的方法创建一个测试用例吗?但是如果我想测试一个方法的多个参数怎么办?我应该为每个案例编写一个测试用例吗?喜欢:

  • 一个名字太长的测试用例
  • 一个名称太短的测试用例
  • 一个名称包含数字的测试用例 等等?

最佳答案

关于构造函数.. 如果有可能根据输入抛出异常,那么对其进行测试就可以了。

一般来说,如果有任何逻辑被认为很重要,那么您应该选择对这些代码部分进行单元测试。你必须聪明,但不要测试太多,因为在某个时候,如果覆盖率超过 60/70%,这意味着你已经测试了最重要的逻辑,你将达到 yield 递减的地步,因为测试更多意味着更多浪费时间而不是实际 yield 。

关于 :

one test case for a name too long

one test case for name too short one

test case for name containing numbers and so on ?

这听起来不错,因为您希望测试覆盖方法中的一个逻辑路径……最好不要再覆盖更多。如果您确实开始测试更多的东西,那么您最终会得到很多臃肿的测试用例,这将难以调试、理解和维护。

具有一个/两个公共(public)方法和一套专门测试的小类将是理想的。

还有一件事要记住,如果可能,请尝试对每个测试用例进行参数化,这样您就可以为每个测试挤出尽可能多的可能性。

我强烈建议使用这样的项目:Junit Data Provider编写您的参数化案例。我已经使用它几年了,它比内置的 junit 参数化(如果你真的说有的话)让事情变得容易得多。

关于java - JUnit如何测试多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42808573/

相关文章:

javascript - Sinon.JS 的 stub.callsArg(index) 是做什么的?

c# - 如何使用 `using` 语句对方法进行单元测试?

java - 在运行时查看方法调用 java jar 文件

java - Apache Camel 测试在使用camel-archetype-blueprint 创建的项目中失败

java - MyBatis 中的多种返回类型?

java - java中的URL验证

java - 创建 session 和 cookie 之间的区别?

java - IntelliJ IDEA - 如何折叠 else block 和 catch block 默认值?

android - 使用 RxJava 测试 Android Realm - "opened from a thread without a Looper"异常

testing - 是否有必要在所有浏览器上运行自动化脚本(例如 Selenium 脚本)?