【问题标题】:Scalatest or specs2 with multiple test cases具有多个测试用例的 Scalatest 或 specs2
【发布时间】:2011-10-11 22:14:30
【问题描述】:

在 TestNg 和 Java 中,我们可以使用 DataProvider 运行多个测试用例,这会作为单独的测试运行,这意味着测试的执行不会因失败而停止。 ScalaTest 或 Specs/Specs2 有类似物吗?

【问题讨论】:

  • 这个问题令人困惑。请举例说明您的意思。

标签: scala scalatest specs2


【解决方案1】:

在 ScalaTest 和 specs2 中,很容易在运行时创建测试用例,以便用数据参数化它们。以下是 specs2 的示例:

   class BasketSpecification extends Specification {

     "a basket must contain fruits" >> {
       Seq(apple, banana, orange) foreach { fruit => 
         ("it contains: " + fruit) >> {
           basket must contain(fruit)
         }
       }
     }
   }

那么输出是:

 A basket must contain fruits
 + it contains: apple
 + it contains: banana
 + it contains: orange

而以下规范:

   class BasketSpecification extends Specification {

     "a basket must contain fruits" >> {
       Seq(apple, cake, orange) foreach { fruit => 
         ("it contains: " + fruit) >> {
           basket must contain(fruit)
         }
       }
     }
   }

会打印出如下内容:

 A basket must contain fruits
 + it contains: apple
 x it contains: cake
   'basket' does not contain 'cake'
 + it contains: orange

【讨论】:

  • 重读我的问题。您的方法作为 ONE 测试运行,这意味着在一种情况下失败是测试失败。在 TestNg 中,这将作为三个测试运行,因此失败信息是有意义的
  • 很抱歉,规范中没有明确说明它实际上是在创建 3 个测试。我添加了输出以显示这一点。
  • 查看更新的语法:etorreborre.github.io/specs2/guide/…
  • 似乎每个 specs2 版本都会改​​变循环测试示例的方式,这是最新的方法:etorreborre.github.io/specs2/guide/SPECS2-3.2/…
  • 我必须赞成以上评论。我是 Specs2 的长期用户。但是我非常不高兴在集合上运行一些测试是多么不直观和困难。每次我都必须查阅文档,而且每次我都在努力让它运行时。我看到上面的示例必须如何工作,但是如果您(在文档中)找到类似 ((_: Int) must beGreaterThan ...),foreach(...) 的内容,并且您的用例类似于 ((x: Int) => 5 must beGreaterThan(x)).foreach(...),则它不起作用。但目前尚不清楚原因。
【解决方案2】:

这个概念在 ScalaTest 中被称为“共享测试”,因为相同的测试代码被多个夹具“共享”,其中“夹具”是 TestNG 的 DataProvider 方法中的“数据”。 ScalaTest 中的每个样式特征都有一种方法可以将测试表示为函数。这是 WordSpec 的示例:

http://www.scalatest.org/scaladoc-1.6.1/#org.scalatest.WordSpec@SharedTests

您也可以只使用 for 循环为不同的数据点注册相同的测试代码。这是在这里的电子邮件讨论中提出的:

http://groups.google.com/group/scalatest-users/browse_thread/thread/7337628407b48064#

这种情况下的 for 循环代码如下所示:

  for (browser <- List("IE", "Chrome", "Firefox")) { 
    test(browser + ": test one") { driver => 
      info("Testing using " + driver) 
    } 
    test(browser + ": test two") { driver => 
      info("Testing using " + driver) 
    } 
    test(browser + ": test three") { driver => 
      info("Testing using " + driver) 
    } 
    test(browser + ": test four") { driver => 
      info("Testing using " + driver) 
    } 
    test(browser + ": test five") { driver => 
      info("Testing using " + driver) 
    } 
  } 
} 

这实际上注册了 15 个测试,每个浏览器驱动程序有 5 个测试。我相信这就是你所追求的。

【讨论】:

    【解决方案3】:

    ScalaTest 提供Table-driven property checks 使用此工具,您可以针对不同的输入运行测试:

       import org.scalatest.prop.TableDrivenPropertyChecks._
    
    val fractions =
      Table(
        ("n", "d"),  // First tuple defines column names
        (  1,   2),  // Subsequent tuples define the data
        ( -1,   2),
        (  1,  -2),
        ( -1,  -2),
        (  3,   1),
        ( -3,   1),
        ( -3,   0),
        (  3,  -1),
        (  3,  Integer.MIN_VALUE),
        (Integer.MIN_VALUE, 3),
        ( -3,  -1)
      )
    /*------------------------------------------------*/
    import org.scalatest.matchers.ShouldMatchers._
    
    forAll (fractions) { (n: Int, d: Int) =>
    
      whenever (d != 0 && d != Integer.MIN_VALUE
          && n != Integer.MIN_VALUE) {
    
        val f = new Fraction(n, d)
    
        if (n < 0 && d < 0 || n > 0 && d > 0)
          f.numer should be > 0
        else if (n != 0)
          f.numer should be < 0
        else
          f.numer should be === 0
    
        f.denom should be > 0
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      相关资源
      最近更新 更多