• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

软件测试中如何利用HSQLDB 进行Hibernate单元测试

发布: 2009-9-09 11:05 | 作者: 不详 | 来源: 领测软件测试网 | 查看: 103次 | 进入软件测试论坛讨论

领测软件测试网

因为所有代码(经过单元测试的产品级代码)都是从HibernateUtil获取Hibernate会话,所以能在同一个位置对其进行配置。为了对代码的第一位进行单元测试而访问TestSchema类将会激活静态初始化程序,该程序将安装Hibernate并且将测试SessionFactory插入到HibernateUtil中。对于产品级代码,可以使用标准hibernate.cfg.xml配置机制来初始化 SessionFactory。

  那么单元测试中的外部特征是什么?下面的测试代码片段是用来检查逻辑的,决定运动员在棒球联盟比赛中是哪个位置的人选:

   public void testGetEligiblePositions() throws Exception {

   Player player = new Player("playerId");

   TestSchema.addPlayer(player);

   FieldingStint stint1 = new FieldingStint("playerId", 2004, "SEA", Position.CATCHER);

   stint1.setGames(20);

   TestSchema.addFieldingStint(stint1);

   Set positions = player.getEligiblePositions(2004);

   assertEquals(1, positions.size());

   assertTrue(positions.contains(Position.CATCHER));

   }

  第一次创建新Player实例并通过addPlayer()方法添加到TestSchema中。必须首先完成此步骤,因为FidldStint类和Player类之间有外键关系。如果不首先添加该实例,在设法添加FieldingStint时将会出现外键约束违例。一旦测试上下文就位,就可以测试getEligiblePositions()方法来检索校正数据。下面是在TsetSchema中addPlayer()方法的代码。您将注意到使用Hibernate而不是bare-metal JDBC代码:

   public static void addPlayer(Player player) {

   if (player.getPlayerId() == null) {

   throw new IllegalArgumentException("No primary key specified");

   }

   Session session = HibernateUtil.getSession();

   Transaction transaction = session.beginTransaction();

   try {

   session.save(player, player.getPlayerId());

   transaction.commit();

   }

   finally {

   session.close();

   }

   }
  在单元测试中最重要的就是要保持测试实例是独立的。因为该方法仍然涉及数据库,所以需要一种方法在每个测试实例之前清理数据库。在我的数据库架构中有四个表,所以我在TestSchemaz上编写了reset()方法,该方法从使用JDBC的表中删除所有行。注意,因为HSQLDB能识别外键,删除表的顺序是很重要的,下面是代码:

[NextPage]

   public static void reset() throws SchemaException {

   Session session = HibernateUtil.getSession();

   try {

   Connection connection = session.connection();

   try {

   Statement statement = connection.createStatement();

   try {

   statement.executeUpdate("delete from Batting");

   statement.executeUpdate("delete from Fielding");

   statement.executeUpdate("delete from Pitching");

   statement.executeUpdate("delete from Player");

   connection.commit();

   }

   finally {

   statement.close();

   }

   }

   catch (HibernateException e) {

   connection.rollback();

   throw new SchemaException(e);

   }

   catch (SQLException e) {

   connection.rollback();

   throw new SchemaException(e);

   }

   }

   catch (SQLException e) {

   throw new SchemaException(e);

   }

   finally {

   session.close();

   }

   }

  当确定在Hibernate 3.0中进行大量删除操作时,应该能从应用程序中删除直接JDBC的最后一位。到此时为止,必须获取数据库连接并向数据库直接提交SQL。 在确保没有关闭连接的情况下,为了释放资源,只关闭会话就足够了。出于手工编写许多JCBC代码来进行开发的习惯,第一个版本关闭了JDBC连接。因为通过配置Hibernate创建的连接池只带有一个链接,在第一个之后就完全破坏了测试。一定要注意这种情况! 既然在测试类运行时(设想运行所有的测试实例)不能确定数据库的状态,应该在setUp()方法中包含数据库清除,如下所示:

   public void setUp() throws Exception {

   TestSchema.reset();

   }

[NextPage]

  结束语

  在使用像Hibernate这种复杂的O/R映射程序时,必须能够测试实际存在(real-live)的RDBMS,而不会发生任何针对已部署数据库的争论。虽然Hibernate有内置模式生成工具,让此类测试特别简单,但是在这里展示的例子并不排除Hibernate,并且可能与JDO或TopLink一起运行。使用上面描述的设置,您不必离开舒适的IDE环境,但仍然可以对代码进行大量测试。

文章来源于领测软件测试网 https://www.ltesting.net/

22/2<12

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网