如何使用Regex在Scala中创建随机整数范围?

时间:2014-07-29 18:28:33

标签: regex scala tdd

目标是使用正则表达式在Scala中使用1到10的TDD随机整数范围。

测试

test("randomInteger") {
  assert(NumberSequences.randomInteger(10) === 1|2|3|4|5|6|7|8|9|10)
}

主要

def randomInteger(a: Int) : Int = {
  scala.util.Random.nextInt(a) + 1 
}

结果

> test
[error] 
numbersequences\scala\NumberSequencesTest.scala:53: 
value | is not a member of Option[String]
[error]     assert(NumberSequences.randomInteger(10) === 1|2|3|4|5|6|7|8|9|10)
[error]                                                   ^
[error] one error found
[error] (test:compile) Compilation failed
[error] Total time: 1 s, completed Jul 29, 2014 8:25:28 PM

3 个答案:

答案 0 :(得分:1)

嗯......在我看来,你的做法有点过时了。我收到的最好的TDD技巧之一是:“不要测试框架。”我猜scala.util.Random.nextInt(a)是一个通常可供Scala用户使用的函数。从TDD的角度来看,您通常可以认为它有效。

您可以使用TDD转换阵列。您可以通过向每个整数添加1来转换数组,以便将0-9范围向上移动到1-10。您可以编写测试和匹配函数,其中函数的作用是为数组中的每个int添加1。在您的情况下,您可以将scala.util.Random.nextInt(a)的结果传递给函数。我知道这看起来微不足道,但以这种方式思考使我可以访问TDD并且它极大地改进了我的编码。

只是为了完成这个例子,如果你实际上是在编写scala.util.Random.nextInt()函数的代码,那么你可以TDD它。基本上你可以将伪随机种子设置为某个值,生成下一个伪随机数,然后验证新数字是否正确。

答案 1 :(得分:1)

为什么要使用正则表达式?这使您的测试变得缓慢且难以阅读。您可以assert将值放在特定范围内:

val randomNumber = NumberSequences.randomInteger(10)
assert(randomNumber > 0 && randomNumber < 11)

话虽如此,从TDD的角度来看,我根本不会使用真正的随机数发生器。我会注入一个模拟代替scala.util.Random,以便它的nextInt()函数每次都提供相同的固定数。这样我就不必考虑实际函数的随机性,可以专注于测试我自己实现的功能。

答案 2 :(得分:0)

import scala.util.matching.Regex


val digits = """[1-9]|10""".r
assert(digits.pattern.matcher("0").matches())