2013-08-30 115 views
2

我开发了一个小型Windows窗体应用程序,允许用户在三个温度值(华氏度,摄氏度和开尔文)的不同值之间进行转换。作为新手测试者,我开始涉足NUnit,并且我认为学习框架的一个好方法是将一些测试代码添加到该程序中。它处理大部分工作的类是: -NUnit System.OverflowException:算术运算导致溢出

public static class TemperatureConverter 
{ 
    public static ConversionFormula CelciusToFahrenheit = t => ((t * 1.8) + 32); 

    public static ConversionFormula CelciusToKelvin = t => (t + 273); 

    public static ConversionFormula FahrenheitToCelcius = t => ((t - 32) * 5/9); 

    public static ConversionFormula FahrenheitToKelvin = t => (t + 459.67)/1.8; 

    public static ConversionFormula KelvinToCelcius = t => (t - 273); 

    public static ConversionFormula KelvinToFahrenheit = t => (t * 9/5 - 459.67); 


    public static double ConvertTemperature(double temperatureValue, ConversionFormula conversionFormula) 
    {   
     return conversionFormula(temperatureValue); 
    } 
} 

我开始通过简单的测试单个温度值被正确地转换。最终这变得累人,并且涉及许多重复的代码,所以我不是使用NUnit的'范围'和'值'属性为每个值编写一个测试,所以我可以分批测试10个。一个例子的测试方法是: -

[TestFixture] 
public class Class1 
{ 
    private ConversionFormula _fahrenheitToCelcius; 

    [SetUp] 
    public void Init() 
    { 
     _fahrenheitToCelcius = TemperatureConverter.FahrenheitToCelcius; 
    } 

    #region Fahrenheit To Celcius Positive Values 

    [Test, Sequential] 
    public void ConvertFahrenheitToCelciusRange_0_To_10_RoundedTo2DP([Range(0, 10, 1)]double temperature, 
       [Values(-17.78, -17.22, -16.67, -16.11, -15.56, -15, -14.44, -13.89, -13.33, -12.78, -12.22)]double expected) 
    { 
     double actual = TemperatureConverter.ConvertTemperature(temperature, _fahrenheitToCelcius); 

     Assert.AreEqual(expected, actual, 1); 
    } 

范围内的值是测试温度,在这种情况下,从0到10的值的属性包含每个测试预期的结果。我正在使用NUnit 2.6.2和Resharper Test Runner。我在一个类文件中添加了几乎相同的测试方法,以十个值的数值加快了温度范围。例如,下一个测试将是: -

[Test, Sequential] 
    public void ConvertFahrenheitToCelciusRange_11_To_20_RoundedTo2DP([Range(11, 20, 1)]double temperature, 
       [Values(-11.67, -11.11, -10.56, -10, -9.44, -8.89, -8.33, -7.78, -7.22, -6.67)]double expected) 
    { 
     double actual = TemperatureConverter.ConvertTemperature(temperature, _fahrenheitToCelcius); 

     Assert.AreEqual(expected, actual, 1); 
    } 

每次测试后,我跑了它,看看它是否通过,它确实。最后,我通过0-150的范围进行测试,所以每班有15种测试方法。现在发生问题。无论是ReSharper的测试运行和NUnit的测试运行随机报告

NUnit的System.OverflowException:算术运算导致溢出

System.OverflowException... 

Server stack trace: 
    at NUnit.Framework.RangeAttribute..ctor(Int32 from, Int32 to, Int32 step) 
    at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs) 
    at System.Reflection.CustomAttribute.CreateCaObject(RuntimeModule module, IRuntimeMethodInfo ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) 
    at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeParameterInfo parameter, RuntimeType caType) 
    at NUnit.Core.Reflect.GetAttributes(ICustomAttributeProvider member, Boolean inherit) 
    at NUnit.Core.Reflect.HasAttribute(ICustomAttributeProvider member, String attrName, Boolean inherit) 
    at NUnit.Core.Builders.ValueSourceProvider.HasDataFor(ParameterInfo parameter) 
    at NUnit.Core.Extensibility.DataPointProviders.HasDataFor(ParameterInfo parameter) 
    at NUnit.Core.Builders.CombinatorialTestCaseProvider.HasTestCasesFor(MethodInfo method) 
    at NUnit.Core.Extensibility.TestCaseProviders.HasTestCasesFor(MethodInfo method) 
    at NUnit.Core.Builders.NUnitTestCaseBuilder.BuildFrom(MethodInfo method, Test parentSuite) 
    at NUnit.Core.Extensibility.TestCaseBuilderCollection.BuildFrom(MethodInfo method, Test suite) 
    at NUnit.Core.Builders.NUnitTestFixtureBuilder.BuildTestCase(MethodInfo method, TestSuite suite) 
    at NUnit.Core.Builders.NUnitTestFixtureBuilder.AddTestCases(Type fixtureType) 
    at NUnit.Core.Builders.NUnitTestFixtureBuilder.BuildSingleFixture(Type type, Attribute attr) 
    at NUnit.Core.Builders.NUnitTestFixtureBuilder.BuildFrom(Type type) 
    at NUnit.Core.Extensibility.SuiteBuilderCollection.BuildFrom(Type type) 
    at NUnit.Core.TestFixtureBuilder.BuildFrom(Type type) 
    at NUnit.Core.Builders.TestAssemblyBuilder.GetFixtures(Assembly assembly, String ns) 
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, Boolean autoSuites) 
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, String testName, Boolean autoSuites) 
    at NUnit.Core.TestSuiteBuilder.BuildSingleAssembly(TestPackage package) 
    at NUnit.Core.TestSuiteBuilder.Build(TestPackage package) 
    at NUnit.Core.SimpleTestRunner.Load(TestPackage package) 
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
    at NUnit.Core.RemoteTestRunner.Load(TestPackage package) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at NUnit.Core.TestRunner.Load(TestPackage package) 
    at NUnit.Util.TestDomain.Load(TestPackage package) 
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
    at NUnit.Util.RemoteTestAgent.AgentRunner.Load(TestPackage package) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [1]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at NUnit.Core.TestRunner.Load(TestPackage package) 
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
    at NUnit.Util.ProcessRunner.Load(TestPackage package) 
    at NUnit.Util.TestLoader.LoadTest(String testName) 

