2014-06-24 7 views
5

मैं ScalaChecksbt में परीक्षण चला रहा हूं, और यदि मेरा परीक्षण विफल रहता है क्योंकि परीक्षण के तहत कोड अपवाद फेंकता है, तो परीक्षण रिपोर्ट असफल परीक्षण, फेंक दिया अपवाद और संदेश दिखाती है, लेकिन पूरे स्टैक ट्रेस नहीं (केवल नोट करें नीचे Exception: java.lang.NullPointerException: exception अपवाद संदेश)।ScalaCheck परीक्षणों से फेंकने वाले अपवादों के लिए संपूर्ण स्टैक ट्रेस कैसे प्रदर्शित करें?

[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins 
[info] Set current project to scalacheck (in build file:/Users/jacek/sandbox/scalacheck/) 
[info] Updating {file:/Users/jacek/sandbox/scalacheck/}scalacheck... 
[info] Resolving jline#jline;2.11 ... 
[info] Done updating. 
[info] Compiling 1 Scala source to /Users/jacek/sandbox/scalacheck/target/scala-2.11/test-classes... 
[info] ! String.throw exception: Exception raised on property evaluation. 
[info] > ARG_0: "" 
[info] > Exception: java.lang.NullPointerException: exception 
[error] Error: Total 1, Failed 0, Errors 1, Passed 0 
[error] Error during tests: 
[error]  StringSpecification 
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful 
[error] Total time: 5 s, completed Jun 25, 2014 3:25:47 AM 

मैं 2008 जो एक ही समस्या की रिपोर्ट करने लगता है, और यह इंगित करता है कि यह अगली फिल्म में तय किया जाना चाहिए से https://groups.google.com/forum/#!msg/scalacheck/AGBgE_JlqpI/B2eSG84_QzYJ पाया। मैं वर्तमान में नवीनतम रिलीज 1.11.4 का उपयोग कर रहा हूँ।

मैं भी http://www.scala-sbt.org/release/docs/Testing.html जो इंगित करता है sbt एक testOptions कुंजी जो मुझे लगता है कि उपयोग करने के लिए उचित लगता है, और मैं जानता हूँ कि ScalaTest पूर्ण स्टैक ट्रेस, "-F" के लिए एक सेटिंग है पाया है, लेकिन है कि ScalaCheck के लिए काम नहीं करता। यहां तक ​​कि इसके बाद के संस्करण पेज से उदाहरण, testOptions in Test += Tests.Argument(TestFrameworks.ScalaCheck, "-d", "-g") मुझे एक त्रुटि देता है:

[error] Could not run test org.example.myproject.MyTestClass: java.lang.Exception: [1.1] failure: option name expected 
[error] 
[error] -d -g 
[error]^

मैं इन परीक्षण तर्क का उपयोग कैसे करूँ, इन तर्कों की सूची में कहीं भी है, और अंत में, इसे से बाहर एक स्टैकट्रेस पाने के लिए संभव है यह सब, या मैं एक लाल हेरिंग का पीछा कर रहा हूँ?

उत्तर

5

tl; dr स्कैलाचेक के जारी संस्करण के साथ verbosity के लिए एसबीटी के तहत कोई समर्थन नहीं है। सुविधा के लिए आपको स्वयं स्रोतों से एक संस्करण बनाना होगा।

ScalaCheck के लिए उपलब्ध विकल्पों Test Execution में वर्णित हैं:

Available options: 
    -workers, -w: Number of threads to execute in parallel for testing 
    -minSize, -n: Minimum data generation size 
    -verbosity, -v: Verbosity level 
    -minSuccessfulTests, -s: Number of tests that must succeed in order to pass a property 
    -maxDiscardRatio, -r: The maximum ratio between discarded and succeeded tests allowed before ScalaCheck stops testing a property. At least minSuccessfulTests will always be tested, though. 
    -maxSize, -x: Maximum data generation size 

org.scalacheck.util.Pretty के स्रोत कोड हमें vebosity के विभिन्न स्तरों के बारे में अधिक बताता है:

implicit def prettyThrowable(e: Throwable) = Pretty { prms => 
    val strs = e.getStackTrace.map { st => 
    import st._ 
    getClassName+"."+getMethodName + "("+getFileName+":"+getLineNumber+")" 
    } 

    val strs2 = 
    if(prms.verbosity <= 0) Array[String]() 
    else if(prms.verbosity <= 1) strs.take(5) 
    else strs 

    e.getClass.getName + ": " + e.getMessage/strs2.mkString("\n") 
} 

तो, 0 कुछ भी नहीं देता है, 1 एक स्टैक ट्रेस से 5 लाइनें लेती हैं, जबकि 1 से अधिक संख्या आपको निम्न स्टैक ट्रेस देता है:

➜ scalacheck scala -cp .:/Users/jacek/.ivy2/cache/org.scalacheck/scalacheck_2.11/jars/scalacheck_2.11-1.11.4.jar StringSpecification -verbosity 3 
+ String.startsWith: OK, passed 100 tests. 
Elapsed time: 0.242 sec 
! String.concatenate: Falsified after 0 passed tests. 
> ARG_0: "" 
> ARG_1: "" 
Elapsed time: 0.003 sec 
+ String.substring: OK, passed 100 tests. 
Elapsed time: 0.126 sec 
! String.throw exception: Exception raised on property evaluation. 
> ARG_0: "" 
> Exception: java.lang.NullPointerException: exception 
StringSpecification$$anonfun$14.apply(StringSpecification.scala:19) 
StringSpecification$$anonfun$14.apply(StringSpecification.scala:18) 
scala.Function1$$anonfun$andThen$1.apply(Function1.scala:55) 
org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:622 
) 
org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:622 
) 
org.scalacheck.Prop$.secure(Prop.scala:473) 
org.scalacheck.Prop$$anonfun$forAllShrink$1.org$scalacheck$Prop$$anonfun$$r 
    esult$1(Prop.scala:622) 
