集成测试良好实践

Integration test good practice

我使用单元测试有一段时间了。但是现在我需要编写集成测试。我应该将一些东西保存到数据库,然后检查保存的数据是否正常。 我找不到简单干净的集成测试示例。 我的想法是这样做:

[Test]
public void IntegrationTestExample()
{
    // Arrange without mocking
    var objec1 = new objec1();
    var objec2 = new objec2();

    var startTestClass = new startTestClass(objec1, objec2);
    var saveData = "test data";

    //Act
    startTestClass.SaveToDB(saveData);

    // Assert
    var valueFromDB = SelectSavedData();
    Assert.AreEqual(saveData, valueFromDB);
}

//Get data from DB for assert
private string SelectSavedData() 
{
    var sqlQuery = "Select TOP 1 data from table1";                
    var data = RepositoryForTest.selectSavedData(sqlQuery);
    return data;
}

但我不确定这是否是个好方法? 你有什么建议吗?

当您使用真实数据库时,您应该在每次测试 尝试后清理它。

你是怎么访问数据的也不是很清楚,凭什么证明RepositoryForTest没有任何错误?尝试做最简单的你的断言

我对数据库的测试如下:

    public void Test()
    {
        try
        {
            // Fixture setup
            // Create and insert data into Database (with plain ADO code)

            // Exercise system


            // Verify outcome
            // use your data layer here
        }
        finally
        {
            // Teardown - other methods to clean the tables afterwards
            DatabaseHelper.ClearLookups();
            DatabaseHelper.ClearBeds();
            ...
        }
    }

您应该一次测试一个集成,并让数据库处于可以 运行 进行多项测试且它们不应相互影响的状态。 MS 测试框架允许您定义在测试期间的特定时间设置和清理测试的方法运行,如以下代码所示

[TestClass]
public class ReturnServiceTest {
    [ClassInitialize()]
    public static void ClassInit(TestContext context) {
        //INIT TEST DATA FOR THE CLASS
    }

    [TestCleanup]
    public void TestCleanup() {
        //CLEANUP DATA AFTER EACH TEST
    }

    [TestMethod]
    public void IntegrationTestExample() {
        // Arrange without mocking
        var objec1 = new objec1();
        var objec2 = new objec2();

        var startTestClass = new startTestClass(objec1, objec2);
        var saveData = "test data";

        //Act
        startTestClass.SaveToDB(saveData);

        // Assert
        var valueFromDB = SelectSavedData();
        Assert.AreEqual(saveData, valueFromDB);
    }

    //Get data from DB for assert
    private string SelectSavedData() {
        var sqlQuery = "Select TOP 1 data from table1";
        var data = RepositoryForTest.selectSavedData(sqlQuery);
        return data;
    }
}