2013-08-30 119 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

相關問題