【JAVA-UT】11、Runner--使用什么来运行你,我的UT

文|码术张

#####一、什么是Runner
下面这个UT,对您来说,现在应该是小菜一碟了。

public class ResultTest {
  @Test
  public void should_returnString() {
    // given
    String expectedString = "downLoadStatus: Fail, failureReason: cannot connect";
    Result result = new Result("Fail", "cannot connect");

    // when
    String realString = result.toString();

    // then
    Assert.assertEquals(expectedString, realString);
  }
}

given、when、then下的语句,各自描述了:
条件的设置;
执行被测功能;
结果是否符合期望的验证。

不过,这还不是全部。
在这个“家庭”里,还有一个特别重要的成员。
是谁呢?
Runner。

每一个测试类,都有一个Runner。
什么是Runner?
Runner是"编译器",也是"CPU"。

它是“编译器”,是因为Runner会做这两件事:
1,预处理。
判断语法是否规范。
比如@Test注释的方法,其返回值应当是void。
若违反了要求,将这“作品"退回作者,并附上评语。
如果合格,进入下一处理阶段。
2,“翻译”。
将测试类进行分解、排序。
分解为一个个执行单元,并排序。
这就好比将A语言的源程序翻译为B语言的等价程序。

它是"CPU",是因为Runner的有一个方法,
run方法
runner.run()
调用这个方法后,代码才开始进入运行阶段。
这就是为什么称它为runner的原因吧。

#####二、如何使用Runner
Junit提供了三种Runner:
BlockJUnit4ClassRunner
Suite
Parameterized
第3种不常用,所以这里不介绍。

######1. BlockJUnit4ClassRunner的使用
BlockJUnit4ClassRunner是Junit4默认的runner。
使用方式1:
@RunWith(BlockJUnit4ClassRunner.class)
使用方式2:
BlockJUnit4ClassRunner.class的别名是JUnit4.class。
@RunWith(JUnit4.class)
使用方式3:
不使用RunWith语句。

开头的例子,使用了方式3。
分别用方式1、方式2改写如下:

@RunWith(BlockJUnit4ClassRunner.class)
public class ResultTest {
 ...
}
@RunWith(JUnit4.class)
public class ResultTest {
 ...
}

######2. Suite的使用
Suite是将多个runner串联起来的一个runner。
如何使用Suite呢?

  1. 添加RunWith语句
    @RunWith(Suite.class)
  2. 添加SuiteClasses语句
    @SuiteClasses({Test1.class, Test2.class...})
    比如有两个测试类,分别测试ipv4、ipv6模式下的ping功能。
public class PingInIpv4modeTest {
  @Test
  public void printIpv4() {
    System.out.println("This is ipv4.");
  }
}
public class PingInIpv6modeTest {
  @Test
  public void printIpv6() {
    System.out.println("This is ipv6.");
  }
}

要将它们合并为一个整体,就需要用到Suite

@RunWith(Suite.class)
@Suite.SuiteClasses({
    PingInIpv4modeTest.class,
    PingInIpv6modeTest.class
})
public class PingTest {
	//nothing
}

当运行PingTest类时,就会运行SuiteClasses中所有的类。
如下图所示:
result.PNG

需要注意的是:
一个class声明为Suite后,其内部的方法已经无意义,也无法运行。
在上面的PingTest中,加入一个方法testInSuite,运行这个方法,会出现错误:

@RunWith(Suite.class)
@Suite.SuiteClasses({
    PingInIpv4modeTest.class,
    PingInIpv6modeTest.class
})
public class PingTest {
  @Test
  public void testInSuite() {
    System.out.println("it is testInSuite");
  }
}

result-of-running-method-in-suite.PNG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在上一篇文章中,我们介绍了JDBC中的PreparedStatement和ResultSet类的使用。在本文中,我们将介绍Apache Commons DbUtils库中的QueryRunner类。 QueryRunner类是Apache Commons DbUtils库中的一个类,它封装了大量的JDBC操作,简化了JDBC编程的复杂度。使用QueryRunner类可以避免编写大量的JDBC代码,提高开发效率。 使用QueryRunner类需要引入以下依赖: ```xml <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.7</version> </dependency> ``` 接下来我们来看一下如何使用QueryRunner类。 1. 建立连接 在使用QueryRunner类之前,需要先建立与数据库的连接。这可以通过JDBC中的DriverManager类来实现。例如: ```java Connection conn = DriverManager.getConnection(url, user, password); ``` 其中,url、user和password分别表示数据库的URL、用户名和密码。 2. 执行SQL语句 QueryRunner类中提供了多个方法来执行SQL语句。其中,最常用的方法是query()和update()方法。 query()方法用于查询数据,它的使用方式如下: ```java QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM user WHERE id=?"; Object[] params = {1}; ResultSetHandler<List<User>> rsh = new BeanListHandler<>(User.class); List<User> userList = qr.query(conn, sql, rsh, params); ``` 其中,第一个参数conn表示与数据库的连接,第二个参数sql表示要执行的SQL语句,第三个参数rsh表示查询结果的处理器,第四个参数params是一个数组,表示SQL语句中的参数。 update()方法用于更新数据,它的使用方式如下: ```java QueryRunner qr = new QueryRunner(); String sql = "UPDATE user SET name=? WHERE id=?"; Object[] params = {"张三", 1}; qr.update(conn, sql, params); ``` 其中,第一个参数conn表示与数据库的连接,第二个参数sql表示要执行的SQL语句,第三个参数params是一个数组,表示SQL语句中的参数。 3. 释放资源 在使用QueryRunner类完成数据库操作后,需要释放相应的资源,包括ResultSet、Statement和Connection等。这可以通过调用DbUtils类中的close()方法来实现。例如: ```java DbUtils.close(resultSet); DbUtils.close(statement); DbUtils.close(connection); ``` 4. 示例代码 下面是一个完整的示例代码,演示了如何使用QueryRunner类完成数据库操作: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; public class QueryRunnerDemo { public static void main(String[] args) throws SQLException { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); // 查询数据 QueryRunner qr = new QueryRunner(); String sql = "SELECT * FROM user WHERE id=?"; Object[] params = {1}; ResultSetHandler<List<User>> rsh = new BeanListHandler<>(User.class); List<User> userList = qr.query(conn, sql, rsh, params); for (User user : userList) { System.out.println(user); } // 更新数据 sql = "UPDATE user SET name=? WHERE id=?"; params = new Object[]{"张三", 1}; qr.update(conn, sql, params); conn.close(); } } ``` 以上就是QueryRunner类的使用方法。QueryRunner类封装了大量的JDBC操作,可以避免编写大量的JDBC代码,提高开发效率。同时,使用QueryRunner类也需要注意资源的释放,避免出现资源泄漏的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值