persimmon-projects/Persimmon

テストのカテゴリ化

Closed this issue · 3 comments

テストのカテゴリ化

テストエクスプローラの「特徴」によるフィルタリングで使える気がする。モデルには何らかの情報として持たせておきたいが、今すぐ活用するかと言うと疑問。

hafuu commented

テストのカテゴリ化について考えてみました。

TestMetadata 型に val Categories : string[] プロパティを追加する。
TestMetadata を継承している型は TestCaseContext がある。

type TestMetadata =
  val Name : string
  val Categories : string[]
  ...

カテゴリの設定方法

1. テストケースに設定する

下記シグネチャの関数で、テストケースにカテゴリを設定する

val category : name:string -> test:TestCase<'T> -> TestCase<'T>

// テストにカテゴリを設定する
let test1 = test { do! pass() } |> category "CategoryA"

// パラメタライズテスト
let test2 = parameterize {
  source [ 1 ]
  run (fun _ -> test { do! pass() } |> category "CategoryB")
}

2. モジュール配下の全テストに設定する

下記属性をモジュールに付けると、モジュール配下の全テストにカテゴリが設定される

type CategoryAttribute = class end

[<Category("CategoryC")>]
module SomeTest =
  // "CategoryC" というカテゴリが設定される
  let test3 = test { do! pass() }
  
  // "CategoryC" と "CastegoryD" が設定される
  let test4 = test { do! pass() } |> category "CategoryD"
  
  [<Category("CategoryE")>]
  module NestedModule =
    // "CategoryC" と "CategoryE" が設定される
    let test5 = test { do! pass() }

カテゴリの実行方法

指定したカテゴリを実行する

Persimmon.Console.exe tests.dll --category:CategoryA,CategoryB

指定したカテゴリ以外を実行する

Persimmon.Console.exe tests.dll --exclude-category:CategoryD,CategoryE

その他

1. テストを合成した場合はカテゴリについて

次のような場合に、 test1CategoryAは引き継がず、test2のカテゴリは無しとする。

let test1 = test { return 1 } |> category "CategoryA"
let test2 = test {
  let! x = test1
  do! x |> assertEquals 1
}

implemented #126