我正在使用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
命令来运行您想要的问题。