如何入门Junit?请提供建议。

3
我以前没有使用过Junit,也没有进行自动单元测试。 场景:我们正在将后端DAO从Sql Server更改为Oracle。因此,在数据库端,所有存储过程都已转换为Oracle。现在,当我们的代码调用这些Oracle存储过程时,我们希望确保返回的数据与Sql Server存储过程相同。
例如,我在DAO中有以下方法:
  //this is old method. gets data from sql server
  public IdentifierBean getHeadIdentifiers_old(String head){
      HashMap parmMap = new HashMap();
      parmMap.put("head", head);
      List result = getSqlMapClientTemplate().queryForList("Income.getIdentifiers", parmMap);
      return (IdentifierBean)result.get(0);
   }
  //this is new method. gets data from Oracle  
  public IdentifierBean getHeadIdentifiers(String head){
      HashMap parmMap = new HashMap();
      parmMap.put("head", head);
      getSqlMapClientTemplate().queryForObject("Income.getIdentifiers", parmMap);
      return (IdentifierBean)((List)parmMap.get("Result0")).get(0);
   }

现在我想编写一个 Junit 测试方法,该方法首先调用 getHeadIdentifiers_old,然后调用 getHeadIdentifiers,并比较返回的对象(必须在 IdentifierBean 中重写 equals 和 hash)。只有当两个对象相同时,测试才会通过。
在测试方法中,我将为这两个方法提供一个参数(在本例中为 head)...现在手动完成。是的,从前端传递的参数可能不同,并且 SP 可能无法返回这些参数的确切结果。但我认为拥有这些测试用例将使我们感到放心,它们返回相同的数据...
我的问题是:
  • 这是一个好方法吗?
  • 我将有多个 DAO。我是否应在 DAO 内部编写测试方法,还是对于每个 DAO 我都应该有一个单独的 JUnit 测试类?
  • (可能是 n00b 问题) 所有测试用例都会自动运行吗?我不想去前端点击一堆东西,以触发对 DAO 的调用。
  • 当运行测试时,我会发现哪些方法失败了吗?对于失败的方法,它会告诉我哪个测试方法失败了吗?
  • 最后,有什么好的起点吗?任何教程、文章都可以展示如何使用 Junit。
4个回答

3

好的,让我们看看可以做些什么...

这是一个好方法吗?

不太好。因为现在你有两个代码路径,它们的功能不相等且难以预测,而不是只有一个陈旧的代码路径具有某种已知的功能。通常,首先应该为遗留代码创建全面的单元测试,然后重构原始方法以避免大量的重构——如果组成庞大应用程序的代码丛林中的某些部分继续调用另一个方法,而其他部分调用新方法呢?

但是,与遗留代码一起工作从来都不是最佳选择,所以你正在考虑的可能是最佳解决方案。

我将有多个DAO。我应该在DAO本身编写测试方法,还是对于每个DAO我应该有一个单独的JUnit测试类?

假设您的程序结构已经正确采用了OO,其中每个类只执行一项任务,那么是的,您应该创建另一个包含该单个类的测试用例的类。您要寻找的是模拟对象(在SO和Google中搜索,有很多信息可用),它可以帮助您将测试类与其他类解耦。有趣的是,单元测试中高数量的模拟通常意味着您的类可能需要进行大量重构。

(可能是n00b问题)所有测试用例都将自动运行吗?我不想去前端点击一堆东西,以便触发对DAO的调用。

所有IDE都允许您同时运行所有JUnit测试,例如在Eclipse中,只需单击源文件/顶级包,然后选择Run -> Junit test。此外,在运行单个类时,其中包含的所有单元测试都按适当的JUnit流程运行(setup() -> testX() -> tearDown())。

当运行测试时,我会发现哪些方法失败了吗?对于失败的方法,它会告诉我失败的测试方法吗?

是的,测试驱动开发的一部分是Red-Green-Refactor口号,它指的是IDE为单元测试显示的彩色条。如果测试套件中的任何测试失败,则该条变为红色;如果所有测试通过,则为绿色。此外,对于JUnit,还有蓝色用于显示断言错误的单个测试。

最后,有什么好的起点吗?有任何教程、文章可以展示如何使用JUnit吗?

我相当确定很快就会在答案中有多个这样的教程和文章,稍等片刻 :)


在所有测试都通过后,请将带有后缀“_old”的方法删除,然后等待资源。终于可以进行单元测试了,感到很兴奋 :) - Omnipresent

1

你需要编写一个测试类。

public class OracleMatchesSqlServer extends TestCase {
    public void testHeadIdentifiersShouldBeEqual() throws Exception {
        String head = "whatever your head should be";
        IdentifierBean originalBean = YourClass.getHeadIdentifiers_old(head);
        IdentifierBean oracleBean = YourClass.getHeadIdentifiers(head);
        assertEquals(originalBean, oracleBean);
    }
}

你可能会发现需要在头部进行参数化,这很简单。

更新: 它看起来是这样的:

public class OracleMatchesSqlServer extends TestCase {
    public void testHeadIdentifiersShouldBeEqual() throws Exception {
        compareIdentifiersWithHead("head1");
        compareIdentifiersWithHead("head2");
        compareIdentifiersWithHead("etc");
    }
    private static void compareIdentifiersWithHead(String head) {
        IdentifierBean originalBean = YourClass.getHeadIdentifiers_old(head);
        IdentifierBean oracleBean = YourClass.getHeadIdentifiers(head);
        assertEquals(originalBean, oracleBean);
    }
}
* Is this a good approach?

好的。

* I will have multiple DAOs. Do I write the test methods inside the DAO
  itself or for each DAO I should have a separate JUnit Test Class?

为每个DAO尝试使用单独的测试类;如果这变得太繁琐,请尝试另一种方法并看看哪种更适合您。单独的测试类可能更有帮助,但效果因人而异。

* (might be n00b question) will all the test cases be run automatically?
  I do not want to go to the front end click bunch of stuff so that call
  to the DAO gets triggered.

根据您的环境,会有自动运行所有测试的方法。

* when tests are ran will I find out which methods failed? 
  and for the ones failed will it tell me the test method that failed?

是的,没错。

* lastly, any good starting points? any tutorials, articles that
  show working with Junit

我非常喜欢 Dave Astels 的


谢谢。你说的是什么意思 - “您可能会发现需要对头部进行参数化; 这很简单。” - Omnipresent
如果您想测试“head”变量的多个值,那么可以将其传递到一个函数中进行测试...我会更新答案以进行演示。 - Carl Manaster

0

0

写和维护大型单元测试套件的另一个有用介绍可能是这本书(部分内容可在线查看):

{{link1:XUnit Test Patterns,由Gerard Meszaros重构测试代码}}

该书分为三个主要部分。第一部分包括一系列介绍性叙述,描述了使用xUnit进行测试自动化的某些方面。第二部分描述了许多“测试异味”,这些异味是我们如何自动化测试存在问题的症状。第三部分包含模式的描述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接