🤖

RobloxでUnitTestのTestEZを導入する手順

2023/09/22に公開

はじめに(記事の概要)

コンテキスト

RobloxでUnitTestを行う際には、TestEZというライブラリが用意されています。
基本的には簡単に導入ができるようになっているのですが、細かい部分で躓いたため、手順を記録しておこうと思います。

対象読者

  • Robloxでゲーム開発をしている人
  • テスト駆動開発(TDD)に興味がある人
  • UnitTestやってみたい人

TestEZとは

TestEZはRoblox Lua用のBDD(Behavior-Driven Development)スタイルのテストフレームワークです
https://roblox.github.io/testez/

TestEZの導入手順🛠️

ダウンロードとインストール

インストール方法については、こちらのページに記載があります。
https://roblox.github.io/testez/getting-started/installation/

書いてあるとおりといえば、本当に書いてあるとおりなのですが一応記載します。

1.ダウンロード

GitHubのリポジトリから落としてきます。自分はCloneして持ってきました。
https://github.com/Roblox/testez

2. プロジェクトへの組み込み

基本的にはVSCodeを使用して、RojoでRobloxStudioと同期を取るやり方が前提になっています。
それぞれ、ツールを使ったことがないと躓きポイントになるかもしれません。

VSCodeでRojoの設定を行い、作成したrbxlファイルを、RobloxStudioでファイルから開きます。
そうすると、デフォルトのワールドが生成されています。
(何もない空間でしたが)

あとは、公式に書いてあるとおりsrcディレクトリをリネームし、TestEZとします。
配置箇所は自由ですが、自分は下記に配置しました。

src/shared/TestEZ

このディレクトリは、Rojoの設定のdefault.project.jsonで下記の通り定義されており、実態はReplicatedStorage/Shared/TestEZに配置されます。

    "ReplicatedStorage": {
      "Shared": {
        "$path": "src/shared"
      }
    },

rootのsrcはRojoを導入した際にデフォルト設定で作成されるディレクトリです。
TestEZのsrcをリネームする作業とはなんの関係もありません。

イメージ的には下記のようなディレクトリ構成になってくるかと思います。

│  .gitignore
│  default.project.json
│  testez-companion.toml
│  tycoonTest1.rbxl
│  tycoonTest1.rbxl.lock
│  
├─.vscode
│      settings.json
│      
└─src
    ├─client
    │    init.client.lua
    │    
    │          
    ├─server
    │    init.server.lua
    │   TestScript.server.lua
    │                          
    └─shared
       │  Hello.lua
       │  
       └─TestEZ
          │  Context.lua
          │  Expectation.lua
          │  ExpectationContext.lua
          │  init.lua
          │  LifecycleHooks.lua
          │  TestBootstrap.lua
          │  TestEnum.lua
          │  TestPlan.lua
          │  TestPlanner.lua
          │  TestResults.lua
          │  TestRunner.lua
          │  TestSession.lua
          │  
          └─Reporters
                 TeamCityReporter.lua
                 TextReporter.lua
                 TextReporterQuiet.lua

3. TestEZの基本的な使い方

テストケースの作成

テストの書き方に関しては、公式の通りです。
https://roblox.github.io/testez/getting-started/writing-tests/

自分の場合はTycoonの開発をする中で下記のようなテストを書いたりしています。

    describe("タイクーンのオーナーを設定する", function()
        local tycoonId = 1
        local tycoons
        beforeEach(function()
            -- ■前提条件■
            -- Tycoonsの初期化を行う
            local numberOfTycoons = 6
            TycoonsRepository.resetInstance()
            local instance = TycoonsRepository.getInstance()
            local tycoons = Tycoons.new(instance)
            tycoons:initialize(numberOfTycoons)
        end)

        it(
            "新規でタイクーンのオーナーになった場合、ウォレットが作成され、初期値は0である",
            function()
                -- 前提条件:誰も所有していない
                local instance = TycoonsRepository.getInstance()
                local tycoon = instance:getTycoonById(tycoonId)
                expect(tycoon:isAvailableForOwnership()).to.equal(true)

                -- 手順:
                -- オーナーになる
                local tycoonActivator = TycoonActivator.new(instance)
                local result = tycoonActivator:activate(tycoonId, "Bob")
                expect(result:isSuccess()).to.equal(true)

                -- 検証:
                -- ウォレットが作成され、残高が0である
                expect(tycoon:getWallet():getOwnerBalance()).to.equal(0)
            end)
    end)
テストの実行

テスト実行用のサーバースクリプトを用意します。
https://roblox.github.io/testez/getting-started/running-tests/

自分が配置したTestEZを読み込ませ、run()しているだけですね。
これで、RobloxStudioでプレイ / 実行などをしたタイミングでも読み込まれて実行されます。
Studioのコンソールに結果が出力されます。

こちらは、お好みですがVSCodeの拡張機能を作ってくれている方がいます。見慣れた表示で確認できるため自分はかなり重宝しています。
(ニッチな需要のマイナー拡張のため、いつまでメンテしてもらえるかはわかりませんが)
https://marketplace.visualstudio.com/items?itemName=tacheometrist.testez-companion

まとめ

以上、簡単でしたがTestEZの使い方を備忘録兼ねてまとめてみました。
素敵なテストライフを!

Discussion