需要有关Junit入门的建议
我之前没有使用过Junit,也没有自动进行unit testing。
场景:我们正在将后端DAO从Sql Server更改为Oracle。 所以在DB端,所有存储过程都转换为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_old
并比较返回的Object(必须在IdentifierBean
重写equals和hash)。 只有当两个对象相同时,测试才会通过。
在测试器方法中,我将必须为这两种方法提供一个参数(在这种情况下是头部)。这将暂时手动完成。 是的,从前端参数可能不同,SP可能不会返回这些参数的确切结果。 但我认为有这些测试用例会让我们感到宽慰,他们会返回相同的数据……
我的问题是:
- 这是一个好方法吗?
- 我将有多个DAO。 我是在DAO本身内部编写测试方法,还是每个DAO都应该有一个单独的JUnit测试类?
- (可能是n00b问题)是否会自动运行所有测试用例? 我不想去前端点击一堆东西,以便触发对DAO的调用。
- 当测试运行时,我会找出哪些方法失败了? 对于那些失败的人,它会告诉我失败的测试方法吗?
- 最后,有什么好的起点吗? 任何教程,显示使用Junit的文章
你会写一个测试类。
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的书 。
好的,让我们看看可以做些什么……
这是一个好方法吗?
并不是的。 由于您现在拥有两个具有不相等且不可预测的function的代码路径,而不是拥有一个具有某种已知function的过时代码路径。 通常会首先为遗留代码创建彻底的unit testing,然后重构原始方法以避免难以置信的大量重构 – 如果构成巨大应用程序的代码丛的某些部分继续调用另一个方法,而其他部分调用新的一个?
但是,使用遗留代码绝不是最佳选择,因此您所考虑的可能是最佳解决方案。
我将有多个DAO。 我是在DAO本身内部编写测试方法,还是每个DAO都应该有一个单独的JUnit测试类?
假设你已经用你的程序结构正确地完成了OO,其中每个类只做一件事,只有一件事,是的,你应该创建另一个包含该类的测试用例的类。 你在这里寻找的是模拟对象(一般在SO和Google上搜索它,提供大量信息),它可以帮助你将你的课程与其他课程分开。 有趣的是,unit testing中的大量模拟通常意味着您的课程可能会使用一些重型重构。
(可能是n00b问题)是否会自动运行所有测试用例? 我不想去前端点击一堆东西,以便触发对DAO的调用。
所有IDE:允许您同时运行所有JUnit测试,例如在Eclipse中只需单击源文件夹/顶部包并选择Run – > Junit test。 此外,在运行单个类时,其中包含的所有unit testing都在适当的JUnit流程中运行( setup()
– > testX()
– > tearDown()
)。
当测试运行时,我会找出哪些方法失败了? 对于那些失败的人,它会告诉我失败的测试方法吗?
是的,测试驱动开发的一部分是咒语Red-Green-Refactor,它指的是IDE显示的彩色条:s用于unit testing。 基本上,如果测试套件中的任何测试失败,则条形图为红色,如果全部通过,则为绿色。 此外,对于JUnit,还有蓝色用于显示断言错误的单个测试。
最后,有什么好的起点吗? 任何教程,显示使用Junit的文章
我很确定很快会在答案中出现多个这样的问题,只需坚持下去:)
编写和维护大型unit testing套件的另一个有用的介绍可能是本书(部分可在线获取):
XUnit测试模式 ,由Gerard Meszaros重构测试代码
这本书分为三个主要部分。 第一部分包含一系列介绍性叙述,描述了使用xUnit进行测试自动化的一些方面。 第二部分描述了一些“测试气味”,它们是我们如何自动化测试的问题的症状。 第III部分包含对模式的描述。
这是JUnit的快速而又相当全面的介绍 。