在C#中测试一个类库

5
这是一个非常模糊(和初学者)的问题,但是......如何测试C#中的类库?我正在使用nUnit进行测试。 我要做的是测试与数据库的交互。输入将是序列化的XML对象,反序列化以针对代码进行测试,然后XML对象将被重新序列化并输出。
希望这能提供一些见解。我考虑创建一个测试应用程序来创建库的实例。是否有不同/更好/更有效的方法可以采取?

非常满意所有的答案。感谢大家! - user5398447
5个回答

3

您需要创建一个单独的项目,使用NUnit的数据注释(TestFixtureTest等)。然后,您可以构建该项目并将创建的DLL加载到Nunit中。

至于测试,只需像平常一样编写它们(排列-操作-断言是更普遍的模式

就像这样:

[Test]
public void MethodName_CallDatabase_ObjectDeserialized()
{
    //Arrange
    var db = new db();
    //Act 
    var output = db.ExecuteCall();
    //Assert
    Assert.That(output, Is.EqualTo("123"));
}

创建了一个名为“test”的单独项目,后缀为.TEST。谢谢。 - user5398447
@edmastermind29 只是为了澄清,因为我认为可能仍然存在一些困惑,这个回答是否解决了你的问题? - Justin Pihony
是的,“独立项目”帮了我很大的忙。请看Tejs的回答,他提到了YourApplication.Tests,这就是我将要实现的方式。 - user5398447

2

如果你真的想要严谨,这里有几个部分需要注意:

  1. 熟悉NUnit、MBUnit或MSTest。
  2. 找出库与其他库、框架、工具的交互点。编写一些测试用例,以编码你对这些其他东西应该如何行动(以及它们应该如何不正确)的假设。安装并熟悉使用模拟/存根库,例如Moq或Rhino.Mocks。这些将告诉你,当你的代码以不正确的方式与外部代码交互时。
  3. 如果你感觉自己能够胜任,编写一些更多的测试(在我看来,这些测试属于集成和单元测试之间),将一个真实但简单的数据库与相同或类似的架构连接起来,例如SQLite。现在,你的代码不再与你预先编程的期望的模拟进行交流,但它也没有到达完整的数据库。
  4. 集成测试。将其连接到一个真实的[非生产]数据库上。

还不够完美,但这为我今后的工作提供了很多参考。谢谢。 - user5398447

2

关于如何实现,通常您的解决方案将如下所示:

 Solution (Your Application)
    + YourApplication.Library
    + YourApplication.WebApp
    + YourApplication.Tests

Tests项目是您可以添加到解决方案中的特定项目。在其中,您可以创建单元测试文件,这些文件将使用NUnit DLL进行标记,然后运行。这意味着将那些类标记为TestFixture,将这些类中的特定方法标记为Test方法,然后它们将执行您的YourApplication.Library项目的部分,并支持Assert调用以验证库调用的结果。


对于一个新手来说,C#是非常有帮助的,但对于一位资深的软件工程师来说更是如此。 - Stevers

1

针对此问题,可以使用众多现有的单元测试框架之一。

nUnit, xUnit甚至是MSTest(随多个Visual Studio版本一起提供)均可选用。


我正在使用nUnit。我如何测试类库? - user5398447
@edmastermind29 - 与其他事物的使用方式相同。添加对要测试的程序集的引用,为不同的函数编写测试并运行它们。不确定问题在哪里,因为我大多数情况下都使用nUnit进行类库测试。 - Oded

0
如果您不想创建新的测试项目,只需在现有的类库项目中添加一个新类,并为其添加Nunit注释TestFixture,然后将测试作为同一类中的方法。如下所示。
namespace APIWorkOut
{
    [TestFixture]
    public class TestClass
    {
        [Test]
        public void getListOfUser()
        {
            API api = new API();
            var listOFUsers = api.getUsers();
            Console.Write(listOFUsers.Data.Count);
        }       
        
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接