数据库测试之上下文控制

发表于:2020-5-28 13:12

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:风月同天测试人    来源:软件测试那些事

  先来看一个DataBase-Rider的案例
   @ExtendWith(DBUnitExtension.class)
  @RunWith(JUnitPlatform.class)
  public class DBUnitJUnit5Test {
  private ConnectionHolder connectionHolder = () -> instance("junit5-pu").connection(); (1)
  @Test
  @DataSet("users.yml")
  public void shouldListUsers() {
  List<User> users = em().createQuery("select u from User u").getResultList();
  assertThat(users).isNotNull().isNotEmpty().hasSize(2);
  }
  @DataSet是DBRider最基础和重要的一个注解,主要用来控制目标数据库的上下文。在前述案例中,通过这简单的一行代码,就实现了将一个用例所需要的完整数据库上下文内容导入到了数据库中。
  当然,实际测试项目中,数据的导入还有许多复杂的场景需要应对。
  笔者简要介绍一下在实际工作中使用较多的几个属性
  那么这个@dataset注解提供的这么多操作,在导入数据的过程中是如何执行的呢?从com.github.database.rider.core.dataset.DataSetExecutorImpl这个类的createDataSet方法的实现中可以了解到各个注解的执行先后顺序。源码如下:
   @Override
  public void createDataSet(DataSetConfig dataSetConfig) {
  if (printDBUnitConfig.compareAndSet(true, false)) {
  StringBuilder sb = new StringBuilder(150);
  sb.append("cacheConnection: ")
  .append("" + dbUnitConfig.isCacheConnection()).append("\n")
  .append("cacheTableNames: ")
  .append(dbUnitConfig.isCacheTableNames()).append("\n")
  .append("leakHunter: ")
  .append("" + dbUnitConfig.isLeakHunter()).append("\n");
  for (Entry<String, Object> entry : dbUnitConfig.getProperties().entrySet()) {
  sb.append(entry.getKey()).append(": ).append(entry.getValue()).append("\n");
  }
  log.info(String.format("DBUnit configuration for dataset executor '%s':\n" + sb.toString(),
  this.executorId));
  }
  if (dataSetConfig != null) {
  try {
  if (dataSetConfig.isDisableConstraints()) {
  disableConstraints();
  }
  if (dataSetConfig.isCleanBefore()) {
  try {
  clearDatabase(dataSetConfig);
  } catch (SQLException e) {
  LoggerFactory.getLogger(DataSetExecutorImpl.class.getName())
  .warn("Could not clean database before test.", e);
  }
  }
  if (dataSetConfig.getExecuteStatementsBefore() != null
  && dataSetConfig.getExecuteStatementsBefore().length > 0) {
  executeStatements(dataSetConfig.getExecuteStatementsBefore());
  }
  if (dataSetConfig.getExecuteScriptsBefore() != null
  && dataSetConfig.getExecuteScriptsBefore().length > 0) {
  for (int i = 0; i < dataSetConfig.getExecuteScriptsBefore().length; i++) {
  executeScript(dataSetConfig.getExecuteScriptsBefore()[i]);
  }
  }
  if (dataSetConfig.hasDatasets()) {
  IDataSet resultingDataSet = loadDataSets(dataSetConfig.getDatasets());
  resultingDataSet = performSequenceFiltering(dataSetConfig, resultingDataSet);
  resultingDataSet = performTableOrdering(dataSetConfig, resultingDataSet);
  resultingDataSet = performReplacements(resultingDataSet);
  DatabaseOperation operation = getOperation(dataSetConfig);
  operation.execute(getRiderDataSource().getDBUnitConnection(), resultingDataSet);
  }
  } catch (Exception e) {
  throw new DataBaseSeedingException("Could not initialize dataset: " + dataSetConfig, e);
  }
  }
  }
  看上去是分为DataSet执行前和执行中两个分类。在真正导入数据的操作执行前,会执行以下操作,
   DisableConstraints
  CleanBefore
  ExecuteStatementsBefore
  ExecuteScriptsBefore
  而在DataSet执行过程中,为了对数据进行一些处理,还会依次执行以下的操作
   performSequenceFiltering(dataSetConfig, resultingDataSet);
  performTableOrdering(dataSetConfig, resultingDataSet);
  performReplacements(resultingDataSet);
  了解了各个方法的运行时机,就可以在实际项目中准确使用了。

       本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号