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