我想为我的应用程序编写集成测试,它通过jdbc使用MySQL数据库。 (仅供参考:到目前为止,该应用程序有一个用户数据库和一个wiki,所以真的没什么复杂的)
我发现了很多帖子,主要是谈论HSQLDB或H2,以及一些exotics或停止(如mxj)
可悲的是,大多数这些线程是在几年前制作的,从那以后发生了很多变化。 我正在寻找具有最近经验的人(或者甚至更好地拥有像我一样的类似设置 - 这意味着春天以及需要在本地和jenkins上运行这些测试)!我知道找到答案的最佳方法是亲自尝试,看看哪种方法效果最好,但也许有人有近期经验并愿意分享:)
使用的技术:
如果您能与我分享您的经验和建议,我将非常感激。
答案 0 :(得分:0)
所以我决定使用h2,这给我带来了导入MySQL哑的一些问题。答案在这里:Running h2 in MODE=MySQL doesn't support MySQL dumps
基本上,你必须删除表名周围的引号(它们似乎适用于字段)。您可以使用反向标记(`)或根本不使用任何刻度/引号。 导致问题的另一个原因是表定义末尾的“AUTO_INCREMENT = 1”。由于h2在启动后使用1作为默认值,因此无论如何都不需要此命令。
以下是如何设置嵌入式数据库的示例:
public class InMemoryTest {
@org.testng.annotations.Test // ofc this can be JUnit @Test as well
public void test() throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:mem:test;MODE=MySQL;IGNORECASE=TRUE;INIT=RUNSCRIPT FROM 'src/test/resources/test.sql'");
Statement stat = conn.createStatement();
stat.execute("INSERT INTO `usr_avatar` (\"usr_avatar_user_id\") VALUES (1)");
}
}
并且test.sql将是:
DROP TABLE IF EXISTS usr_avatar;
CREATE TABLE IF NOT EXISTS usr_avatar (
"usr_avatar_id" int(11) NOT NULL AUTO_INCREMENT,
"usr_avatar_user_id" int(11) NOT NULL
)
答案 1 :(得分:0)
尝试为此目的创建的Maven插件:jcabi-mysql-maven-plugin
。它在pre-integration-test
阶段启动本地MySQL服务器并在post-integration-test
上关闭它。