我听说在开发使用数据库的应用程序时,您应该进行数据库单元测试.数据库单元测试的最佳实践是什么?进行数据库单元测试以及如何"正确"执行此操作时,主要关注的是什么?
我想创建单元测试,涵盖在Play框架2.1.0中使用关系数据库的代码.这有很多可能性,所有原因都有问题:
Play框架文档建议在H2内存数据库上运行单元测试,即使用于开发和生产的主数据库使用其他软件(即MySQL):
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Run Code Online (Sandbox Code Playgroud)
我的应用程序不使用复杂的RDBMS功能,如存储过程,大多数数据库访问情况是ebean调用,因此它应该兼容MySQL和H2.
然而,在变阵创建表的语句中使用MySQL特定的功能,如指定ENGINE = InnoDB,DEFAULT CHARACTER SET = utf8等我担心我是否会删除这些专有部分CREATE TABLE,MySQL将使用一些默认设置,我无法控制和依赖的版本,所以测试和开发应用程序主MySQL配置必须修改.
任何人都使用这种方法(使evolutions与MySQL和H2兼容)?
其他想法如何处理:
create table(MySQL兼容模式不起作用,它仍然会抱怨default character set).我不知道怎么回事.H2内存数据库的唯一优势是它速度快,并且在与dev/production数据库相同的数据库驱动程序上进行测试可能会更好,因为它更接近真实环境.
如何在Play框架中完成?
尝试:
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);
Run Code Online (Sandbox Code Playgroud)
看起来像evolutions在这里工作,但在每次测试之前如何最好清理数据库?通过创建截断每个表的自定义代码?如果它会丢弃表格,那么演化会在下一次测试之前再次运行,还是每个play test命令应用一次?或者每次Helpers.fakeApplication()调用一次?
这里的最佳做法是什么?听说dbunit,有没有可能整合它没有太多的痛苦和怪癖?
unit-testing database-testing playframework playframework-2.0
是否有人知道使用SQL对存储过程进行单元测试的框架(或方法),并能够生成合理的报告,告知已经过了什么和失败了什么(类似于CPPUnit)?
当您使用数据访问层或大多数应用程序堆栈进行集成测试时.如果多个测试在同一个数据库上运行,那么阻止多个测试相互冲突的最佳方法是什么?
我最近在MySQL中做了很多sproc编程.
我必须说我喜欢它.很多.
然而调试这些婴儿很糟糕.
任何人都知道任何可以在My MySQL调试中获得快乐的工具吗?
是否可以在PHPUnit上加载多个平面xml数据集来加载大量的灯具?
我们正在编写一个相当复杂的应用程序,并且xml数据集变得非常大,所以我想把它放到2-3 xml中.
以下是测试用例的当前代码:
<?php
class My_TestBase extends Zend_Test_PHPUnit_DatabaseTestCase{
/**
* Zend_Application
* @var Zend_Application
*/
protected $_application;
/**
* Connection
*
* @var Zend_Test_PHPUnit_Db_Connection
*/
private $_connection;
/**
* Returns the test database connection.
*
* @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
protected function getConnection(){
if($this->_connection === null){
$Resources = $this->_application->getOption("resources");
$conn = Zend_Db::factory($Resources["db"]["adapter"], $Resources["db"]["params"]);
$this->_connection = $this->createZendDbConnection($conn, $Resources["db"]["params"]["dbname"]);
}
return $this->_connection;
}
/**
* Returns the test dataset.
*
* @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
protected function …Run Code Online (Sandbox Code Playgroud) 我基本上有一个测试场景,我在那里
SQL Server 是否仅支持内存中的类似内容,以便我可以通过删除 #1 和 #5 来加快速度?显然我不需要坚持。
sql-server integration-testing database-testing in-memory-database
我认为数据库测试包含 CRUD 操作是很常见的。所以这些函数会修改数据库,使预期的值发生变化:例如。如果我测试 SELECT 返回 2 行,如果删除测试运行 1st,我可能会失败。类似于插入。JUnit 似乎没有按照定义运行测试,这使得期望值变得困难。
如果我在每次测试时都重新初始化我的数据库,它可能会矫枉过正而且速度很慢。那么我该如何解决这个问题呢?
我如何使用NUnit和测试数据库来验证我的代码?我理论上会使用模拟(moq),但我的代码更多是维护形状并修复它模式,我没有设置所有的模拟.
我只是创建一个测试项目,然后编写实际连接到我的测试数据库的测试并按照我在应用程序中执行代码吗?然后我用断言检查代码,并确保我要求的是我正确回来的东西?
我似乎无法准确地解释为什么你应该在开发中使用与生产中相同的数据库.我个人喜欢在开发中使用sqlite3(它很轻,易于使用,并且有一个甜蜜的sqlite浏览器GUI工具),然后在生产中使用postgres与heroku.但是,我一直在听听RBates或Michael Hartl或其他人是否应该在两者中使用相同的数据库,为什么会这样呢?
database-testing ×10
unit-testing ×5
mysql ×2
.net-3.5 ×1
c# ×1
database ×1
fixtures ×1
junit ×1
nunit ×1
php ×1
phpunit ×1
postgresql ×1
regex ×1
sql-server ×1
sqlite ×1
tdd ×1