How to fix Play framework 2.1.3 does not run unit test

Play framework 2.1.3 รุ่นล่าสุดที่ออกเมื่อวันที่ Aug 06 2013 พบปัญหาว่า เมื่อใช้คำสั่ง play test แล้วโปรแกรมไม่ยอม run test แม้แต่คลาสเดียวดัง log ข้างล่าง

magicalcyber:hello Apple$ play test
[info] Loading project definition from /Users/Apple/test_workspace/play/hello/project
[info] Set current project to hello (in build file:/Users/Apple/test_workspace/play/hello/)
[info] Updating {file:/Users/Apple/test_workspace/play/hello/}hello…
[info] Resolving org.hibernate.javax.persistence#hibernate-jpa-2.0-api;1.0.1.Fin [info] Done updating.
[info] Compiling 4 Scala sources and 2 Java sources to /Users/Apple/test_workspace/play/hello/target/scala-2.10/classes…
[info] Compiling 2 Java sources to /Users/Apple/test_workspace/play/hello/target/scala-2.10/test-classes…
[info] IntegrationTest
[info]
[info]
[info] Total for test IntegrationTest
[info] Finished in 0.026 seconds
[info] 0 tests, 0 failures, 0 errors
[info] ApplicationTest
[info]
[info]
[info] Total for test ApplicationTest
[info] Finished in 0.0 seconds
[info] 0 tests, 0 failures, 0 errors
[info] Passed: : Total 0, Failed 0, Errors 0, Passed 0, Skipped 0
[success] Total time: 17 s, completed Aug 7, 2013 11:16:33 PM
magicalcyber:hello Apple$

โดยสังเกตุได้จากบรรทัด

[info] Passed: : Total 0, Failed 0, Errors 0, Passed 0, Skipped 0

จะเห็นว่า Total 0 คือไม่มีการ test แม้แต่ case เดียวเลย

ปัญหาเนื่องมาจากทางทีม Play ได้เลือก jUnit 4.11 ที่เป็นรุ่นล่าสุด (ณ วันที่เขียนบทความ) มาใช้งาน แต่ตัว framework กลางที่ใช้เชื่อมต่อระหว่าง Play กับ jUnit ที่ชื่อว่า junit-interface ไม่ support ก็เลยเกิดปัญหานี้ขึ้น

How to fix#1

  1. เปิดไฟล์ project/Build.scala ขึ้นมา
  2. จากนั้นเพิ่มคำสั่งนี้ต่อท้าย javaEbean ในบรรทัดประกาศตัวแปร val appDependencies
    "play" %% "play-test" % play.core.PlayVersion.current % "test" exclude("com.novocode", "junit-interface"),
        "com.novocode" % "junit-interface" % "0.9" % "test"
    

    จากเดิม

    val appDependencies = Seq(
        // Add your project dependencies here,
        javaCore,
        javaJdbc,
        javaEbean
      )
    

    ก็จะกลายเป็น

    val appDependencies = Seq(
        // Add your project dependencies here,
        javaCore,
        javaJdbc,
        javaEbean,
        "play" %% "play-test" % play.core.PlayVersion.current % "test" exclude("com.novocode", "junit-interface"),
        "com.novocode" % "junit-interface" % "0.9" % "test"
      )
  3. ไปหน้า console แล้วพิมพ์คำสั่ง play test คราวนี้ test case เราก็จะทำงานแล้ว

    magicalcyber:hello Apple$ play test
    [info] Loading project definition from /Users/Apple/test_workspace/play/hello/project
    [info] Set current project to hello (in build file:/Users/Apple/test_workspace/play/hello/)
    [info] Updating {file:/Users/Apple/test_workspace/play/hello/}hello…
    [info] Resolving org.hibernate.javax.persistence#hibernate-jpa-2.0-api;1.0.1.Fin [info] Done updating.
    [info] IntegrationTest
    [info] + IntegrationTest.test
    [info]
    [info]
    [info] Total for test IntegrationTest
    [info] Finished in 0.026 seconds
    [info] 1 tests, 0 failures, 0 errors
    [info] ApplicationTest
    [info] + ApplicationTest.simpleCheck
    [info] + ApplicationTest.renderTemplate
    [info]
    [info]
    [info] Total for test ApplicationTest
    [info] Finished in 0.001 seconds
    [info] 2 tests, 0 failures, 0 errors
    [info] Passed: : Total 3, Failed 0, Errors 0, Passed 3, Skipped 0
    [success] Total time: 15 s, completed Aug 7, 2013 11:27:23 PM
    magicalcyber:hello Apple$

    ดูจาก Toal เป็นค่า 3 แสดงว่าทำการทดสอบไปแล้ว 3 case

    [info] Passed: : Total 3, Failed 0, Errors 0, Passed 3, Skipped 0

How to fix#2

  1. เปิดไฟล์ project/Build.scala ขึ้นมา
  2. บรรทัดที่มีโค้ด
    val main = play.Project(appName, appVersion, appDependencies).settings(
        // Add your own project settings here      
      )
    

    ให้แก้ไขเป็น

     val main = play.Project(appName, appVersion, appDependencies).settings(
        // Add your own project settings here    
         testOptions in Test ~= { args =>
          for {
            arg <- args
            val ta: Tests.Argument = arg.asInstanceOf[Tests.Argument]
            val newArg = if(ta.framework == Some(TestFrameworks.JUnit)) ta.copy(args = List.empty[String]) else ta
          } yield newArg
        }  
      )
    

อ้างอิง

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s