Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何确保完整的单元测试覆盖率?_C#_Visual Studio_Unit Testing_Reflection_Tdd - Fatal编程技术网

C# 我如何确保完整的单元测试覆盖率?

C# 我如何确保完整的单元测试覆盖率?,c#,visual-studio,unit-testing,reflection,tdd,C#,Visual Studio,Unit Testing,Reflection,Tdd,我有两个项目,一个是“主”项目,另一个是“测试”项目 政策是,主项目中的所有方法必须在测试项目中至少有一个附带测试 我想要的是在测试项目中进行一个新的单元测试,以验证这一点。如果有任何方法没有相应的测试(这包括方法重载),那么我希望这个测试失败 当测试失败时,我可以整理出适当的消息 我的猜测是,我可以得到每个方法(使用反射???),但我不确定如何验证在这个测试项目中是否有对每个方法的引用(并且忽略项目中的引用)您可以使用任何现有的软件来测量代码覆盖率,但是 不要这样做!!!认真地我们的目标不应该

我有两个项目,一个是“主”项目,另一个是“测试”项目

政策是,主项目中的所有方法必须在测试项目中至少有一个附带测试

我想要的是在测试项目中进行一个新的单元测试,以验证这一点。如果有任何方法没有相应的测试(这包括方法重载),那么我希望这个测试失败

当测试失败时,我可以整理出适当的消息


我的猜测是,我可以得到每个方法(使用反射???),但我不确定如何验证在这个测试项目中是否有对每个方法的引用(并且忽略项目中的引用)

您可以使用任何现有的软件来测量代码覆盖率,但是

不要这样做!!!认真地我们的目标不应该是100%覆盖,而应该是拥有易于发展的软件。从您的测试项目中,您可以通过反射调用每一个现有方法并吞下所有异常。这将使你的保险覆盖率达到100%左右,但这又有什么好处呢


了解TDD。开始创建可测试的软件,这些软件具有有意义的测试,可以在出现问题时为您节省时间。这不是关于覆盖范围,而是关于安全。

这是一个元测试的例子,原则上听起来不错,但一旦你了解了细节,你应该很快意识到这是个坏主意。正如已经提出的那样,正确的方法是鼓励拥有该政策的人修改该政策。正如你所引用的政策,它足够具体,人们可以满足需求,而不真正实现任何有价值的东西

考虑:

public void TestMethod1Exists()
{
    try
    {
        var classUnderTest = new ClassToTest();
        classUnderTest.Method1();
    }
    catch (Exception)
    {
    }
}
该测试包含对
ClassToTest
上的
Method1
的调用,因此满足了对该方法进行测试的要求,但没有测试任何有用的内容。只要该方法存在(如果代码已编译,则必须如此),测试就会通过

该策略的目的大概是试图确保对编写的代码进行测试。查看一些非常基本的代码:

public string IsSet(bool flag)
{
    if (flag)
    {
        return "YES";
    }
    return "NO";
}
就方法而言,这非常简单(可以很容易地更改为一行),但即使如此,它也包含通过方法的两条路径。进行测试以确保调用此方法会使您产生错误的安全感。您可能知道它正在被调用,但不知道是否所有的代码路径都在测试中

建议的另一种选择是,您可以只使用代码覆盖工具。这些可能很有用,并且可以更好地了解代码的运行情况,但它们同样只提供覆盖范围的指示,而不是覆盖范围的质量。假设我对上面的
IsSet
方法进行了一些测试:

public void TestWhenTrue()
{
    var classUnderTest = new ClassToTest();
    Assert.IsString(classUnderTest.IsSet(true));
}
public void TestWhenFalse()
{
    var classUnderTest = new ClassToTest();
    Assert.IsString(classUnderTest.IsSet(false));
}
我正在传递足够的参数来执行这两个代码路径,因此
IsSet
方法的覆盖率应该是100%。但我测试的只是该方法返回一个字符串。我没有测试字符串的值,所以测试本身并没有增加太多(如果有的话)值


代码覆盖率是一个有用的指标,但仅作为代码质量的一部分。就如何在团队中有效地测试您正在编写的代码进行同行评议并分享最佳实践,而这些代码的具体可测量性较差,这将对您的测试代码的质量产生更大的影响。

这太疯狂了。阅读有关测试驱动开发的内容。您可以让代码覆盖率自动为您完成所有这一切。您不需要编写任何特定的内容,只需在配置中设置要包含在代码覆盖率结果中的项目。它将在您运行单元测试时进行计算。这听起来像是确保“主”项目中非常大的方法的一种方法:)我建议阅读关于行为驱动开发的内容。这是一种不好的要求。仅仅因为您有一个涉及某个方法的测试,并不意味着它涉及该方法的所有代码路径。代码覆盖率是您需要的。在您运行项目中的所有测试后,代码覆盖率将告诉您哪些代码路径未命中,从而使您能够添加新的测试来覆盖这些路径。请查看可以快速告诉您(在Visual Studio IDE中使用彩色符号)哪些方法有或没有单元测试覆盖它们。例如,如果您正在开发一个服务,请创建一个服务,它主要是一个空壳,用于加载包含您的功能的相关库。您不需要测试服务本身,只需要测试包含该功能的库。还要确保您的库的结构能够提供特定于其用途但尽可能可重复使用的小型可测试件。