org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:659) 
org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:616) 
org.scalacheck.Prop$$anon$1.apply(Prop.scala:309) 
org.scalacheck.Test$.org$scalacheck$Test$$workerFun$1(Test.scala:335) 
org.scalacheck.Test$$anonfun$org$scalacheck$Test$$worker$1$1.apply(Test.sca 
    la:316) 
org.scalacheck.Test$$anonfun$org$scalacheck$Test$$worker$1$1.apply(Test.sca 
    la:316) 
org.scalacheck.Test$.check(Test.scala:385) 
org.scalacheck.Test$$anonfun$checkProperties$1.apply(Test.scala:402) 
org.scalacheck.Test$$anonfun$checkProperties$1.apply(Test.scala:395) 
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala 
    :245) 
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala 
    :245) 
scala.collection.immutable.List.foreach(List.scala:383) 
scala.collection.generic.TraversableForwarder$class.foreach(TraversableForw 
    arder.scala:35) 
scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45) 
scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 
scala.collection.AbstractTraversable.map(Traversable.scala:104) 
org.scalacheck.Test$.checkProperties(Test.scala:395) 
org.scalacheck.Properties.mainRunner(Properties.scala:62) 
org.scalacheck.Prop$class.main(Prop.scala:106) 
org.scalacheck.Properties.main(Properties.scala:27) 
StringSpecification.main(StringSpecification.scala:-1) 
sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java: 
    -2) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:5 
    7) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp 
    l.java:43) 
java.lang.reflect.Method.invoke(Method.java:606) 
scala.reflect.internal.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClas 
    sLoader.scala:68) 
scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoad 
    er.scala:31) 
scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(Scala 
    ClassLoader.scala:99) 
scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.sca 
    la:68) 
scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassL 
    oader.scala:99) 
scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22) 
scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39) 
scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29) 
scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39) 
scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:72) 
scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:94) 
scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) 
scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala:-1) 
Elapsed time: 0.000 sec 

आप सही हैं कि एसबीटी के लिए दस्तावेज असंगत है। "-d", "-g" विकल्प नहीं हैं और मेरा मानना ​​है कि वे दस्तावेज़ में एक कॉपी-एंड-पेस्ट त्रुटि हैं। It was already fixed in a pull request that's soon to be accepted.

