2013-01-24 25 views
6

Tôi có một Play! dự án nơi tôi muốn thêm một số thông tin bảo hiểm mã. Cho đến nay tôi đã thử JaCoCoscct. Trước đây có vấn đề là nó dựa trên bytecode, do đó nó dường như đưa ra cảnh báo về việc mất kiểm tra cho các phương thức được tự động phát bởi trình biên dịch Scala, chẳng hạn như copy hoặc canEqual. scct có vẻ là một lựa chọn tốt hơn, nhưng trong mọi trường hợp, tôi nhận được nhiều lỗi trong các thử nghiệm với cả hai.Phạm vi mã trên Play! dự án

Hãy để tôi dính với scct. Tôi về cơ bản nhận được lỗi cho mọi thử nghiệm cố gắng kết nối với cơ sở dữ liệu. Nhiều thử nghiệm của tôi tải một số đồ đạc vào cơ sở dữ liệu H2 trong bộ nhớ và sau đó thực hiện một số xác nhận. My Global.scala chứa

override def onStart(app: Application) { 
    SessionFactory.concreteFactory = Some(() => connection) 

    def connection() = { 
     Session.create(DB.getConnection()(app), new MySQLInnoDBAdapter) 
    } 
} 

trong khi các bài kiểm tra thường được kèm theo trong một khối như

class MySpec extends Specification { 
    def app = FakeApplication(additionalConfiguration = inMemoryDatabase()) 

    "The models" should { 
     "be five" in running(app) { 
      Fixtures.load() 
      MyModels.all.size should be_==(5) 
     } 
    } 
} 

Dòng running(app) cho phép tôi chạy một thử nghiệm trong bối cảnh của một ứng dụng làm việc kết nối với một cơ sở dữ liệu trong bộ nhớ , ít nhất là thường. Nhưng khi tôi chạy các tác vụ bảo hiểm mã, chẳng hạn như scct coverage:doc, tôi nhận được các lỗi liên quan đến kết nối với cơ sở dữ liệu.

gì thậm chí còn kỳ lạ hơn nữa là có ít nhất 4 lỗi khác nhau, như:

  • ObjectExistsException: cache chơi đã tồn tại
  • SQLException: Cố gắng để có được một kết nối từ một hồ bơi mà đã được shutdown
  • Cấu hình lỗi [không thể kết nối với cơ sở dữ liệu [default]]
  • không lái xe phù hợp tìm thấy cho jdbc: h2: mem: chơi thử nghiệm - 410454547

Tại sao việc chạy thử nghiệm trong cấu hình mặc định có thể kết nối với cơ sở dữ liệu, trong khi chạy trong bối cảnh scct (hoặc JaCoCo) thất bại trong việc khởi tạo bộ đệm và db?

+0

Bằng cách này, có một điều tôi luôn coi là nghi phạm là một thực tế mà tôi tuyên bố các ứng dụng để sử dụng một 'MySqlInnoDBAdapter', nhưng các xét nghiệm chạy trên một ví dụ H2 trong bộ nhớ. Bằng cách nào đó ma thuật phải xảy ra trong 'FaekApplication', nhưng tôi tự hỏi liệu điều này có liên quan gì đến vấn đề ở bàn tay – Andrea

Trả lời

1

kiểm tra specs2 chạy song song theo mặc định. Phát vô hiệu hóa việc thực hiện song song cho cấu hình thử nghiệm đơn vị tiêu chuẩn, nhưng scct sử dụng một cấu hình khác để nó không biết không chạy song song.

Hãy thử thêm này để Build.scala của bạn:

.settings(parallelExecution in ScctPlugin.ScctTest := false) 

Ngoài ra, bạn có thể thêm sequential đến đầu lớp học thử nghiệm của bạn để buộc tất cả các cấu hình chạy có thể chạy liên tục. Tôi đã có cả hai trong các tập tin của tôi vẫn còn, như tôi nghĩ rằng tôi đã có một số vấn đề với các giải pháp Build.scala tại một thời điểm khi tôi đã được sử dụng một ứng cử viên phát hành sớm của Play.

+1

Cảm ơn bạn. Tôi đã có cấu hình này cho JaCoCo, nhưng có vẻ như đây không phải là nguyên nhân gốc rễ của vấn đề. Theo như tôi có thể nói, tất cả các lỗi tôi nhận được vẫn còn đó. :-( – Andrea

+0

Nếu bạn chạy một mục tiêu như 'chơi gỡ lỗi gỡ lỗi: doc', bạn có thể đính kèm một trình gỡ lỗi với một điểm ngắt trong' Global.scala' của bạn để xem nếu nó đang được nhấn nhiều lần song song? –

0

Bạn cần thêm tuần tự vào đầu Đặc điểm kỹ thuật của mình.

class MySpec extends Specification { 
    sequential 

    "MyApp" should { 
    //...// 
    } 

} 
1

Tùy chọn tốt hơn cho phạm vi mã Scala là Phạm vi cung cấp mức độ phù hợp cho dòng tuyên bố. https://github.com/scoverage/scalac-scoverage-plugin

Thêm vào dự án/plugins.SBT:

addSbtPlugin("com.sksamuel.scoverage" % "sbt-scoverage" % "1.0.1") 

Sau đó chạy SBT với

sbt clean coverage test 
+0

Làm thế nào chúng ta có thể làm cho công cụ này cho các ứng dụng dựa trên nền tảng chơi? Nó được thiết kế cho tất cả các tệp tuyến được tạo, vốn không phải là mối quan tâm chính của các thử nghiệm ứng dụng phát. –