编写一个测试方法来确定,如果代码有获得null引用异常的风险

时间:2016-01-27 12:14:32

标签: c# unit-testing exception nullreferenceexception

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

我想针对类中的所有函数运行此方法,并希望确定哪些方法存在获取空引用异常的风险。

如下所示,

[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 refrence exeption漏洞的手动过程。我想自动化这个。

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

如何编写测试方法/功能,这将自动执行此过程,并告诉我函数是否存在获取空引用异常的风险。

2 个答案:

答案 0 :(得分:1)

我可能会建议您重新构建测试。 在单元测试中,尝试和捕获不需要那么多,因为异常本身会引发失败。如果处理异常,则存在抑制失败测试的风险。

        [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
        }
    }

所以回到最初的问题。 为了测试从该方法获取Null Reference的可能性,您需要为测试提供为该方法提供新输入的能力。 然后,您需要为可以为方法提供的每个可能输入创建测试。 如果您可以访问Reflector(.Net VS Extension),那么它可以在代码时识别代码是否有可能为Null引用 (它甚至会突出显示它并提供为您修复它。)

答案 1 :(得分:-1)

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

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