0Pricing
Lua Academy · レッスン

describeブロックとitブロック

テストスイートを構成します。

「describeブロックとitブロック」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

specの構造

bustedでは、describeとitという2つの主要な関数でテストを構成します。describeブロックは関連するテストをまとめ、各itブロックは1つのテストケースになります。

この構造はビヘイビア駆動開発に由来しており、自然な文章のように読めます。

describe("Stack", function()
  it("starts empty", function()
    assert.are.equal(0, Stack.new():size())
  end)
end)

describeブロック

describeは名前の文字列と関数を受け取ります。名前には、モジュールやクラスなど、テスト対象の単位や機能を示すべきです。

関数の中にあるものはすべて、そのグループに属します。名前はテスト出力に表示され、結果を整理します。

describe("calculator", function()
  -- tests live here
end)

itブロック

各itブロックでは、1つの具体的な動作を説明します。文字列は、describeで始まる文を完成させる内容にします。

「calculator」と「adds two numbers」をつなげて読むと、意図を明確に示す仕様になります。

describe("calculator", function()
  it("adds two numbers", function()
    assert.are.equal(5, calc.add(2, 3))
  end)
end)

describeブロックのネスト

describeブロックをネストして、コンテキストを表現できます。内側のブロックでは、特定のメソッドや特殊な条件について説明できます。

ネストすると関連するケースをまとめられ、読みやすくインデントされた出力が得られます。

describe("List", function()
  describe("push", function()
    it("adds an item", function()
      assert.are.equal(1, list:push("a"):size())
    end)
  end)
end)

before_eachのセットアップ

before_eachは、そのブロック内の各itの前に関数を実行します。テスト同士で状態を共有しないよう、毎回新しいテストデータを作成するために使用します。

これにより、各テストが独立します。あるテストの変更が次のテストに漏れることはありません。

describe("Stack", function()
  local s
  before_each(function()
    s = Stack.new()
  end)
  it("pushes", function()
    s:push(1)
    assert.are.equal(1, s:size())
  end)
end)

after_eachのティアダウン

after_eachは、各テストの後に実行されます。一時ファイル、開いている接続、グローバル状態などのリソースを後片付けするために使用します。

セットアップとティアダウンを組み合わせることで、テスト間で環境をリセットできます。

after_each(function()
  os.remove("temp.db")
end)

setupとteardown

bustedにはsetupとteardownも用意されています。これらはテストごとに1回ではなく、describeブロックごとに1回実行されます。

テストごとにセットアップすると無駄になる、共有接続を開くといったコストの高い1回限りの処理に使用します。

describe("db", function()
  setup(function()
    db = connect()
  end)
  teardown(function()
    db:close()
  end)
end)

保留中のテスト

まだ書いていないテストを記録しておきたい場合があります。pendingに説明を渡して呼び出すか、関数のないitブロックを記述します。

bustedはこれらを成功でも失敗でもなく保留中として報告し、完成させる必要があることを知らせます。

it("handles unicode", function()
  pending("not implemented yet")
end)

テストの絞り込みと除外

デバッグ中は、テストの一部に集中できます。コマンドラインで--tagsを付けたり、bustedのヘルパーを使ったりすると、必要なテストだけを実行できます。

これにより、1つの問題箇所を反復して修正するときに、テストスイート全体を実行せずに済みます。

-- run only tests tagged 'fast'
-- busted --tags=fast

命名規則

良い名前を付けると、失敗の原因が説明なしでもわかります。describeは対象から始め、itは動作を表す動詞から始めてください。

「works」や「test1」のような曖昧な名前は避けてください。失敗したテストを、対応可能なバグ報告のように読める名前にします。

describe("parser", function()
  it("rejects malformed input", function()
    assert.has_error(function() parser.parse("{") end)
  end)
end)

まとめて構成する

完全なspecでは、describeグループ、before_eachによるセットアップ、対象を絞ったitケースを組み合わせます。このひな形は、1つのテストから数百のテストまで拡張できます。

ブロックを小さく保ち、各itでは1つの動作に集中すると、出力が最もわかりやすくなります。

describe("Account", function()
  local acc
  before_each(function() acc = Account.new(100) end)
  it("withdraws funds", function()
    acc:withdraw(40)
    assert.are.equal(60, acc.balance)
  end)
end)

理解度チェック

bustedのブロック構造について理解できているか確認しましょう。

まとめ

describeは関連するテストをまとめ、itは仕様のように読める単一のケースを定義します。describeブロックをネストしてコンテキストを表現します。

テストごとの独立性にはbefore_eachとafter_eachを、ブロックごとに1回行う処理にはsetupとteardownを使用します。未完成の作業にはpendingを付けます。

よくある質問

「describeブロックとitブロック」レッスンは無料ですか?

はい。「describeブロックとitブロック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「describeブロックとitブロック」で何を学びますか?

テストスイートを構成します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「describeブロックとitブロック」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. テストする理由
  2. describeブロックとitブロック
  3. アサーション
  4. モックとスパイ
← Lua Academyに戻る