verbosity विकल्प Scalacheck 1.11.4 के हाल के संस्करण में एसबीटी के तहत समर्थित नहीं है। नमूना परियोजना की पूरी बिल्ड परिभाषा निम्नलिखित है।

build.sbt

scalaVersion := "2.11.1" 

libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.11.4" % "test" 

testOptions in Test += Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "3") 

यहां तक ​​कि जब verbosity पैरामीटर ठीक से build.sbt में निर्दिष्ट किया जाता, परीक्षा निष्पादन एक पंक्ति से अधिक मुद्रित नहीं होगा।

➜ scalacheck xsbt test 
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins 
[info] Set current project to scalacheck (in build file:/Users/jacek/sandbox/scalacheck/) 
[info] + String.startsWith: OK, passed 100 tests. 
[info] ! String.concatenate: Falsified after 0 passed tests. 
[info] > ARG_0: "" 
[info] > ARG_1: "" 
[info] + String.substring: OK, passed 100 tests. 
[info] ! String.throw exception: Exception raised on property evaluation. 
[info] > ARG_0: "" 
[info] > Exception: java.lang.NullPointerException: exception 
[error] Error: Total 4, Failed 1, Errors 1, Passed 2 
[error] Error during tests: 
[error]  StringSpecification 
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful 
[error] Total time: 1 s, completed Jun 25, 2014 2:57:08 AM 

कारण org.scalacheck.ScalaCheckFramework निम्नलिखित कार्यान्वयन किया है और मानता है verbosity हमेशा 0 हो:

override def onTestResult(n: String, r: Test.Result) = { 
    for (l <- loggers) { 
    import Pretty._ 
    l.info(
     (if (r.passed) "+ " else "! ") + n + ": " + pretty(r, Params(0)) 
    ) 
    } 
    handler.handle(asEvent((n,r))) 
} 

एक पुल अनुरोध इसे ठीक करने के पहले से ही Support verbosity under sbt for TestFrameworks.ScalaCheck के तहत रेपो के लिए स्वीकार किया गया है। आपको निर्देशिका में sbt publishLocal के साथ स्कैला चेक बनाना होगा जहां आपने रेपो को क्लोन किया था। परिवर्तन लेने के लिए build.sbt में 1.12.0-SNAPSHOT संस्करण का उपयोग करना न भूलें।

1

चूंकि जेसेक लास्कोव्स्की ने उल्लेख किया है कि इस मुद्दे के बाद, अब आप स्कालाचेक के वर्बोसिटी स्तर को सेट करने के लिए अपनी build.sbt फ़ाइल में एक पंक्ति जोड़ कर एसबीटी में स्कैला चेक से स्टैक निशान प्राप्त कर सकते हैं।

testOptions in Test += Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "2") 

जैसा कि जैस्के लास्कोव्स्की ने नोट किया, 0 की एक वर्बसिटी आपको केवल अपवाद देगी।

[info] ! RandomAccessFile.readWriteInt: Exception raised on property evaluation. 
[info] > ARG_0: 0 
[info] > ARG_0_ORIGINAL: -2073744736 
[info] > Exception: java.lang.UnsupportedOperationException: null 

1 की एक वर्बसिटी आपको स्टैक ट्रेस की पहली पांच पंक्तियां देगी।

[info] ! RandomAccessFile.readWriteInt: Exception raised on property evaluation. 
[info] > ARG_0: 0 
[info] > ARG_0_ORIGINAL: 2147483647 
[info] > Exception: java.lang.UnsupportedOperationException: null 
[info] java.nio.IntBuffer.array(IntBuffer.java:994) 
[info] csc365a01.RandomAccessFile.readInt(RandomAccessFile.scala:22) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply$mcZI$sp(RandomAccessFileSpec.scala:14) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply(RandomAccessFileSpec.scala:11) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply(RandomAccessFileSpec.scala:11) 

एक से अधिक वर्बसिटी आपको पूर्ण स्टैक ट्रेस देगा।

