ScalaTest 运行程序应该支持按标签包含或排除测试,但我无法让它工作。我究竟做错了什么?详细信息如下。
在一个空目录中,给定 build.sbt:
libraryDependencies += "org.scalatest" %% "scalatest" % "2.1.0" % "test"
Run Code Online (Sandbox Code Playgroud)
和 src/test/scala/Test.scala:
class Test extends org.scalatest.FunSuite {
test("fast") {
assertResult(4)(2 + 2) }
test("slow", org.scalatest.tagobjects.Slow) {
assertResult(40)(20 + 20) }
}
Run Code Online (Sandbox Code Playgroud)
然后:
% sbt
[info] Set current project to bug (in build file:/Users/tisue/bug/)
> show sbtVersion
[info] 0.13.1
> test
[info] Compiling 1 Scala source to /Users/tisue/bug/target/scala-2.10/test-classes...
[info] Test:
[info] - fast
[info] - slow
[info] Run completed in 192 milliseconds.
[info] Total number of tests run: …Run Code Online (Sandbox Code Playgroud) 我正在尝试用基于属性的测试 (PBT) 替换一些旧的单元测试,具体地用scala和scalatest - scalacheck但我认为这个问题更普遍。简化的情况是,如果我有要测试的方法:
def upcaseReverse(s:String) = s.toUpperCase.reverse
Run Code Online (Sandbox Code Playgroud)
通常,我会编写单元测试,例如:
assertEquals("GNIRTS", upcaseReverse("string"))
assertEquals("", upcaseReverse(""))
// ... corner cases I could think of
Run Code Online (Sandbox Code Playgroud)
所以,对于每个测试,我写出我期望的输出,没问题。现在,使用 PBT,它会像:
property("strings are reversed and upper-cased") {
forAll { (s: String) =>
assert ( upcaseReverse(s) == ???) //this is the problem right here!
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编写一个对所有String输入都适用的测试时,我发现自己不得不在测试中再次编写方法的逻辑。在这种情况下,测试将如下所示:
assert ( upcaseReverse(s) == s.toUpperCase.reverse)
Run Code Online (Sandbox Code Playgroud)
也就是说,我必须在测试中编写实现以确保输出正确。有没有办法解决这个问题?我是否误解了 PBT,我是否应该测试其他属性,例如:
这也是合理的,但听起来很做作,不太清楚。任何在 PBT 方面有更多经验的人都可以在这里解释一下吗?
编辑:按照@Eric 的消息来源,我找到了这篇文章,并且有一个我的意思的示例(在再次应用类别时):测试times( F#) 中的方法 …
我正在对scalatra路由进行测试,但对独立的sbt项目(使用Jetty)使用ScalatraSuite(FunSuiteLike)失败。
产生的错误是:
java.lang.IllegalArgumentException:要求失败:检测到的本地端口<1,这是不允许的
我还尝试过单独运行码头,然后再运行“ sbt测试”,但同时也引发了同样的错误。谁能帮忙解决这个问题?
假设我想检查结果(整数)是否应该>=4和<=15,我可以在 ScalaTest 测试中编写这样的断言:
assert(num >= 4)
assert(num <= 15)
Run Code Online (Sandbox Code Playgroud)
它有效,但我认为还可以改进。有没有更好的方法在 Scalatest 中检查它?
有时测试是有效的,但被测试的代码已损坏,并且针对测试场景记录了一个缺陷。一旦缺陷被修复,测试将通过。
在那之前,我可以将测试标记为“忽略”,并在评论中注明缺陷编号。然后测试将不会运行,它将被标记为被忽略,并且指标将反映它被忽略的事实。当缺陷被标记为已修复时,我可以找到测试用例并重新启用测试。
我可能可以使用它,但我有点想要另一种选择:将测试标记为缺陷。这会导致测试仍在运行,但会颠倒语义,在这种情况下,预期会出现失败而无需担心,而通过则是庆祝的理由,并会被淘汰。在这种情况下,还有两个汇总统计信息:预期测试失败和意外测试通过。
ScalaTest 中是否已经存在这样的东西?
我想测试一个方法(使用 ScalaTest),它接受一个List值并在数据库中更新它们,Future为每个值返回一个表示更新成功的值。是否有一种惯用的方法来验证所有值都保留在数据库中?我如何知道Future从方法返回的所有s何时完成?
trait Result
case object A extends Result
case object B extends Result
def addToDB(i: String): Future[Result]
def persistUsers(users: List[String]): List[Future[Result]] = {
users.map(addToDB)
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情(有效)但是有更好的方法吗?
"should update list " in {
val users = List("a","b","c")
persistUsers(users)
Thread.sleep(1000)
whenReady(db.find("a")) { result => result shouldEqual A }
.
.
.
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
trait Calculator {
def add(x:Int, y:Int):Int
def multiply(x:Int,y: Int):Int
}
trait MyCalculator extends Calculator {
override def add(x: Int, y: Int): Int = x+y //in real live it calls remote service which is not avaialble in test
override def multiply(x: Int, y: Int): Int = x*y //in real live it calls remote service which is not avaialble in test
}
object MyCalculator extends MyCalculator
Run Code Online (Sandbox Code Playgroud)
现在我有计算器服务:
trait CalculatorServiceTrait {
def calculate(x:Int,sign:String,y:Int):Int
}
trait CalculatorService extends CalculatorServiceTrait{
override def calculate(x: Int, …Run Code Online (Sandbox Code Playgroud) 我使用Scala 2.10带ScalaMock 3.6。
我有一个非常简单的测试用例,其中包含 4 个测试场景。我mock为这些测试创建了一个对象(模仿文件系统):
class ProcessingOperatorTest extends FlatSpec with Matchers with BeforeAndAfterEach with MockFactory {
...
val fakeFS = mock[FileIO]
(fakeFS.createFile _).expects(*).returns(true).anyNumberOfTimes()
(fakeFS.exist _).expects(where { (p: String) => p.contains(existing) }).returns(true).anyNumberOfTimes()
(fakeFS.exist _).expects(where { (p: String) => p.contains(notExisting) }).returns(false).anyNumberOfTimes()
behavior of "Something"
it should "test 1" in {
...
}
it should "test 2" in {
...
}
it should "test 3" in {
...
}
it should "test 4" in {
... …Run Code Online (Sandbox Code Playgroud) 我有一组也会增长的测试套件,我需要运行一个testcleanup任务,该任务仅在所有测试完成执行之后并且在测试过程退出之前才运行一次。这类似于.NET AssebmlyCleanup,但是我无需执行自定义代码就无法在Scala / Scalatest世界中找到等效的东西?
谢谢
我正在尝试为 Akka Actor 编写单元测试。
下面是单元测试代码
import org.scalatest._
import akka.testkit.{TestKit, ImplicitSender, TestActors}
import akka.actor.ActorSystem
class PipFilterTest
extends TestKit(ActorSystem("testSystem"))
with BeforeAndAfterAll
with ImplicitSender
with WordSpecLike {
override def afterAll(): Unit = {
TestKit.shutdownActorSystem(system)
}
"PipeFilter Actor" must {
"send messages if it passes the filter criteria" in {
//test code
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行测试代码时,出现以下错误 -
sbt:chapter8_structuralPatterns> test
[info] Compiling 1 Scala source to /rajkumar_natarajans_directory/projectName/target/scala-2.12/test-classes ...
[error] /rajkumar_natarajans_directory/projectName/src/test/scala/PipeFilterTest.scala:13:7: overriding method run in trait BeforeAndAfterAll of type (testName: Option[String], args: org.scalatest.Args)org.scalatest.Status;
[error] method run …Run Code Online (Sandbox Code Playgroud) scalatest ×10
scala ×8
unit-testing ×3
akka ×1
jetty ×1
mockito ×1
scalacheck ×1
scalamock ×1
scalatra ×1
testing ×1