C# 编写一个测试方法来确定代码是否有获取空引用异常的风险

C# 编写一个测试方法来确定代码是否有获取空引用异常的风险,c#,unit-testing,exception,nullreferenceexception,C#,Unit Testing,Exception,Nullreferenceexception,我正在尝试用C#编写一个通用测试方法,它将告诉我目标方法是否有获取null引用异常的风险 我想对类中的所有函数运行这个方法,并想确定哪些方法有获得null引用异常的风险 像下面这样 [TestMethod] Public Void TestReferenceVulnarability() { try { MyClass _myClass = new MyClass(); //Do something target = _myClas

我正在尝试用C#编写一个通用测试方法,它将告诉我目标方法是否有获取null引用异常的风险

我想对类中的所有函数运行这个方法,并想确定哪些方法有获得null引用异常的风险

像下面这样

[TestMethod]
Public Void TestReferenceVulnarability()
{
    try
    {
        MyClass _myClass = new MyClass();
        //Do something
        target = _myClass.DoSomething();
    }
    catch (NullReferenceException ex)
    {
        throw ex;
    }
}

public class MyClass
{
    public void DoSomething()
    {
        // Do something here
    }
}
我们用于确定代码是否存在null reference exeption漏洞的手动过程。我想自动化这个

在编写代码时,如果存在获取空引用异常的风险,我们会仔细查看对象。如果是这样,我们将添加空支票以覆盖该风险。 然而,在运行时,我们有时仍然会得到null reference exeption,因为手动检查忽略了风险


我如何编写测试方法/功能,使这个过程自动化,并告诉我函数是否有获取null引用异常的风险。

您需要使用反射来获取类中的所有公共方法。 调用它们,并断言它不会抛出null引用


Assert.That(Assert.DoesNotThrow(method.Invoke());
或者更明确一些,并将其包装到try-catch块中,检查异常是否为nullRef

我可能会建议您重新构造测试。 在单元测试中,try-and-catch不需要太多,因为异常本身会导致失败。如果处理异常,可能会抑制失败的测试

        [TestMethod]
        Public Void TestReferenceVulnarability()
        {
            MyClass _myClass = new MyClass();
            //Do something
            Assert.NotNull(myClass.DoSomething);
        }

public class MyClass
    {
        public void DoSomething()
        {
            // Do something here
        }
    }
从测试的角度来看,它所能做的就是根据方法的输入在目标方法中执行代码路径。 因此,您应该针对常见的故障区域,考虑边缘情况等。 看看你的要求

目前,您的“DoSomething”方法不接受任何参数,这降低了您测试它的能力

如果该方法需要接受100到500之间的数字,那么首先测试这些值是否有效,然后添加更多的测试来验证负面场景。当涉及到单元测试时,只要保持单元测试干净简洁,就没有“太多测试”这回事

        [TestMethod]
        Public Void TestReferenceFor100()
        {
            //Eg: if an invalid number returns null, then we test valid numbers
           MyClass class = new MyClass();
           Assert.NotNull(class.DoSomething(100));
        }

        [TestMethod]
        Public Void TestReferenceFor500()
        {
            //Eg: if an invalid number returns null, then we test valid numbers
           MyClass class = new MyClass();
           Assert.NotNull(class.DoSomething(500));
        }
            [TestMethod]
        Public Void TestReferenceFor99()
        {
            //Eg: Now test some negative edge cases
           MyClass class = new MyClass();
           Assert.IsNull(class.DoSomething(99));
        }
                [TestMethod]
        Public Void TestReferenceFor501()
        {
            //Eg: Now test some negative edge cases
           MyClass class = new MyClass();
           Assert.IsNull(class.DoSomething(501));
        }
public class MyClass
    {
        public void DoSomething(int i)
        {
            // Do something here
        }
    }
所以回到原来的问题上来。 为了测试从该方法获得空引用的可能性,您需要为测试提供向该方法提供新输入的能力。 然后,您需要为可以提供给该方法的每个可能输入创建一个测试。 如果您有权访问Reflector(.Net VS Extension),那么它可以在代码时识别代码是否可能存在空引用
(它甚至会突出显示它,并为您修复它。)

…你的问题是什么?我如何编写这样的测试方法?它将预测目标方法是否存在获取空引用异常的风险。这不是一个测试方法,而是一个代码分析器。我认为它不会那么简单。你想分析代码吗?可能resharper可以做到,但我不确定。单元测试不用于签入g代码中的漏洞。它们是用来测试功能的。这是算法应该运行的。单元测试不是满足您需求的方法。我认为如果函数中有throw关键字,这将起作用。因为任何具有方法调用的函数都可以抛出NRE!!还有一种设置测试属性的方法[ExpectsException(NullReferenceException)]或类似于该语法的内容。这是正确的,因此您可以保持测试内容静态,但只需更改测试的属性。也就是说,它将是1个中的6个,其他的6个。因为它需要同样多的键入。