当前位置: 首页 > 知识库问答 >
问题:

如何正确地进行单元测试

鄂育
2023-03-14

我正在尝试使用测试驱动设计方法编写一个应用程序--我对单元测试很陌生,所以我只是想知道测试正确输入和异常的正确方法是什么。

我有一个用于加载配置文件的类:

class Config
{
    private XmlDocument configfile;

    public Config()
    {
        configfile = new XmlDocument();
    }

    public void LoadConfigFile(string filename)
    {
        if(string.IsNullOrEmpty(filename)) 
            throw new System.ArgumentException("You must specify a filename");

        try
        {
            configfile.Load(filename);
        }
        catch (Exception ex)
        {
            throw new System.IO.FileNotFoundException("File could not be loaded");
        }
    }
}
    null
    /// <summary>
    ///A test for LoadConfigFile
    ///</summary>
    [TestMethod()]
    public void LoadConfigFileTest()
    {
        Config target = new Config(); // TODO: Initialize to an appropriate value
        string filename = "config.xml"; // TODO: Initialize to an appropriate value
        target.LoadConfigFile(filename);
        Assert.Inconclusive("A method that does not return a value cannot be verified.");
    }

    /// <summary>
    ///A test for LoadConfigFile
    ///</summary>
    [TestMethod()]
    [ExpectedException(typeof(System.ArgumentException))]
    public void LoadConfigFileTest1()
    {
        Config target = new Config(); // TODO: Initialize to an appropriate value
        string filename = ""; // TODO: Initialize to an appropriate value
        target.LoadConfigFile(filename);
        Assert.Inconclusive("A method that does not return a value cannot be verified.");
    }

    /// <summary>
    ///A test for LoadConfigFile
    ///</summary>
    [TestMethod()]
    [ExpectedException(typeof(System.IO.FileNotFoundException))]
    public void LoadConfigFileTest2()
    {
        Config target = new Config(); // TODO: Initialize to an appropriate value
        string filename = "blah.xml"; // TODO: Initialize to an appropriate value
        target.LoadConfigFile(filename);
        Assert.Inconclusive("A method that does not return a value cannot be verified.");
    }

另外,这3个测试是否都有try{}catch(){}语句?在第一个测试中,正确性是隐含的,在第二个和第三个测试中,我无论如何都在检查异常,所以异常对测试没有影响。

共有1个答案

松俊才
2023-03-14

你在正确的道路上,但还没有完全实现。

必须调用assert.incolution的情况非常罕见,在您的情况下,这是不必要的:当您预期出现异常并且该异常被抛出时,它将按它应该的方式工作(也就是:它应该显示为绿色结果)。当您期望出现异常但没有抛出异常时,它将显示为失败(又名:红色结果)。更多关于这一点。

事实上,可以测试返回void的方法。它可能会改变某物的状态,而不是返回值。在您的例子中,变量configfile。测试的方法是通过检索值(例如提供getter)和/或使用依赖项注入并在测试中用变量替换假的/mock/stub(选择您的行话)。

关于评论的扩展:

我不希望开发器直接干扰configfile属性,那么我是否应该为测试将其公开,然后将其改回private?

这是一个值得关注的问题,每个开发人员在进行测试时都要面对它。重要的是要意识到一个单元的内部工作不是你通常应该测试的东西。实现细节正是它们的本来面目:实现细节。然而,有时替代方案甚至更不需要,所以你必须进行比较,是否你想做到底。

这个过程--依赖注入--是单元测试的支柱,也将有助于您的第一个评论。

 类似资料:
  • 单元测试,对独立的代码功能片段,由编写代码的团队进行测试,也是一种编码,而非与之不同的一些事情。设计代码的一部分就是设计它该如何被测试。你应该写一个测试计划,即使它只是一句话。有时候测试很简单:“这个按钮看起来好吗?”,有时候它很复杂:“这个匹配算法可以精确地返回正确的匹配结果?”。 无论任何可能的时候,使用断言检查以及测试驱动。这不仅能尽早发现 bug,而且在之后也很有用,让你在其他方面担心的谜

  • 我有一些使用泛型和TypeTokens来反序列化JSON的服务代码。需要该服务来反序列化保持其泛型参数类型的复杂TypeToken。 看起来我在调试的时候是对的。toString()函数表明它知道它的泛型类型参数: 最后,我有一个单元测试。它通过,但不测试泛型类型参数。我测试了TypeToken的rawType(),得到了正确的类,但我不确定如何测试它的泛型类型。

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元