Redshift 集成测试(或其他 SQL 数据库)。使用 Java 中的 CSV 文件验证 table 内容

Redshift integration tests (or other SQL DB). Verify table contents using CSV files in Java

我想创建集成测试,在不知道 table 结构的情况下检查任何 DB table 内容。某种测试框架,我放了一组 CSV 文件,名称如 table_to_test.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 上我可以将数据从 table 卸载到 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 中测试的所有 table 名称(resource 实例应指向此文件)。该文件必须放在所有 CSV 文件所在的同一目录中。 table-ordering.txt示例:

my_table_1
my_table_2
my_table_3

包含预期数据的 CSV 文件的名称必须分别为 my_table_1.csvmy_table_2.csvmy_table_3.csv。如果您需要断言 null 值,您必须在 CSV 中明确指定单词 "null"。还要注意 CSV 中的数据。在我的例子中,我在标题中多了一个空白符号。在文本编辑器中它是不可见的,但是测试失败了,而且很难调试。

CSV 转义符号为“\”。