使用 TestNG 测试数据库不回滚
Test DB with TestNG not rolling back
我正在尝试使用数据库和 TestNG 进行一些基本的自动化测试,但它无法正常工作。第一个 运行 如我所料成功,第二个没有,因为第一个从未回滚。我已经看过几个地方的例子,它似乎是正确的。任何人都知道我错过了什么
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
<scope>test</scope>
</dependency>
代码:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.Test;
@ContextConfiguration(classes = AutomatedTest.Context.class)
public class RollbackTest extends AbstractTransactionalTestNGSpringContextTests {
@Test
@Rollback
@Transactional
public void testThing() throws Exception {
Class<? extends RollbackTest> c = this.getClass();
String path = String.format("/%s.sql", c.getName().replaceAll("\.", "/"));
super.executeSqlScript(path, false);
}
@Configuration
@PropertySource("db.properties")
static class Context {
@Bean
public DataSource dataSource(
@Value("${datasource.url}") String url,
@Value("${datasource.username}") String user,
@Value("${datasource.password}") String pass,
@Value("${datasource.driver-class-name}") String driver) throws PropertyVetoException {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setUser(user);
ds.setPassword(pass);
ds.setJdbcUrl(url);
ds.setDriverClass(driver);
return ds;
}
@Bean
public Connection connection(DataSource dataSource) throws SQLException {
Connection c = dataSource.getConnection();
System.out.println("Connection is " + c);
return c;
}
@Bean
public DataSourceTransactionManager txMan(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}
}
sql:
CREATE SCHEMA FOO;
CREATE TABLE FOO.BAZ (
ID int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(256) NOT NULL
);
INSERT INTO FOO.BAZ (name) values('christian');
错误:
创建架构 FOO
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [automated/RollbackTest.sql]: CREATE SCHEMA FOO; nested exception is java.sql.SQLException: Can't create database 'FOO'; database exists
returns一个Connection
的@Bean
方法看起来很可疑。所以我建议你删除它。
为了执行 SQL 脚本 before 或 after 测试方法,理想情况下你应该查看 Spring的@Sql
注释。
此外,您可以安全地删除测试方法中的 @Rollback
和 @Transactional
声明。
@Rollback
是默认行为。
@Transactional
已在 AbstractTransactionalTestNGSpringContextTests 上声明。
此致,
Sam(Spring TestContext Framework 的作者)
我正在尝试使用数据库和 TestNG 进行一些基本的自动化测试,但它无法正常工作。第一个 运行 如我所料成功,第二个没有,因为第一个从未回滚。我已经看过几个地方的例子,它似乎是正确的。任何人都知道我错过了什么
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
<scope>test</scope>
</dependency>
代码:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.Test;
@ContextConfiguration(classes = AutomatedTest.Context.class)
public class RollbackTest extends AbstractTransactionalTestNGSpringContextTests {
@Test
@Rollback
@Transactional
public void testThing() throws Exception {
Class<? extends RollbackTest> c = this.getClass();
String path = String.format("/%s.sql", c.getName().replaceAll("\.", "/"));
super.executeSqlScript(path, false);
}
@Configuration
@PropertySource("db.properties")
static class Context {
@Bean
public DataSource dataSource(
@Value("${datasource.url}") String url,
@Value("${datasource.username}") String user,
@Value("${datasource.password}") String pass,
@Value("${datasource.driver-class-name}") String driver) throws PropertyVetoException {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setUser(user);
ds.setPassword(pass);
ds.setJdbcUrl(url);
ds.setDriverClass(driver);
return ds;
}
@Bean
public Connection connection(DataSource dataSource) throws SQLException {
Connection c = dataSource.getConnection();
System.out.println("Connection is " + c);
return c;
}
@Bean
public DataSourceTransactionManager txMan(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}
}
sql:
CREATE SCHEMA FOO;
CREATE TABLE FOO.BAZ (
ID int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(256) NOT NULL
);
INSERT INTO FOO.BAZ (name) values('christian');
错误:
创建架构 FOO
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [automated/RollbackTest.sql]: CREATE SCHEMA FOO; nested exception is java.sql.SQLException: Can't create database 'FOO'; database exists
returns一个Connection
的@Bean
方法看起来很可疑。所以我建议你删除它。
为了执行 SQL 脚本 before 或 after 测试方法,理想情况下你应该查看 Spring的@Sql
注释。
此外,您可以安全地删除测试方法中的 @Rollback
和 @Transactional
声明。
@Rollback
是默认行为。@Transactional
已在 AbstractTransactionalTestNGSpringContextTests 上声明。
此致,
Sam(Spring TestContext Framework 的作者)