我想知道是否有任何方法可以在DBUnit XML数据集中明确指定日期作为日期.有时代码逻辑在将来的日期和过去的日期是不同的,我想测试这两种情况.当然,我可以指定类似于2239年11月5日的东西,并确保测试在这个日期之前有效,但有更优雅的方式.
我在Java开发期间还没有遇到过这样的情况,但是一旦我遇到代码逻辑在日期前一天,日期前两天和日期前两天以上不同的经历.在这种情况下,编写数据库驱动测试的唯一可能解决方案是在数据导入期间插入相对日期.
DBUnit是否为此提供了任何设施?
我见过有些人使用maven-sql-plugin来做到这一点.但它似乎是一个更适合DBUnit的任务....也许在整个测试套件的开头.
这里的最佳做法是什么?
我希望在每个测试用例之后清理数据库而不回滚事务.我已经尝试过DBUnit的DatabaseOperation.DELETE_ALL,但如果删除违反了外键约束,它就不起作用.我知道我可以禁用外键检查,但这也会禁用对测试的检查(我想阻止).
我正在使用JUnit 4,JPA 2.0(Eclipselink)和Derby的内存数据库.有任何想法吗?
谢谢,西奥
Spring Test有助于回滚在测试方法中对数据库所做的任何更改.这意味着在每种测试方法之前没有必要花时间删除/重新加载测试数据.
但是如果使用@BeforeClass Junit注释,则会强制数据加载器保持静态.这里探讨的一个问题: 为什么jUnit的fixtureSetup必须是静态的?
如果数据初始化方法是静态的,那么数据连接方法和数据源也必须......以及......强制一切都是静态的......这是行不通的.在这一点上,我问 - 当你必须为每次测试删除/重新加载测试数据时,Spring Test能够回滚更改有什么用处?!?!
我正在使用spring-test-dbunit,我在单元测试中收到一条警告:
码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/context.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class })
public class TestDB {
@Autowired
private ICourseService courseService;
@Test
@DatabaseSetup("sampleData.xml")
public void testFind() throws Exception {
List<Course> courseList = this.courseService.getAllCourses();
assertEquals(1, courseList.size());
assertEquals("A001", courseList.get(0).getCourseNumber());
}
}
Run Code Online (Sandbox Code Playgroud)
警告:
1093 [main] WARN org.dbunit.dataset.AbstractTableMetaData - 发现潜在问题:配置的数据类型factory'class org.dbunit.dataset.datatype.DefaultDataTypeFactory'可能导致当前数据库'MySQL'出现问题(例如某些数据类型可能不会得到适当支持).在极少数情况下,您可能会看到此消息,因为受支持的数据库产品列表不完整(list = [derby]).如果是这样,请通过论坛请求java级更新.如果您使用自己的IDataTypeFactory扩展DefaultDataTypeFactory,请确保覆盖getValidDbProducts()以指定支持的数据库产品.
当我使用没有spring-test-dbunit的DBunit时,问题可以解决如下:
Connection jdbcConnection = DriverManager.getConnection( "jdbc:mysql://localhost/test", "root", "root");
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
Run Code Online (Sandbox Code Playgroud)
我不知道如何在spring-test-dbunit中解决这个问题.请帮忙.
我正在开发用于测试模型功能的单元测试.
我使用PHP PDO与DBUnit 1.1.2和PHPUnit 3.6.10,我的数据集是一个yml文件.
我需要在数据库中加载灯具时关闭外键检查.之后,我需要再次打开它,以便我可以在这些约束下运行我的测试.
下面是我的通用Testcase文件中的代码片段(不是整个类文件),我将包含在我开发的任何新测试用例中.
当我在这些设置下运行测试用例时,我发现$ pdo-> exec()没有执行.
我的做法有什么问题?还有更好的选择吗?
class MyTestCase extends PHPUnit_Extensions_Database_TestCase {
public function getConnection() {
$this->pdo = $this->getPDO();
echo "BEFORE FOREIGN KEY QUERY\n";
$conn = $this->createDefaultDBConnection($this->pdo, 'my-schema');
$this->pdo->exec("set foreign_key_checks=0");
return $conn;
}
private function getPDO() {
include BASEPATH . '/application/config/database.php';
$dbt = $db['testing'];
$conn_string = sprintf("%s:host=%s;dbname=%s", $dbt['dbdriver'], $dbt['hostname'], $dbt['database']);
$pdo = new PDO($conn_string, $dbt['username'], $dbt['password']);
return $pdo;
}
public function getDataSet() {
echo "BEFORE FOREIGN KEY QUERY in getDataSet\n";
$this->pdo->exec("set foreign_key_checks=1");
return new PHPUnit_Extensions_Database_DataSet_YamlDataSet(ROOTPATH."/application/tests/data/my-dataset.yml");
} …Run Code Online (Sandbox Code Playgroud) 我正在使用PHPUnit/DBUnit来解决一些真正的速度问题.任何扩展都PHPUnit_Extensions_Database_TestCase需要永远运行.通过189次测试,该套件大约需要8-9分钟.我有点希望最多需要30秒;-)
看起来将数据库恢复到其初始状态是花费时间的过程,因此我们使数据集尽可能小并限制每个测试用例所需的表数.我正在使用灯具并尽可能地分享.
我可以使用任何设置或修改来加快执行速度吗?看看MySQL服务器在整个测试过程中做了什么,似乎发生了大量的截断/插入,但是将测试数据集打包到临时表中然后只需为每个测试选择它们会更快吗?
我正在使用的驱动程序是带有XML测试数据集的PDO/MySQL.
我们如何轻松导入/导出dbunit可以采用以下格式的数据库数据?
<dataset>
<tablea cola="" colb="" />
<tableb colc="" cold="" />
</dataset>
Run Code Online (Sandbox Code Playgroud)
我想找到一种方法从数据库中导出现有数据以进行单元测试.
我想创建一个空的测试表.使用来自digitalsandwich的示例,我想要类似于:
require_once 'PHPUnit/Extensions/Database/TestCase.php';
class BankAccountDBTest extends PHPUnit_Extensions_Database_TestCase
{
protected $pdo;
public function __construct()
{
$this->pdo = new PDO('sqlite::memory:');
BankAccount::createTable($this->pdo);
}
protected function getConnection()
{
return $this->createDefaultDBConnection($this->pdo, 'sqlite');
}
protected function getDataSet()
{
return $this->createFlatXMLDataSet(dirname(__FILE__).'/_files/empty-seed.xml');
}
public function testEmptyTableBehavior()
{
// test stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我应该使用与createFlatXMLDataSet()不同的方法吗?要么???
有没有人有关于如何开始将DBUnit层添加到我的PHPUNit测试的好的,有用的教程或书籍的链接?
我试过跟随代码
protected function getDatabaseTester()
{
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$connection = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($pdo);
$tester = new PHPUnit_Extensions_Database_DefaultTester($connection);
$tester->setSetUpOperation(PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT());
$tester->setTearDownOperation(PHPUnit_Extensions_Database_Operation_Factory::NONE());
/*
* the next line fails with the error
PHP Fatal error: __autoload(): Failed opening required 'PHPUnit_Extensions_Database_DataSet_FlatXMLDataSet.php' (include_path= ***
*/
$tester->setDataSet(new PHPUnit_Extensions_Database_DataSet_FlatXMLDataSet(dirname(__FILE__).'/../../../files/xml_database_export.xml'));
return $tester;
}
Run Code Online (Sandbox Code Playgroud)
XML是通过mysqldump命令创建的.我很乐意使用CSV,甚至是内存中的数组(无论什么工作)
不幸的是,我似乎无法启动此系统.