标签: dbunit

是否有类似dbunit的框架,它不会吸引java/scala?

我正在考虑建立一个新的,轻量级的数据库人口框架.我绝对讨厌dbunit.在我做之前,我想知道是否有人已经这样做了.

我不喜欢dbunit的事情:

1)不推荐使用最简单的编写和入门格式.他们希望您使用膨胀的格式.有些甚至需要xml架构.好吧,无所谓了.

2)它们不按您编写的顺序填充行,但是在顺序表中是在xml文件中定义的.这非常糟糕,因为您无法以外键约束不会导致问题的方式对数据进行排序.这只会迫使你彻底解决它们的麻烦.

这也会浪费时间并使你的junit基类膨胀,以包含禁用外键约束的代码.您可能必须测试数据库类型(hsqldb等)并以特定于数据库的方式禁用它们.这很糟糕.

如果dbunit有助于自动禁用外键约束作为其框架的一部分,但它们不会这样做.他们确实跟踪方言......所以为什么不使用它们呢?最终,所有这一切都迫使程序员浪费时间而不是快速起床和测试.

3)XML是一种痛苦的写作.我不需要多说这个.他们也提供了很多方法,我认为这只会使问题复杂化.只需提供一个非常可靠的方法并完成它.

4)当你的数据变大时,跟踪id及其一致/正确的关系是一种巨大的痛苦.

另外,如果你没有在一个月的项目上工作,你怎么记得user_id 1是管理员,user_id 2是业务用户,user_id 3是工程师而user_id 4是其他什么?回去检查这是浪费更多时间.除了任意数字之外,应该有一种有意义的方法来检索它.

5)这很慢.我发现除非使用hsqldb,否则它会非常缓慢.它不一定是.还有很多方法可以搞乱其配置,因为"开箱即用"并不容易.有一个驼峰,你必须通过它来使其正常工作.所有这一切都鼓励人们不要使用它,或者在他们开始使用它时感到生气.

6)有些值往往会重复很多,比如日期.指定默认值,甚至让框架自动设置默认值是很好的,即使没有告诉它将默认值放在那里.这样,您可以使用所需的值创建对象,并将其余部分保留.如果不需要,这肯定会指定列的每个角落和裂缝.

7)最令人烦恼的可能是第一个条目必须包含所有值 - 甚至是空占位符 - 或者将来的行不会选择您实际指定的列.

DBunit没有将[NULL]转换为实际空值的合理默认值.您必须手动添加它.告诉我,谁没有用dbunit做到这一点?每个人都有.它应该不是这样的!

这意味着如果你有一个多态对象,你必须声明第一行中每个子类的连接表的所有外键,即使它们是null.如果为所有子类模式执行表,则仍必须指定第一行上的所有字段.这太可怕了.

有什么东西可以满足我,或者我应该成为更好的数据库测试框架的下一个框架开发人员?

java database testing dbunit scala

61
推荐指数
3
解决办法
3万
查看次数

DBUnit有没有办法自动创建表?

我刚刚意识到DBUnit本身并不创建表(请参阅如何使用纯JDBC和HSQLDB使用DBUnit进行测试而不会遇到NoSuchTableException?).

DBUnit有没有办法从数据集或dtd自动创建表?

编辑: 对于像HSQLDB这样的内存数据库的简单测试,可以使用原始方法自动创建表:

