简洁而可扩展的Scala / sbt测试,以验证Project Euler的答案

我正在使用
Project Euler来学习Scala中的函数式编程,以及sbt和其他最佳实践.我最初尝试创建使用
ScalaTest验证解决方案的测试是:

package euler
import org.scalatest._

class SolutionsSpec extends Spec with Matchers {
    "The problems" should "have the correct solutions" in {
        Problem1.solve should be (  233168 )
        Problem2.solve should be ( 4613732 )
        Problem3.solve should be (    6857 )
        Problem4.solve should be (  906609 )
    }
}

这很简洁,但是如果我遇到更长时间的问题,我担心它可能无法扩展.据我所知,我不能用这种方式测试个别问题.

我在GitHub上搜索过,发现了两个有用的例子,类似于我想要做的:

> danielmiladinov/ProjectEuler-Scala
> todd-cook/Effective-Scala-with-Project-Euler

两者都比我想要的更冗长,因为我基本上只是测试从问题编号到解决方案的映射.

我的问题:是否有一种简洁而优雅的方式来进行这种仍然灵活的测试,以便我可以检查单个或一组问题的结果?

编辑:我发现this answer使用Project Euler阻止了TDD.为了澄清,我也在为数学辅助函数编写单元测试.我检查答案的目的部分是为了检查回归,但最重要的是作为练习.

编辑2:我现在正在尝试使用FunSuite

class SolutionsSuite extends FunSuite with Matchers {
    test("Problem 1") { Problem1.solve should be (  233168 ) }
    test("Problem 2") { Problem2.solve should be ( 4613732 ) }
    test("Problem 3") { Problem3.solve should be (    6857 ) }
    test("Problem 4") { Problem4.solve should be (  906609 ) }
}

这可能更接近我想要的.输出看起来更好:

$sbt test
...
SolutionsSuite:
- Problem 1 (28 milliseconds)
- Problem 2 (4 milliseconds)
- Problem 3 (38 milliseconds)
- Problem 4 (172 milliseconds)

但我仍然无法弄清楚如何运行一部分问题.这个问题似乎表明我正在寻找的东西还不可能与sbt:Run just a specific scalatest test from sbt.

编辑3:看起来运行单个测试功能而不是整个套件的能力针对每个问题Allow running of single junit test #911的sbt 0.13.3.

编辑4:供参考,my Project Euler GitHub project.

最佳答案 您可能希望在
https://github.com/sethtisue/project-euler复制我的设置.每个测试看起来像:

class Problem1 extends Problem(1, "12345") {
  def solve: Int = ...
}

其中“12345”是预期的答案(总是一个字符串),而求解的返回类型可以是任何东西(因为它只是得到.toStringed,因为字符串是你最终要进入欧拉的现场).

定义问题使得每个问题都是它自己的套件,因此您可以轻松使用sbt的仅测试命令来运行您想要的问题.

点赞