我现在正在学习Scala.我看到有两个测试框架,ScalaTest和Specs.我唯一的问题是我还不能用语言来决定哪个更好.此外,我习惯在代码之前编写测试,目前我还不知道如何在函数式编程中进行测试.理想情况下,我想以TDD方式学习Scala,有没有关于它的资源?
我已经配置了一个项目来使用scala/maven/Eclipse.因为我需要在构建路径上使用scala库,而scalatest也使用自己的scala库,我收到此警告:
在构建路径中找到多个scala库,所有这些库都具有兼容版本.这不是最佳配置,尝试限制构建路径中的一个scala库.
我不认为我可以删除此警告,因为我需要两个库 - 一个用于Maven,另一个用于Eclipse.这似乎没有造成任何问题,所以我只能接受它吗?是否有一个替代配置,它只为Maven和Eclipse使用一个scala库?
如果我从项目中删除scala库,我收到错误:
在类路径上找不到Scala库.验证您的构建路径!
出于某种原因,Eclipse要求scala库位于构建路径上,即使它已作为Maven依赖项可用.
我在IntelliJ IDEA中设置了一个新的Scala/sbt项目,其中ScalaTest和jUnit接口已成功安装为依赖项.当我点击运行或调试时,我有一个测试通过.
我的问题是,如果我改变了某些东西,它就不会重新运行.我必须再次运行或调试然后运行并给出预期的响应.
每次代码更改时,如何设置IntelliJ IDEA(带或不带sbt)来运行所有测试?是否可以运行与仅更改的文件相关的测试?
我可以跑:
runrun...run/debug configuration> +>的junit> test kind = all in package>search for tests = in whole project但是,如果我使用scala测试(+> scala测试>测试种类......)执行相同的(2),第一次测试失败非常奇怪(似乎object没有实例化),而相同的测试通过,如果我使用它运行它(1)或(3)
配置:
奖金问题:如何运行所有测试(junit和scalatest)?
例如,我已经变得依赖于类型丰富
object MyImplicits{
implicit class RichInt(i: Int){
def complexCalculation: Int = i * 200
}
}
Run Code Online (Sandbox Code Playgroud)
我在这样的代码中使用的
object Algorithm{
def apply(rand: Random) = {
import MyImplicits._
rand.nextInt.complexCalculation + 1
}
}
Run Code Online (Sandbox Code Playgroud)
但是我现在如何隔离和单元测试算法呢?特别是,我想嘲笑这样的实现complexCalculation:
class MyAlgorithmTest extends FreeSpec with MockitoSugar{
import org.mockito.Mockito.when
"MyApgorithm" {
"Delegates complex calculation" in {
val mockRandom = mock[Random]
when(mockRandom.nextInt()).thenReturn(1)
// This wouldn't work, but is the kind of thing I'm looking for
//when(1.complexCalculation).thenReturn(2)
val expected = 1 * 2 + 1
val result = MyAlgorithm(mockRandom) …Run Code Online (Sandbox Code Playgroud) 我何时应该使用shouldBe,何时应该使用shouldEqual?
port shouldEqual 8000
port shouldBe 8000
Run Code Online (Sandbox Code Playgroud) 如何使用intellij安装scala-test.intellij网站上的视频显示他们添加了一个库依赖项,scala-test显示在列表中.我没有那个,因为我需要先安装scala-test.scala网站上的快速入门似乎有一个jar文件的链接.我是否以某种方式配置IDE以将该jar文件指向为全局库?
我遇到了一个我无法解释的问题......在https://github.com/betehess/play-scalatest的项目中它是孤立的.
当我运行时test,sbt卡住一段时间然后抛出此异常:
> test
[error] Uncaught exception when running tests: java.net.ConnectException: Connection timed out
Exception in thread "Thread-1" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2293)
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2473)
at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2543)
at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2445)
at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1941)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:500)
at java.lang.Throwable.readObject(Throwable.java:914)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) …Run Code Online (Sandbox Code Playgroud) 我有一个包含很多Scalacheck生成器的项目正在获取GeneratorDrivenPropertyCheckFailedException,并显示消息"在0次成功的属性评估后放弃.2个评估被丢弃了."
我想让它尝试评估它多次像500(默认值)会好,但我没有看到我的配置覆盖实际使用.
我将此代码添加到测试类中,我仍然得到完全相同的消息.我试过'sbt clean'只是为了确保那里没有发生奇怪的事情.
implicit override val generatorDrivenConfig = PropertyCheckConfig(minSuccessful = 1, maxDiscarded = 500, workers = 1)
Run Code Online (Sandbox Code Playgroud)
为什么我的Scalacheck/Scalatest PropertyCheckConfig被忽略了?
我正在使用Scalatest 2.2.1与Scalacheck 1.12.1和Scala 2.10.4
我希望能够使用JUnit规则,例如我们已经在内部开发的TemporaryFolder其他规则TestRule.实现这一目标的最佳方法是什么?我知道JUnitSuite但它似乎没有拿起@Rule注释.无论如何,我想使用不同的ScalaTest套件.
所以我的问题是:
TestRule?TestRule在Scala测试中使用JUnit ?TemporaryFolder,或者,例如,Stefan Birkner的系统规则提供的方法?这是我尝试过的JUnitSuite:
class MyTest extends JUnitSuite {
//@Rule
//val temporaryFolder = new TemporaryFolder() // throws java.lang.Exception: The @Rule 'temporaryFolder' must be public.
@Rule
def temporaryFolder = new TemporaryFolder()
@Test
def test: Unit = {
assert(temporaryFolder.newFile() !== null) // java.lang.IllegalStateException: the temporary folder has not yet been created
}
}
Run Code Online (Sandbox Code Playgroud)