2013-08-18 42 views
5

Tôi có dịch vụ web Scalatra chạy với Jetty được nhúng. bây giờ tôi muốn viết bài kiểm tra tích hợp rằng:Khởi động ứng dụng Scala trong SBT để kiểm tra tích hợp

  • bắt đầu dịch vụ (sử dụng phương pháp chính của ứng dụng)
  • chạy thử nghiệm (lái giao diện HTTP)
  • dừng dịch vụ.

Tất cả điều này sẽ được kích hoạt bởi lệnh SBT.

Tôi nên làm như thế nào?

Trả lời

2

Bạn có thể viết các bài kiểm tra tích hợp này lên trên các khuôn khổ kiểm tra BDD như Thông số. Dự án Unfiltered có nhiều ví dụ như vậy sẽ làm việc cho các khung công tác web khác như Scalatra.

Ví dụ, hãy nhìn vào ServerSpec:

"A Server" should { 
    "respond to requests" in { 
    http(host as_str) must_== "test" 
    } 
    .... 
} 

Nó bắt đầu lên một máy chủ thử nghiệm theo quy định tại setup và đánh nó bằng văn trong đặc tả. Phần quan trọng được thực hiện trong unfiltered.spec.jetty.Served trait, mà bạn mô tả: bắt đầu và dừng dịch vụ. Ngoài ra còn có phiên bản Specs2: unfiltered.specs2.jetty.Served.

Một mẹo khác bạn có thể sử dụng là sbt-revolver, plugin yêu thích của tôi trong khi thực hiện bất kỳ phát triển web nào, đặc biệt được sử dụng cùng với JRebel. Plugin này có thể tải máy chủ web của bạn ở chế độ nền. Tôi đã không thử nghiệm với nhau, nhưng nó có thể làm việc nếu bạn không phải thay đổi phía máy chủ trong khi thử nghiệm.

1

Scalatra cung cấp DSL để viết kiểm tra. Có hỗ trợ cho specs2scalatest.

By default Cầu nối được nhúng sẽ được sử dụng để thử nghiệm. Nếu bạn muốn cung cấp máy chủ của riêng mình, bạn có thể sử dụng lại việc triển khai EmbeddedJettyContainer và ghi đè start, stopservletContextHandler.

start sẽ được gọi trước khi thực hiện các kiểm tra, cho phép khởi động máy chủ của bạn nếu được yêu cầu. stop được gọi sau khi kiểm tra. servletContextHandler là bắt buộc để thêm servlets của bạn bằng cách sử dụng addServlet(..).

Đây là từ sự tích hợp spec2:

trait BaseScalatraSpec extends SpecificationStructure with FragmentsBuilder with ScalatraTests { 
    override def map(fs: =>Fragments) = Step(start())^super.map(fs)^Step(stop()) 
} 

trait ScalatraTests extends EmbeddedJettyContainer with HttpComponentsClient { } 

Hoặc bạn có thể cung cấp Container thực hiện của riêng bạn.

Các vấn đề liên quan