【问题标题】:How can I test Java programs with ScalaCheck?如何使用 ScalaCheck 测试 Java 程序?
【发布时间】:2013-11-07 15:53:50
【问题描述】:

我在 ScalaCheck user guide 中读到它是用于测试 Scala 和 Java 程序的工具

我想知道,这只是营销,还是用它测试纯 Java 代码库是一个合理的想法?如果是这样,将它与 Java 项目集成的最佳方式是什么?

【问题讨论】:

    标签: java unit-testing scala scalacheck


    【解决方案1】:

    不,这不仅仅是营销。使用 ScalaCheck 测试功能 Java (http://functionaljava.org/)。 FJ 源中的一些测试用例: https://github.com/functionaljava/functionaljava/blob/724081f0f87f34b2f4c26b8b748877955180ecaa/props-core-scalacheck/src/test/scala/fj/data/CheckList.scala

    我不确定将 ScalaCheck 集成到现有 java 项目中的最佳方法是什么,但我想您可以从 FJ 中的做法中借鉴一些想法。

    【讨论】:

    【解决方案2】:

    您可以集成它来测试 Java 代码。测试代码将使用 ScalaCheck 在 Scala 中编写,但测试代码可能是 Scala 或 Java。 如果您已经使用 scala 进行测试,那么您应该考虑使用 ScalaTestSpecs2

    【讨论】:

    • ScalaTest 对于有 Java 背景的人来说会更容易学习。 Specs2 是一个更加面向功能编程的测试框架。
    【解决方案3】:

    实际上,您可以用纯 Java 编写 ScalaCheck 测试,尽管您必须手动解决 Scala 隐式问题。

    例如Scala中的代码

    import org.scalacheck.Properties
    import org.scalacheck.Prop.forAll
    
    object CommutativityTest extends Properties("Commutativity Test") {
      property("commutativity") = forAll { (a: Int, b: Int) =>
        a + b == b + a
      }
    }
    

    使用 build.sbt

    scalaVersion := "2.12.3"
    
    libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.13.5" % Test
    

    可以翻译成Java为

    import org.scalacheck.*;
    import org.scalacheck.util.Pretty;
    import scala.math.Numeric;
    
    public class CommutativityTest$ extends Properties {
        public static final CommutativityTest$ MODULE$ = new CommutativityTest$();
    
        public CommutativityTest$() {
            super("Commutativity Test");
    
            Arbitrary arbInt = Arbitrary.arbInt();
            Shrink shrinkInt = Shrink.shrinkIntegral(Numeric.IntIsIntegral$.MODULE$);
    
            Prop prop = Prop.forAll(
                    (Integer a, Integer b) -> a + b == b + a,
                    Prop::propBoolean,
                    arbInt,
                    shrinkInt,
                    Pretty::prettyAny,
                    arbInt,
                    shrinkInt,
                    Pretty::prettyAny
            );
    
            property().update("commutativity", () -> prop);
        }
    }
    

    public class Runner {
        public static void main(String[] args) {
            CommutativityTest$.MODULE$.main(args);
        }
    }
    

    使用 pom.xml

    <project...
    
        <dependencies>
            <dependency>
                <groupId>org.scalacheck</groupId>
                <artifactId>scalacheck_2.12</artifactId>
                <version>1.13.5</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.scala-lang.modules</groupId>
                <artifactId>scala-java8-compat_2.12</artifactId>
                <version>0.8.0</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    输出:

    + Commutativity Test.commutativity: OK, passed 100 tests.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2021-06-16
      • 1970-01-01
      • 2016-09-30
      • 2012-12-13
      • 1970-01-01
      相关资源
      最近更新 更多