不管我尝试多少次重新运行测试,我得到同样的错误。不仅如此,程序集中的所有其他测试文件运行良好,现在也报告了同样的问题。起初,我认为这是传递给Values或Range属性的值的问题,但为了将其用于测试,我创建了一个新的程序集,添加了对NUnit的引用,并复制并粘贴了来自原始程序集的测试,到新的一个。嘿presto,测试都运行良好。现在,如果我不更改新程序集中的测试文件并不时地运行测试,最终我会迎接相同的错误。不仅如此,所有其他测试类别也会再次破裂。解决此问题的唯一方法是创建一个新的汇编和复制,并跨越旧的测试文件。这是不好的,因为他们最终会再次破裂。我是NUnit newby,所以如果任何人以前遇到过这个错误,或者可以理解我可能在这里做错了什么,那么你的建议将不胜感激。

+1

请发布堆栈跟踪和您的ConvertTemperature方法的代码。 如果你杀死了resharper单元测试过程,那么错误在下一次测试中就消失了吗? – Nikhil

+0

嗨Nikhil。杀死该进程不起作用。重新启动Visual Studio不起作用。您已经要求的更多信息已在上面发布。谢谢。 –

+0

堆栈跟踪和“OverflowException”的所有可能的细节如何?它可能会提示问题出在哪里。 –

回答

0

那么这似乎是一个不正确的范围值在一个流氓测试。复制和粘贴的危险。也就是说,我仍然不明白为什么它会影响程序集中的所有其他测试。即使正确的测试单独运行失败,直到我纠正错误。感谢您的帮助。

0

那么当我们试图在检查上下文中进行算术,转换或转换操作时,它会定义溢出异常。

+0

我不明白你在说什么? –

+0

当我们在Checked块中尝试带有预期溢出异常的代码时,根据行为它不应该抛出异常。但它是抛出错误。是什么原因? – user2761122

相关问题