【问题标题】:Unit test; correct approach?单元测试;正确的方法?
【发布时间】:2016-03-25 10:18:06
【问题描述】:

在工作中,我被要求增加我们在其中一款软件产品中的代码覆盖率。我以前从未做过单元测试,并且在网上阅读了许多教程;这些作为起点很有帮助,但都遵循相同的模式——它们正在测试非常简单的方法/类,如计算器或银行账户。

我在我们的代码中找到了一个简单的开始方法,但问题是它仍然比我读过的示例复杂得多,我不确定从哪里开始。方法如下:

public static void moveFiles {
    string rootDir = ConfigurationManager.AppSettings["RootLoc"];
    string dropboxLoc = ConfigurationManager.AppSettings["DropBoxLocation"];
    DirectoryInfo dropbox = new DirectoryInfo(dropboxLoc);
    folders = dropbox.GetDirectories("*", SearchOption.AllDirectories);

    string path = "";
    string prevPath = "";

    foreach (DirectoryInfo di in folders)
    {
        FileInfo[] files = di.GetFiles();
        foreach (FileInfo fi in files)
        {
            prevPath = fi.FullName;
            string[] p = prevPath.Split(new string[] { dropbox.Name }, StringSplitOptions.None);
            path = rootDir + p[1];
            fi.MoveTo(path);
        }

    }
}

我为此创建了一个小测试方法:

[TestMethod]
public void GetDirectories_ValidLocation_SetsDropboxLocation()
{
        string dropboxLoc = ConfigurationManager.AppSettings["DropBoxLocation"];
        DirectoryInfo dropbox = new DirectoryInfo(dropboxLoc);
        Assert.IsTrue(dropbox.Exists);
}

这是否符合应测试的内容?还是我看错了?

【问题讨论】:

  • 我可能忽略了一些东西,但是您要测试的方法永远不会在您的测试中调用...
  • 您的代码似乎从给定位置的每个目录中获取每个文件,并将它们移动到不同的位置。您编写的测试必须确认该行为。您当前的测试确认存在起始位置,这很好,但只是您问题的 0.1%。
  • @Heinzi 这就是我感到困惑的地方;在很多简单的例子中,这正是发生的事情。但是,在阅读复杂代码时,不建议调用复杂方法,因为您不再关注单个工作单元,而是方法中的大量工作单元。所以我不确定我的尝试是否是正确的方法:)
  • 这是您发现需要多次重构代码的地方。您发现您的代码完成了工作,但很难测试,因此您将其分解为更小的部分,通常带有您可以管理和替换的依赖项。 (这也是一些人/组织决定跳过单元测试的地方。)
  • 对这种方法进行适当的单元测试将涉及构建文件系统 Mock 并添加对它的依赖(而不是直接调用 DirectoryInfo / Move)。这确实比我建议的初始测试要大得多……Heinzi's answer 是某种解决方法,但有些人可能不会将这种方法称为“单元测试”,而是称为集成测试。

标签: c# visual-studio unit-testing visual-studio-2013


【解决方案1】:

您的单元测试应该测试该方法是否完成了它应该做的事情。你的moveFiles方法应该是移动文件,所以你需要测试它是否移动文件。

这是可以做到的:

  1. 在测试项目的 app.config 中,将 RootLocDropBoxLocation 设置为测试目录。

  2. 在你的测试方法中:

    一个。通过在 RootLoc 中创建一些测试文件来设置您的测试环境。确保 DropBoxLocation 为空。

    b.调用你的 moveFiles 方法。

    c。断言 DropBoxLocation 包含您期望的文件。

    d。清理(​​即删除测试文件)。

理想情况下,步骤 a 和 d 可以分别在 TestInitializeTestCleanup 方法中完成。此外,您可能希望将您的方法拆分为两种方法:

public static void moveFiles(string source, string destination)
{
    ...
}

public static void moveFiles()
{
    moveFiles(ConfigurationManager.AppSettings["RootLoc"],
              ConfigurationManager.AppSettings["DropBoxLocation"]);
}

这将允许您单独测试 moveFiles 方法,而无需依赖外部配置文件。这是一个非常简单的依赖注入示例 - 如果你的方法难以测试,你可能需要阅读它。

【讨论】:

  • 绝妙的答案!感谢您对依赖注入的提醒,我感觉在这个软件中会有很多这样的东西。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多