我尝试使用以下方法通过一组素数键从oracle数据库导出数据集:
TablesDependencyHelper.getDataset(connection, fullTableName ,
new TreeSet(Arrays.asList(
new BigDecimal[]{new BigDecimal(1)})));
Run Code Online (Sandbox Code Playgroud)
这会抛出一个45mb的数据文件!!!,检查文件我意识到问题是对带有复合键(6个外键)的表的引用,而不是导出唯一引用的注册表,它占用了整个表数据.¿我认为这是DBUnit的错误,任何人都知道这个方法的解决方案?
我尝试使用DB Unit加载具有标识列的表.我希望能够自己设置id值(我不希望数据库为我生成它).
这是我的表的最小定义
create table X (
id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
要在X中插入一行,我执行以下SQL
set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Run Code Online (Sandbox Code Playgroud)
没问题.但是当我尝试使用以下数据库单元XML数据集(RS_7_10_minimal_ini.xml)加载此表时
<dataset>
<X id="666"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
使用以下最小JUnit(DBTestCase)测试用例:
package lms.lp.functionnal_config;
import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;
public class SampleTest extends DBTestCase
{
public SampleTest(String name)
{
super( name );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );
}
protected IDataSet getDataSet() throws …Run Code Online (Sandbox Code Playgroud) 我正在围绕现有项目设置一些测试脚手架.这包括使用JUnit和DbUnit的一些集成测试.我还设置了Jenkins安装以进行持续集成.
我的问题涉及更改开发和测试环境之间的数据库连接.我在本地安装了自己的产品堆栈,以便进行快速的临时测试和调查.在我开发的时候,我对我的私人数据库运行测试,因为它更快,我不会因为有问题的工作进程代码而毁掉任何其他人的日子.
签入代码后,Jenkins将运行我的测试.现在它仍然指向我的本地数据库.我更愿意让Jenkins针对不同的数据库运行测试,这个数据库位于测试环境中.
是否有最佳实践/策略/技术/等更改数据库连接以进行测试而无需更改代码?如果解决方案允许Jenkins对多个DB运行相同的测试,那么奖励点(应该是可能的,因为DbUnit是不可知的).
编辑更多信息:
该产品很大,具有许多不同的交互组件(通常在单独的vms /进程中).在实时系统中,不同的进程通常通过数据库进行通信.IE,UI进程将更改写入表,后端进程轮询该表以进行更改.是的,太可怕了.对于集成测试,我使用UI配置系统并使用DbUnit捕获该状态.然后,我可以针对该"输入"运行测试.
我的组件和所有新组件都由maven管理.数据库连接当前在测试设置中是硬编码的.DbUnit系统有效; 我只是希望能够切换我的测试引用的数据库,具体取决于它们是在我的开发环境中运行,还是由Jenkins在测试环境中运行.
有没有办法让DB-Unit忽略比较行的顺序?我的问题是,我不知道行将以哪种顺序写入数据库,但DB-Unit迫使我给出一个有序列表.
我想要dbunit做的是:
有任何想法吗?
测试在Eclipse中单独工作(右键单击,以Junit身份运行),但是当我使用maven从命令行运行它们时,它会在尝试获取与HSQL数据库的DataSource连接时停止.
LogicalConnectionImpl [DEBUG] Obtaining JDBC connection
Run Code Online (Sandbox Code Playgroud)
对我来说最奇怪的部分是,如果我将测试限制为10(不是类,而是单独的@Test方法),它将起作用.但是,一旦进行了第11次测试,就会爆炸.测试组合没关系,所以如果我有30个测试,并且我选择运行11个或更多,那么它将失败.这让我觉得它是一个DataSource连接最大问题,但到目前为止还没有运气细节.我已经尝试添加堆大小只是为了咯咯笑,但这不起作用.
因此,在此挂起之前,我有多个成功的JDBC连接和发布.
这是我的applicationContext-HSQL.xml,它用于Eclipse和Command Line版本.我知道b/c我通过弄乱下面的Class值强迫他们每个人失败.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:flow="http://www.springframework.org/schema/webflow-config"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.company"/>
<import resource="classpath*:/application-context-cxf.xml"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" />
</bean>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property …Run Code Online (Sandbox Code Playgroud) 我在集成测试期间使用DBUnit来模拟我继承的传统Spring/Hibernate项目的数据.不幸的是很久以前有人认为拥有一个名为user的用户表会很好,这是我们数据库中的保留关键字.然后通过将实体表映射重命名为现在已经存在多年的`user`来解决这个问题.
正如我现在几年后开始整合集成测试一样,这就产生了一个问题,因为DBUnit不允许在其xml数据集文件中使用`字符(它是你知道的XML ...),而CSV读取器则要求文件是称为`user`.csv,在我的操作系统下似乎失败了.
有没有办法在不使用DBUnit的XML或CSV读取器的情况下添加此表,还是应该从另一个角度解决这个问题?一种替代方法是在集成测试期间使用另一个映射,以便我可以将表命名为它的预期名称(用户).但我不知道这是否可行.
我已经打了2天了,所以我喜欢一些外部反馈.
所以,只是澄清一下.我有一个实体,如:
@Entity (name = "`user`")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Auditable
public class User implements UserDetails, Serializable {
properties etc....
Run Code Online (Sandbox Code Playgroud)
在我的集成测试期间,hibernate通过配置persistence.xml文件来负责创建其他表.当dbunit然后尝试填充数据时,由于缺少表而导致错误,无论我如何尝试转义用户表名.
因此,我可以使用PHPUnit测试使用数据库的代码,我刚刚使用Composer 安装了DbUnit扩展,并且得到以下消息:
软件包phpunit / dbunit被放弃了,您应该避免使用它。没有建议更换。
我已经看到了扩展名被放弃的问题,人们谈论着滚动自己的数据库测试代码,但是他们没有涉及更多细节。有没有推荐的方法可以使用PHPUnit测试数据库代码,或者有人知道任何示例吗?
(我确实提出了一个问题,并向PHPUnit的作者询问了这个问题,但是他的回答很迅速,而且很直截了当地-“不,没有。”):-/
我正在JUnit中编写一些集成测试.这里发生的是当我连续一起运行所有测试(而不是单独)时,数据库中持久存储的数据总是会发生变化,测试会在执行期间发现意外数据(由前一个测试插入).
我正在考虑使用DbUnit,但我想知道它是否重置每次执行之间的自动增量索引(因为测试还会检查持久化实体的ID).
谢谢
M.
我目前正在使用dbunit进行编码测试(使用hsqldb).但是,我在初始化db时遇到了很大的问题:
这是代码:
/**
* Init before a test starts
*/
@Before
public void initialise() {
IDataSet dataSetRating = null;
IDataSet dataSetMovie = null;
log.info("enter init test");
try {
con = datasource.getConnection();
icon = new DatabaseConnection(con);
File rating = new File("./src/test/resources/startDatabaseRating.xml");
dataSetRating = new FlatXmlDataSetBuilder().build(rating);
DatabaseOperation.CLEAN_INSERT.execute(icon, dataSetRating);
} catch (Exception e) {
e.printStackTrace();
log.error(e);
System.exit(-1);
}
}
Run Code Online (Sandbox Code Playgroud)
我的create语句看起来像这样:
CREATE TABLE Rating
(
rid INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
mid INTEGER FOREIGN KEY REFERENCES Movie(movieId),
rating INTEGER NOT NULL, …Run Code Online (Sandbox Code Playgroud) 我试图只删除我使用@DatabaseSetup注释插入的记录.
我的测试看起来像这样:
@Test
@DatabaseSetup("classpath:data-set.xml")
@DatabaseTearDown(value={"classpath:data-set.xml"}, type= DatabaseOperation.DELETE)
public void testSomething() throws Exception {
Run Code Online (Sandbox Code Playgroud)
数据set.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person id="1" name="Joe"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
据推测,使用DatabaseOperation.DELETE意味着"删除与数据集中的行匹配的数据库表行".但是当我执行测试时,它会擦除表格中的所有数据.
我认为问题是用于拆卸的xml文件的格式.我尝试使用不同的格式:
首先尝试使用tear-down.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person id="1"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
第二次尝试使用tear-down.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
无论使用何种格式,它总是删除表中的所有数据.我找不到用于拆除的格式的单个例子,而不是简单地列出表名.在大多数示例中,人们似乎都使用相同的xml文件进行设置和拆卸.
但这必须是可能的,不是吗?