我想创建集成测试来检查任何数据库表内容而不知道表结构。某种测试框架,我放置了一组名称如 table_to_test.csv
的 CSV 文件,测试选择这些文件并断言与数据库内容相等。
根据文档,这可以使用 DBUnit 来实现
IDataSet databaseDataSet = dbUnitConnection.createDataSet();
ITable actualTable = databaseDataSet.getTable(tableName);
// Load expected data from an CSV dataset
IDataSet expectedDataSet = new CsvURLDataSet(resource.getURL());
ITable expectedTable = expectedDataSet.getTable(tableName);
// Assert actual database table match expected table
org.dbunit.Assertion.assertEquals(expectedTable, actualTable);
尽管这正是我所需要的,但该解决方案似乎没有文档记录、不灵活,因此可能不可靠。我也无法快速找到 DBUnit 错误跟踪器。
我想知道是否有替代解决方案。 CSV 到 CSV 比较框架也可能有效,因为在 Redshift 上我可以将数据从表卸载到 CSV 文件。
最佳答案
最终我能够使用DB Unit。如果您使用Spring,您可以通过这种方式设置数据库连接(@BeforeEach 来自 JUnit5 )
@Autowired
private DataSource dataSource;
private DatabaseDataSourceConnection dbUnitConnection;
@BeforeEach
void beforeEach() throws SQLException {
dbUnitConnection = new DatabaseDataSourceConnection(dataSource, schema);
}
对于断言,您将需要原始问题中的代码。您还需要在 table-ordering.txt
中指定要测试的所有表名称(resource
实例应指向此文件)。该文件必须放置在所有 CSV 文件所在的同一目录中。 table-ordering.txt
示例:
my_table_1
my_table_2
my_table_3
包含预期数据的 CSV 文件必须分别具有名称 my_table_1.csv
、my_table_2.csv
和 my_table_3.csv
。如果您需要断言 null
值,则必须在 CSV 中显式指定单词“null”。另请注意 CSV 中的数据。就我而言,标题中多了一个空白符号。在文本编辑器中它是不可见的,但是测试失败了,并且很难调试。
CSV 转义符号是“\”。
关于java - Redshift 集成测试(或其他 SQL DB)。在 Java 中使用 CSV 文件验证表内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46052429/