如何处理测试方法中的当前数据?

时间:2011-08-23 11:47:05

标签: c# unit-testing testing

在我的示例中,我有两种启用和禁用方法和帐户,我将为每种方法编写测试方法。

问题是我必须考虑数据的原始状态,并在测试之后将其恢复,即使在示例数据库中也是如此,以保持数据用于下一次测试。

public void DisableAndEnableAccount()
{
    var client = new GwIntegrationServiceSoapClient();

    string userName = "admin";
    Account account = client.GetAccountByUsername(userName);
    int accountID = account.Id;

    bool isActiveOrginalValue = account.IsActive;

    if (isActiveOrginalValue)
    {
        client.DisableAccount(accountID);
        account = client.GetAccountByUsername(userName);

        Assert.IsFalse(account.IsActive);

        client.EnableAccount(accountID);
        account = client.GetAccountByUsername(userName);

        Assert.IsTrue(account.IsActive);
    }
    else
    {
        client.EnableAccount(accountID);
        account = client.GetAccountByUsername(userName);

        Assert.IsTrue(account.IsActive);

        client.DisableAccount(accountID);
        account = client.GetAccountByUsername(userName);

        Assert.IsFalse(account.IsActive);
    }
}

我认为我的测试方法写得不好,不知道如何处理这种情况?

2 个答案:

答案 0 :(得分:2)

您应该在测试中使用测试数据(测试用户帐户),而不是真实测试数据。 (事实上​​,强烈建议您为测试使用单独的测试数据库,而不是真正的实时生产数据库。)然后,您可以在测试之前以任何方式自由设置它。顺便说一下,建议在单独的setUp()方法(或在JUnit 4中使用@Before注释的方法)进行设置。

但请注意,“经典”单元测试不应依赖于外部实体(如数据库或文件系统):它们应专注于测试与世界其他地方隔离的一个单元(类,方法)。这通常由dependency injectionmocking实现,即将它们隐藏在接口后面,这样在单元测试中,您可以提供一个虚拟实现,例如:没有连接到数据库,只是验证对它的调用和传递的参数。

测试整个集成系统仍然很有用,只是它不是单元,而是集成测试。单元测试可以更精细,更易于理解和维护,并且速度更快,因此无论何时,最好从单元测试开始,然后一旦确定较小的部件工作正常,请将一些集成测试放在一起进行验证系统端到端工作。

答案 1 :(得分:0)