简洁但可扩展的Scala/sbt测试,以验证欧拉项目的答案



我正在使用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

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

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

Edit:我发现这个答案不鼓励使用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
...
[info] SolutionsSuite:
[info] - Problem 1 (28 milliseconds)
[info] - Problem 2 (4 milliseconds)
[info] - Problem 3 (38 milliseconds)
[info] - Problem 4 (172 milliseconds)

但是我仍然不能弄清楚如何运行问题的一个子集。这个问题似乎表明,我正在寻找的是不可能与sbt:从sbt运行一个特定的scalatest测试。

Edit 3:看起来运行单个测试功能而不是整个套件的能力的目标是每个问题0.13.3美元允许运行单个单元测试#911。

编辑4:供参考,我的Project Euler GitHub项目。

您可以在https://github.com/sethtisue/project-euler复制我的设置。每个测试看起来像:

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

其中"12345"是预期的答案(总是一个字符串),solve的返回类型可以是任何东西(因为它只会得到.toString ed,因为字符串是您最终将在欧拉站点输入的内容)。

Problem的定义使得每个问题都是它自己的套件,因此您可以轻松地使用sbt的test-only命令来运行您想要的问题。

相关内容

  • 没有找到相关文章

最新更新