我正在尝试在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,因为手动检查忽略了风险。
如何编写测试方法/功能,这将自动执行此过程,并告诉我函数是否存在获取空引用异常的风险。
答案 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