C# 如何高效地进行单元测试

C# 如何高效地进行单元测试,c#,unit-testing,C#,Unit Testing,以下是我的方法 User UpdateUser(User user) { } 无论何时测试这个方法,我都会像下面这样进行测试 我几乎写了20到30个测试用例 在这方面,我使用了以下方法 对于每个测试用例,我都创建了用户对象,并提供了必要的输入,还提供了错误的输入以进行检查,最后我将删除在DB中更新的用户详细信息 比如说 [TestMethod] void test1() { try { // Here will call updateUser and do ne

以下是我的方法

User UpdateUser(User user)
{
}
无论何时测试这个方法,我都会像下面这样进行测试

我几乎写了20到30个测试用例

在这方面,我使用了以下方法

对于每个测试用例,我都创建了用户对象,并提供了必要的输入,还提供了错误的输入以进行检查,最后我将删除在DB中更新的用户详细信息

比如说

[TestMethod]
void test1()
{
    try
    {
        // Here will call updateUser and do necessarry check
    }
    finally
    {
        // here I'll delete user details from DB
    }
}

[TestMethod]
void test2()
{
    try
    {
        // Here will call updateUser and do necessarry check
    }
    finally
    {
        // here I'll delete user details from DB
    }
}
这是单元测试的正确方法吗

因为,如果我使用TestInitialize,也会对每个测试用例调用它


我是用正确的方法做的,还是有其他方法?

不,这不是正确的方法,因为这不再是单元测试,而是集成测试。单元测试不应触及数据库。而是使用模拟和存根来模仿行为


如果你的问题是关于集成测试的,那么它有点基于观点。这取决于你的需求和偏好,只要它满足你的需求。我见过多种方法来处理这种情况。最重要的是要始终如一。一旦您选择了一种方法,请坚持到项目完成,这样您就不会混合多种编程风格。

不,这不是一种正确的方法,因为这不再是单元测试,而是集成测试。单元测试不应触及数据库。而是使用模拟和存根来模仿行为

如果你的问题是关于集成测试的,那么它有点基于观点。这取决于你的需求和偏好,只要它满足你的需求。我见过多种方法来处理这种情况。最重要的是要始终如一。一旦你选择了一种方法,坚持到项目完成,这样你就不会混合多种编程风格。

你可以使用

测试完成后(即使异常失败),对DB的更改将回滚,您不需要自己进行清理
就效率而言,我不确定这是一个好方法,但它确实更容易:)

你可以使用

测试完成后(即使异常失败),对DB的更改将回滚,您不需要自己进行清理

就有效性而言,我不确定这是一个好方法,但它确实更容易:)

如果你能将方法更改为无效,那么该方法将更容易测试,而且对我来说也更有意义。现在,您的方法做两件事(1)更新用户和(2)返回用户。测试只做一件事的方法总是比较容易的

您不应该在单元测试中对数据库进行模拟。这样想吧,;您应该能够在没有internet连接的情况下运行测试,等等。如果代码在没有外部系统可访问的上下文中编译,那么单元测试应该能够在相同的上下文中执行


如果您无法控制UpdateUser类,则不应该对其进行单元测试。如果您的代码依赖于它,那么您需要模拟UpdateUser,以便可以测试您的类。

如果您可以将方法更改为void,那么该方法将更易于测试,而且对我来说也更有意义。现在,您的方法做两件事(1)更新用户和(2)返回用户。测试只做一件事的方法总是比较容易的

您不应该在单元测试中对数据库进行模拟。这样想吧,;您应该能够在没有internet连接的情况下运行测试,等等。如果代码在没有外部系统可访问的上下文中编译,那么单元测试应该能够在相同的上下文中执行



如果您无法控制UpdateUser类,则不应该对其进行单元测试。如果你的代码依赖于它,你需要模拟UpdateUser,这样你就可以测试你的类。

如果你想让任何人都能回答问题,你应该用你正在使用的编程语言和测试框架来标记。如果你想让任何人都能回答问题,你应该用你正在使用的编程语言和测试框架来标记可能的重复项我正在使用单独的数据库。我没有使用应用程序数据库..@Jeeva,单元测试应该单独测试单元。您仍然在测试整个数据库层。当使用测试数据库时,更新db imoNote是非常好的-单元测试不应该接触任何外部源。这通常是一个数据库,但也包括web服务、文件系统和其他正在运行的进程。@ServéLaurijssen,只要您不称之为单元测试;)正如其他人已经提到的,单元测试应该只在隔离状态下运行,因此被称为“单元测试”。我使用的是单独的数据库。我没有使用应用程序数据库..@Jeeva,单元测试应该单独测试单元。您仍然在测试整个数据库层。当使用测试数据库时,更新db imoNote是非常好的-单元测试不应该接触任何外部源。这通常是一个数据库,但也包括web服务、文件系统和其他正在运行的进程。@ServéLaurijssen,只要您不称之为单元测试;)正如其他人已经提到的,单元测试应该只单独运行,因此被称为“单元测试”。这就是我们测试db查询的方式,您可以在基类或方面中集成using()。它不再是一个真正的单元测试,而是一个集成测试!我完全同意你:)这是集成测试。但是is在测试系统方面仍然有价值这是我们测试db查询的方式,您可以在基类或方面中集成using()。它不再是一个真正的单元测试,而是一个集成测试!我完全同意你:)这是集成测试。但是它在测试系统方面仍然有价值,但是无论如何,有人编写的UpdateUser方法将影响数据库。。。我能在这里做什么?你想要一个数据库接口吗
[TestMethod]
void test1()
{
  using (var scope = new TransactionScope(TransactionScopeOption.Required))
  {
    // Here will call updateUser and do necessarry check

    //just never call scope.Complete() and alle your db changes will be rolled back
  }
}