[info] ! RandomAccessFile.readWriteInt: Exception raised on property evaluation. 
[info] > ARG_0: 0 
[info] > ARG_0_ORIGINAL: 1693735989 
[info] > Exception: java.lang.UnsupportedOperationException: null 
[info] java.nio.IntBuffer.array(IntBuffer.java:994) 
[info] csc365a01.RandomAccessFile.readInt(RandomAccessFile.scala:22) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply$mcZI$sp(RandomAccessFileSpec.scala:14) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply(RandomAccessFileSpec.scala:11) 
[info] RandomAccessFileProps$$anonfun$1$$anonfun$apply$1.apply(RandomAccessFileSpec.scala:11) 
[info] scala.Function1$$anonfun$andThen$1.apply(Function1.scala:52) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:712) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:712) 
[info] org.scalacheck.Prop$.secure(Prop.scala:456) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1.org$scalacheck$Prop$$anonfun$$result$1(Prop.scala:712) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:719) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:719) 
[info] scala.collection.immutable.Stream.map(Stream.scala:418) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1.getFirstFailure$1(Prop.scala:719) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1.shrinker$1(Prop.scala:729) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:751) 
[info] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:706) 
[info] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:292) 
[info] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:291) 
[info] org.scalacheck.PropFromFun.apply(Prop.scala:22) 
[info] org.scalacheck.Prop$$anonfun$delay$1.apply(Prop.scala:461) 
[info] org.scalacheck.Prop$$anonfun$delay$1.apply(Prop.scala:461) 
[info] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:292) 
[info] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:291) 
[info] org.scalacheck.PropFromFun.apply(Prop.scala:22) 
[info] org.scalacheck.Test$.org$scalacheck$Test$$workerFun$1(Test.scala:294) 
[info] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323) 
[info] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323) 
[info] org.scalacheck.Platform$.runWorkers(Platform.scala:40) 
[info] org.scalacheck.Test$.check(Test.scala:323) 
[info] org.scalacheck.ScalaCheckRunner$$anon$2$$anonfun$execute$3$$anonfun$apply$2.apply(ScalaCheckFramework.scala:102) 
[info] org.scalacheck.ScalaCheckRunner$$anon$2$$anonfun$execute$3$$anonfun$apply$2.apply(ScalaCheckFramework.scala:100) 
[info] scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733) 
[info] scala.collection.immutable.List.foreach(List.scala:381) 
[info] scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 
[info] scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45) 
[info] scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732) 
[info] org.scalacheck.ScalaCheckRunner$$anon$2$$anonfun$execute$3.apply(ScalaCheckFramework.scala:100) 
[info] org.scalacheck.ScalaCheckRunner$$anon$2$$anonfun$execute$3.apply(ScalaCheckFramework.scala:97) 
[info] scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
[info] scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
[info] scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 
[info] scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186) 
[info] scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 
[info] scala.collection.mutable.ArrayOps$ofRef.flatMap(ArrayOps.scala:186) 
[info] org.scalacheck.ScalaCheckRunner$$anon$2.execute(ScalaCheckFramework.scala:97) 
[info] sbt.TestRunner.runTest$1(TestFramework.scala:76) 
[info] sbt.TestRunner.run(TestFramework.scala:85) 
[info] sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202) 
[info] sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202) 
[info] sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185) 
[info] sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202) 
[info] sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202) 
[info] sbt.TestFunction.apply(TestFramework.scala:207) 
[info] sbt.Tests$$anonfun$9.apply(Tests.scala:216) 
[info] sbt.Tests$$anonfun$9.apply(Tests.scala:216) 
[info] sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44) 
[info] sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44) 
[info] sbt.std.Transform$$anon$4.work(System.scala:63) 
[info] sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) 
[info] sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) 
[info] sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17) 
[info] sbt.Execute.work(Execute.scala:235) 
[info] sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) 
[info] sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) 
[info] sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159) 
[info] sbt.CompletionService$$anon$2.call(CompletionService.scala:28) 
[info] java.util.concurrent.FutureTask.run(FutureTask.java:266) 
[info] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
[info] java.util.concurrent.FutureTask.run(FutureTask.java:266) 
[info] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[info] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[info] java.lang.Thread.run(Thread.java:745) 
[info] Elapsed time: 0.047 sec 
संबंधित मुद्दे