private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException {
    String[] tableNames = dataSet.getTableNames();

    String sql = "";
    for (String tableName : tableNames) {
      ITable table = dataSet.getTable(tableName);
      ITableMetaData metadata = table.getTableMetaData();
      Column[] columns = metadata.getColumns();

      sql += "create table " + tableName + "( ";
      boolean first = true;
      for (Column column : columns) {
        if (!first) {
          sql += ", ";
        }
        String columnName = column.getColumnName();
        String type = resolveType((String) table.getValue(0, columnName)); …
Run Code Online (Sandbox Code Playgroud)

java dbunit dataset create-table

23
推荐指数
1
解决办法
2万
查看次数

DAO单元测试

我一直在关注使用它进行单元测试DAO类的EasyMock和教程/示例,用于"外部容器"测试.但是,我认为他们中的大多数都在谈论测试服务层,而不是模拟DAO类.我有点困惑,你真的是如何对DAO层进行单元测试吗?

有人会说,与DB和EJB交互的测试实际上是集成测试而不是单元测试,但是你怎么知道你的SQL是否正确(假设没有ORM)并且你的DAO插入/查询真实的正确数据(读取,本地数据库与生产中的数据库类似?

我读到DBUnit是这种情况的解决方案.但我的问题是使用像DBUnit这样的框架"外部容器".如果DAO依赖于某些EJB,我们如何处理事务,如果有更新其他表的触发器会发生什么?

仅对具有此类依赖性的DAO进行单元测试的最佳方法是什么?

dbunit unit-testing dao easymock

22
推荐指数
2
解决办法
2万
查看次数

DbUnit - 警告:AbstractTableMetaData

我在最新版本2.4.8中使用DbUnit,我在单元测试中收到许多警告:

WARN : org.dbunit.dataset.AbstractTableMetaData - 
Potential problem found: The configured data type factory 
    'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' 
     might cause problems with the current database 'MySQL' (e.g. some datatypes may 
     not be supported properly). In rare cases you might see this message because the 
     list of supported database products is incomplete (list=[derby]). If so please 
     request a java-class update via the forums.If you are using your own 
     IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override 
     getValidDbProducts() to specify the supported database products.
Run Code Online (Sandbox Code Playgroud)

所以我想我添加了这个(我使用MySQL数据库):

protected …
Run Code Online (Sandbox Code Playgroud)

java dbunit warnings

18
推荐指数
2
解决办法
1万
查看次数

DbUnit和二进制数据

我使用DbUnit对我的DAO对象进行单元测试.到目前为止效果很好.

我有一个问题,我有字段ob类型byte[],它在数据库中存储为BLOB.该列不为null.如何在DbUnit使用的XML数据集文件中指定此列的值?这个值可能没什么特别的,5个字节就足够了.我想避免为此创建额外的二进制文件的必要性.

有什么建议?

xml dbunit unit-testing

17
推荐指数
1
解决办法
8010
查看次数

如何使用纯JDBC和HSQLDB使用DBUnit进行测试而不会遇到NoSuchTableException?

我正在尝试将DBUnit与简单的JDBC和HSQLDB一起使用,并且不能完全使用它 - 即使我早先使用了DBUnit和Hibernate并取得了巨大的成功.这是代码:

import java.sql.PreparedStatement;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.junit.Test;

public class DummyTest {

    @Test
    public void testDBUnit() throws Exception {
        IDatabaseTester databaseTester = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem", "sa", "");
        IDataSet dataSet = new XmlDataSet(getClass().getResourceAsStream("dataset.xml"));
        databaseTester.setDataSet(dataSet);
        databaseTester.onSetup();
        PreparedStatement pst = databaseTester.getConnection().getConnection().prepareStatement("select * from mytable");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有问题的dataset.xml:

<dataset>
    <table name="mytable">
        <column>itemnumber</column>
        <column>something</column>
        <column>other</column>
        <row>
            <value>1234abcd</value>
            <value>something1</value>
            <value>else1</value>
        </row>
    </table>
</dataset>
Run Code Online (Sandbox Code Playgroud)

这个测试给了我一个NoSuchTableException:

org.dbunit.dataset.NoSuchTableException: mytable
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:282)
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at DummyTest.testDBUnit(DummyTest.java:18)
Run Code Online (Sandbox Code Playgroud)

如果我删除databaseTester.onSetup()行,我会得到一个SQLException: …

java junit dbunit jdbc hsqldb

16
推荐指数
1
解决办法
2万
查看次数

phpunit中的dbunit没有截断表

我目前正在为我的项目使用PHPUnit和DBUnit.我在DBUnit中遇到问题,因为DBUnit PHPUnit_Extensions_Database_TestCaseSrc类似乎没有截断测试数据库上的现有数据.所以这使我的插入测试在仅工作一次后失败.

我使用的是mysql,这是我的代码:

abstract class Generic_Tests_DatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
{
    // only instantiate pdo once for test clean-up/fixture load
    static private $pdo = null;

    // only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test
    private $conn = null;

    final public function getConnection()
    {
        if ($this->conn === null) {
            if (self::$pdo == null) {
                self::$pdo = new PDO( "mysql:dbname=db;host=localhost", "root", "pass" );
            }
            $this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
        }

        return $this->conn;
    }
}

class DbopTest extends Generic_Tests_DatabaseTestCase
{       
    private $db;

    protected function setup(){
        $this->db …
Run Code Online (Sandbox Code Playgroud)

php phpunit dbunit unit-testing

16
推荐指数
2
解决办法
5942
查看次数

DbUnit:NoSuchColumnException和区分大小写

在发布这篇文章之前我搜索了一下,我在dbunit-user档案中查找了一下,还有一些在DbUnit错误列表中查找,但我找不到找到的内容.不幸的是,这里的答案也没有帮助我.

我正在使用DbUnit 2.4.8与MySQL 5.1.x在setUp中填充一些JForum表.问题首先出现在此脚本创建的jforum_users表中

CREATE TABLE `jforum_users` (
       `user_id` INT(11) NOT NULL AUTO_INCREMENT,
       `user_active` TINYINT(1) NULL DEFAULT NULL,
       `username` VARCHAR(50) NOT NULL DEFAULT '',
       `user_password` VARCHAR(32) NOT NULL DEFAULT '',
       [...]
       PRIMARY KEY (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=14
Run Code Online (Sandbox Code Playgroud)

执行REFRESH作为数据库设置操作会引发以下异常.

org.dbunit.dataset.NoSuchColumnException: jforum_users.USER_ID -
(Non-uppercase input column: USER_ID) in ColumnNameToIndexes cache
map. Note that the map's column names are NOT case sensitive.
       at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117)
       at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
       at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:98)
       at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
       at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
       at net.jforum.dao.generic.AbstractDaoTest.setUpDatabase(AbstractDaoTest.java:43)
Run Code Online (Sandbox Code Playgroud)

我查看了AbstractTableMetaData.java消息来源,似乎没有什么 - 似乎是错误的.方法 …

java mysql dbunit case-sensitive

15
推荐指数
2
解决办法
2万
查看次数

dbunit性能最佳实践

除了在实际dbunit站点上推荐的那些之外,还有哪些最佳实践/原则可以大大加快测试速度并保持可维护性?我渴望 java 工厂女孩这样,但由于静态类型,它看起来不太可能.

我目前的想法是在这一点上每个测试类有1个xml数据集 - 也许我会分享其中的一些,也许我没有.虽然一些测试数据可能是复制的交叉数据集,但我发现在3000个单元/集成测试中维护共享数据集太难了 - 而且我还有很长的路要走.

将会欣赏任何遵循的原则,导致测试表现良好且易于维护.

java testing junit dbunit integration-testing

15
推荐指数
1
解决办法
3418
查看次数

如何从多个项目访问公共资源文件

在我的一个项目中,我有资源存储在/src/test/resources(典型的maven目录结构)中.这些资源正由项目中存储的实用程序类使用.

实用程序类本身正在从其他项目中使用(其他项目依赖于此项目).我会像这样访问资源:

final InputStream inputStreamDobs = 
    ClassLoader.class.getResourceAsStream("/dbunit/clear_db.xml");
Run Code Online (Sandbox Code Playgroud)

但是因为我在不同的项目中使用它的路径不正确 - 它是相对的current project that is being built/tested,而不是实用程序类和资源所在的那个.

有人想过如何处理这个问题?

我需要避免使用绝对路径 - 希望有一种方法来定义实用程序类的相对路径.

我也不想在多个项目上复制资源.干杯.

编辑: 为了给出一个上下文,我有一个XML文件中的表的定义,需要在集成测试后清除(清除整个数据库模式).集成测试位于多个项目中,但清晰的脚本和资源文件对于所有这些都是相同的,并且位于公共父项目中.

EDIT2:

奖金问题:我想访问tables.dtd需要从多个其他项目的XML文件访问的常见DTD文件(让我们称之为).(它将坐在共同的父项目中).

目前我将它复制到多个项目中,我从XML使用指令引用它:

<!DOCTYPE dataset SYSTEM "src/test/resources/dbunit/dobs.dtd">
Run Code Online (Sandbox Code Playgroud)

如何将其指向不同项目中的文件?

java resources dbunit maven

15
推荐指数
2
解决办法
1万
查看次数