【Scala】specs2 ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/06/07/183708

で、紹介した
Scala の テスティングフレームワーク「2)specs2」について
もう少し深彫ってみる

目次

【1】specs2
 1)その他特徴
 2)補足:BDD(Behavior-Driven Development; 振舞駆動開発)
【2】specs2 の記述スタイル
 1)単体テスト仕様(Unit Specification)
 2)受入テスト仕様(Acceptance Specification)
【3】構築手順
 1)トラブルシュート・エラー「Not found」
 2)実行方法
【4】Hello world
 1)対象クラス
 2)テストコード
 3)テスト実行

【1】specs2

* BDDスタイルのテスティングフレームワーク
* ScalaTest より高機能(例えば、HTMLリポートなど)

https://etorreborre.github.io/specs2/
https://github.com/etorreborre/specs2

1)その他特徴

* アサーションのためのDSL(Domain Specific Language; ドメイン固有言語)が充実

2)補足:BDD(Behavior-Driven Development; 振舞駆動開発)

* TDD(Test-Driven Development; テスト駆動開発)を拡張した手法であり、
 システムの予想される動作を確認するためのテストに重点を置いたもの

cf. 振舞(フルマイ)

【2】specs2 の記述スタイル

* 以下の2つ記法がある

1)単体テスト仕様(Unit Specification)
2)受入テスト仕様(Acceptance Specification)

1)単体テスト仕様(Unit Specification)

* クラスレベルのユニットテストに向いている

2)受入テスト仕様(Acceptance Specification)

* ドキュメント指向の強いスタイル
* シナリオベースの結合テストに向いている

【3】構築手順

* sbt でインストール可能。

https://etorreborre.github.io/specs2/guide/SPECS2-3.7.3/org.specs2.guide.Installation.html
https://repo1.maven.org/maven2/org/specs2/specs2-core_2.12/

build.sbt

//resolvers += ("Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases").withAllowInsecureProtocol(true)

libraryDependencies ++= Sep(
  "org.specs2" %% "specs2-core" % "4.20.6" % "test"
)

scalacOptions in Test ++= Seq("-Yrangepos")

1)トラブルシュート・エラー「Not found」

https://mvnrepository.com/artifact/org.specs2/specs2-core

で最新が「5.5.3」だったので、
~~~~
  "org.specs2" %% "specs2-core" % "5.5.3" % "test"
~~~~
と指定したのだが、以下のエラーになった。

エラーメッセージ

$ sbt test
[info] welcome to sbt 1.10.0 (Oracle Corporation Java 11)
...略...
[info] Updating sample_2.13
[info] Resolved sample_2.13 dependencies
[warn]                                                                                                                                              
[warn]  Note: Unresolved dependencies path:
[error] sbt.librarymanagement.ResolveException: Error downloading org.specs2:specs2-core_2.13:5.5.3
[error]   Not found
[error]   Not found
[error]   not found: C:\Users\TestUser\.ivy2\localorg.specs2\specs2-core_2.13\5.5.3\ivys\ivy.xml
[error]   not found: https://repo1.maven.org/maven2/org/specs2/specs2-core_2.13/5.5.3/specs2-core_2.13-5.5.3.pom
[error]         at lmcoursier.CoursierDependencyResolution.unresolvedWarningOrThrow(CoursierDependencyResolution.scala:346)
...略...
[error]         at java.base/java.lang.Thread.run(Thread.java:834)
[error] (update) sbt.librarymanagement.ResolveException: Error downloading org.specs2:specs2-core_2.13:5.5.3
[error]   Not found
[error]   Not found
[error]   not found: C:\Users\TestUser\.ivy2\localorg.specs2\specs2-core_2.13\5.5.3\ivys\ivy.xml
[error]   not found: https://repo1.maven.org/maven2/org/specs2/specs2-core_2.13/5.5.3/specs2-core_2.13-5.5.3.pom
[error] Total time: 3 s, completed 2024/06/08 11:17:00

(とりあえずの)解決案
https://github.com/etorreborre/specs2/issues/579

で
You should depend directly on specific modules like specs2-core.
You can find it on the maven repo.
って言ってたので、以下のサイトにたどり着いた

https://repo1.maven.org/maven2/org/specs2/specs2-core_2.12/

の中の最新「4.20.6」だったのでそれを指定。

メモ
https://seratch.hatenablog.jp/entry/2014/10/22/180357
https://qiita.com/kuchita_el/items/2e5468af211778dd10e7

2)実行方法

sbt test

【4】Hello world

* 以下の公式サイトも参考になるかも、、、

https://etorreborre.github.io/specs2/website/SPECS2-5.2.0/quickstart.html

1)対象クラス

src/main/scala/Hello.scala

object Hello {
  def sayHello(name: String): String = s"Hello, $name!"
}

2)テストコード

src/test/scala/HelloSpec.scala

import org.specs2.mutable.Specification

class HelloSpec extends Specification {
  "HelloWorld" should {

    "Say Hello!" in {
      Hello.sayHello("Mike") must_== "Hello, Mike!"
    }
  }
}

3)テスト実行

$ sbt test
...
[info] HelloSpec
[info] HelloWorld should                                                                                                                            
[info]   + Say Hello!                                                                                                                               
[info] Total for specification HelloSpec                                                                                                            
[info] Finished in 190 ms                                                                                                                           
[info] 1 example, 0 failure, 0 error                                                                                                                
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 13 s, completed 2024/06/08 12:20:15

参考文献

https://dev.classmethod.jp/articles/specs2-basis/
https://zenn.dev/takaki/articles/scala-specs2

関連記事

Scala ~ テスティングフレームワーク
https://dk521123.hatenablog.com/entry/2024/06/07/183708
specs2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/06/09/221005
ScalaTest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/27/001306
ScalaTest ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/03/28/003906
ScalaTest ~ with ScalaCheck ~
https://dk521123.hatenablog.com/entry/2023/03/29/000014
ScalaTest ~ with Mockito ~
https://dk521123.hatenablog.com/entry/2023/03/31/002830
ScalaTest ~ with Coverage ~
https://dk521123.hatenablog.com/entry/2023/08/07/222945
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331