【问题标题】:Integration test good practice集成测试良好实践
【发布时间】:2015-07-30 08:03:43
【问题描述】:

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

[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;
}

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

【问题讨论】:

  • 你不应该把它分成2个测试吗?一个用来保存数据,一个用来获取数据。您想测试保存方法是否有效。您还想测试检索方法是否有效?
  • @Jamie Rees 不,这里的检索方法只是为了获取断言数据。检查值是否保存到数据库。 Retrieve 方法仅用于集成测试目的。
  • 我不认为这真的是一个集成测试。它看起来像是对您的数据层的简单测试。通常是集成测试,测试多个组件。
  • 老实说,我不喜欢这种类型的测试。你的SaveToDB不应该返回一些东西吗?例如一个布尔值
  • 假设我在 SaveToDB 方法中有多个组件。我只是不想写复杂的例子。它是集成测试,因为它使用数据库。

标签: c# integration-testing


【解决方案1】:

您应该一次测试一个集成,并使数据库处于可以运行多个测试并且它们不应该相互影响的状态。 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;
    }
}

【讨论】:

  • 将“基础设施”代码放在公共库中是否有意义?基础设施是指创建我们的 SUT 的依赖项。
  • @VinShahrdar 什么是 SUT?
  • 被测系统。在这种情况下,您的“Act”中的代码行。
【解决方案2】:

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

你如何访问数据也不是很清楚,什么证明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();
            ...
        }
    }

【讨论】:

  • RepositoryForTest 只是从数据库中选择数据。选择使用 SaveToDB 方法插入的相同数据。这是仅在测试中使用的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2011-03-09
相关资源
最近更新 更多