2014-12-07 18 views
5

Tôi biết tôi có thể thêm cài đặt và mã ngẫu nhiên trong SBT cho giai đoạn thử nghiệm bằng cách sửa đổi testOptions, ví dụ:scala chạy thử SBT cài đặt và lệnh dọn dẹp một lần vào nhiều dự án

val embedMongoTestSettings: Seq[Setting[_]] = Seq(
    testOptions in Test += Tests.Setup(() => createMongod()), 
    testOptions in Test += Tests.Cleanup(() => destroyMongod()) 
) 

Vấn đề là tôi có điều này được thực hiện trên cơ sở từng dự án và sau đó được thực hiện một lần cho mỗi dự án. Vì vậy, khi tôi có một dự án đa được thiết lập, tôi kích hoạt một số cơ sở dữ liệu trong trường hợp này (có thể hoạt động, nhưng có nghĩa là tôi phải định cấu hình cho mỗi cổng dự án, v.v.).

Có cách nào trong sbt đảm bảo rằng các bước nhất định chỉ chạy một lần cho bất kỳ giai đoạn thử nghiệm nào, cho dù đó là cho nhiều dự án, một dự án hay một trường hợp thử nghiệm?

Cách duy nhất tôi tính là tự quản lý đồng thời trong các phần thiết lập và dọn dẹp, do đó, hãy giữ một bộ đếm toàn cục để kiểm tra xem nó có phải là lần đầu tiên hoặc lần cuối bị rách hay không.

Trả lời

1

Tôi đã viết một bài đăng blog trên sequencing tasks, mà bạn có thể thấy nó hữu ích.

Nếu bạn muốn tổng hợp kiểm tra và đảm bảo mọi thứ được sắp xếp theo trình tự, một cách nhanh chóng để thực hiện điều đó là tạo lệnh tùy chỉnh. Sau đây định nghĩa một lệnh bí danh gọi sts:

lazy val commonSettings = Seq(
    scalaVersion := "2.11.4" 
) 
lazy val specs2Core = "org.specs2" %% "specs2-core" % "2.4.15" 
val startTest = taskKey[Unit]("start test") 
val stopTest = taskKey[Unit]("stop test") 

lazy val root = (project in file(".")). 
    aggregate(app, webapp). 
    settings(commonSettings: _*). 
    settings(addCommandAlias("sts", ";startTest;test;stopTest"): _*). 
    settings(
    startTest in ThisBuild := { 
     println("starting server...") 
     Thread.sleep(500) 
    }, 
    stopTest in ThisBuild := { 
     println("stopping server...") 
     Thread.sleep(500) 
    } 
) 

lazy val app = (project in file("app")). 
    settings(commonSettings: _*). 
    settings(
    libraryDependencies += specs2Core % Test 
) 

lazy val webapp = (project in file("webapp")). 
    settings(commonSettings: _*). 
    settings(
    libraryDependencies += specs2Core % Test 
) 

Bạn có thể thay thế việc thực hiện startTest in ThisBuildstopTest in ThisBuild như bạn muốn. Bằng cách xác định các cài đặt này ở cấp ThisBuild, lệnh sts sẽ hoạt động ở cả cấp cơ sở cũng như ở cấp tiểu dự án riêng lẻ.

root> sts 
starting server... 
[success] Total time: 1 s, completed Jan 13, 2015 5:20:58 PM 
[info] HelloWorldSpec 
.... 
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3 
[success] Total time: 1 s, completed Jan 13, 2015 5:20:59 PM 
stopping server... 
[success] Total time: 1 s, completed Jan 13, 2015 5:20:59 PM 
root> project app 
[info] Set current project to app 
app> sts 
starting server... 
[success] Total time: 1 s, completed Jan 13, 2015 5:21:15 PM 
[info] HelloWorldSpec 
.... 
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3 
[success] Total time: 1 s, completed Jan 13, 2015 5:21:16 PM 
stopping server... 
[success] Total time: 1 s, completed Jan 13, 2015 5:21:16 PM 
Các vấn đề liên quan