Christian-health / scala-learning

学习scala语言
0 stars 0 forks source link

ScalaTest 博客学习 #22

Open Christian-health opened 5 years ago

Christian-health commented 5 years ago

1. ScalaTest简介

ScalaTest几乎已经成为Scala语言默认的测试框架,而在JVM平台下,无论是否使用Scala进行开发,我认为仍有尝试ScalaTest的必要。这主要源于它提供了多种表达力超强的测试风格,能够满足各种层次的需求包括单元测试、BDD、验收测试、数据驱动测试。

  1. 1 UT与IT的风格选择 ScalaTest一共提供了七种测试风格,分别为:FunSuite,FlatSpec,FunSpec,WordSpec,FreeSpec,PropSpec和FeatureSpec。这就好像使用相同的原料做成不同美味乃至不同菜系的佳肴,你可以根据自己的口味进行选择。

以我个人的偏好来看,我倾向于选择FlatSpec或FunSpec(类似Ruby下的RSpec)来编写单元测试与集成测试。虽然FunSuite的方式要更灵活,而且更符合传统测试方法的风格,区别仅在于test()方法可以接受一个闭包,但坏处恰恰就是它太灵活了。

而FlatSpec和FunSpec则通过提供诸如it、should、describe等方法,来规定书写测试的一种模式,例如前者明显的*“主-谓-宾”结构*,后者清晰的分级式结构,都可以使团队的测试更加规范。如下是ScalaTest官方网站的提供的FunSuite、FlatSpec和FunSpec的三种风格样例。

//FunSuite
import org.scalatest.FunSuite

class SetSuite extends FunSuite {
  test("An empty Set should have size 0") {
      assert(Set.empty.size == 0)
  }
      test("Invoking head on an empty Set should produce NoSuchElementException") {
      intercept[NoSuchElementException] {
          Set.empty.head
      }
  }
}

//FlatSpec
import org.scalatest.FlatSpec

class SetSpec extends FlatSpec {
  "An empty Set" should "have size 0" in {
      assert(Set.empty.size == 0)
  }
      it should "produce NoSuchElementException when head is invoked" in {
      intercept[NoSuchElementException] {
          Set.empty.head
      }
  }
}

//FunSpec
import org.scalatest.FunSpec

class SetSpec extends FunSpec {
  describe("A Set") {
      describe("when empty") {
          it("should have size 0") {
              assert(Set.empty.size == 0)
          }
          it("should produce NoSuchElementException when head is invoked") {
              intercept[NoSuchElementException] {
                  Set.empty.head
              }
          }
      }
  }
}

至于WordSpec和FreeSpec,要么太复杂,要么可读性稍差,要么惯用法风格有些混杂,个人认为都不是太好的选择,除非你已经习惯了这种风格。

出处:https://blog.csdn.net/lb812913059/article/details/83315498

Christian-health commented 5 years ago

实例中混入了特质 Matchers ,这个特质是非常强大的。在混入它之前,只能使用 assert 来进行测试。混入它之后,就可以使用一些非常易读的测试方法。

出处:http://ju.outofmemory.cn/entry/250076

Christian-health commented 5 years ago

org.scalatest.Suite

只要把测试类扩展Suite ,并且定义了名字以“test ”开头的测试方法,就可以实现简单的测试,参考下面的代码:

import org.scalatest.Suite  
   class MySuite extends Suite{  
   def testOk(){  
      assert(true)  
   }  
      def testOther(){  
        assert(true)  
   }  
}  

出处:https://blog.csdn.net/lantian0802/article/details/39299833

Christian-health commented 5 years ago

这个还没有看必须看 出处:https://blog.csdn.net/hany3000/article/details/51033610

Christian-health commented 5 years ago

@runWith注解起什么作用啊?

@RunWith(SpringJUnit4ClassRunner.class)
使用了Spring的SpringJUnit4ClassRunner
以便在测试开始的时候自动创建Spring的应用上下文
注解了@RunWith就可以直接使用spring容器,直接使用@Test注解,不用启动spring容器

出处:https://www.jianshu.com/p/2f5f4160d4aa

Spring 解惑 @RunWith的作用
@RunWith就是一个运行器
@RunWith(JUnit4.class)就是指用JUnit4来运行

出处:https://www.imooc.com/qadetail/79560

Junit 的测试套件Suite
作用:批量运行测试类

1、@RunWith 注解声明该类为一个测试入口(该类中不包含其他方法)
2、更改测试运行器Suite.class
将要测试的类作为数组传入到Suite.SuiteClass( { a ,b , c,…} )的数组中

出处:https://www.jianshu.com/p/1f011d2e2eb9