2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Game Testをデータパックで使ってみる

Last updated at Posted at 2025-12-09

この記事は JavaEdition 1.21.10 にて動作確認を行っています

データパック及びコマンドにある程度の知識があることを前提としています

Mod等を使った、関数型Game Testについては解説していません

指摘や質問などを、軽い気持ちでぜひコメントしていってください!

0. はじめに

最初に軽くGame Testを使って、どんなことができるか見てみてください。

これは、
「ディスペンサーから矢を撃ったときに、4ブロック離れた的ブロックの丁度真ん中に当たるか?」
というテストをしてみました。(動画によると、30回中、1回は真ん中に当たったようです。)


一見シンプル(地味)なことしかできなさそうですが、使いこなせばもっと高度な検証も自動化できます。 ぜひこの記事で使い方を学び、皆さんのデータパックやコマンド作成にお役立てください!

1. Game Testとは?

Minecraft Wiki より
ゲームテスト(英:Game Test)とは、Modやデータパックの開発用のシステムテストフレームワークである。

...(中略)

大まかに関数型ブロックベース型が存在している(要約)

....いわゆる関数型はModなどを使わないといけないので、今回は触れずに、ブロックベース型を取り扱います。

ブロックベース型のGame Testは

  • モブやシステムの動きを実際にゲーム内でブロック等を使ってテストできる機能
  • 1.21.5 (25w03a) からはコマンド・データパックを介して使用できるようになった
  • Mojang開発チームやMod開発者内では、もっとずっと前からバグチェック等に使用されていた

...らしいです。


では、概要が分かったところで、ここからは私自身も実際にGame Testを触りながら、その使い方を解説していきます。

解説の際に、文字だけだとわからないことがあると思います
そういった場合でも、実例を見るとわかることがあるので、気にせずそのまま進んでください

2. Game Testの準備

ここからは Minecraft Snapshot 25w03a の記事を元に話を進めます。ぜひこちらも併せてご覧ください。

2-1. ワールドの作成

なにか影響するおそれがあるので、新規作成したスーパーフラットが推奨とのこと。

2-2. Game Test用の構造物を作成

ではストラクチャーブロックを用いて、構造物を作りましょう。

作った構造物でGame Testを行います。
(ストラクチャーブロックの使い方や、構造物についての説明はここではしません。)

エンティティの行動が絡んでくるテストを行いたい場合、テストに関係するエンティティは直接構造物に召喚しておくのは、おすすめしません

どうすべきか
村人の動きを知りたい この後説明する、開始モードのテストブロックを使用し、開始時にコマンドブロックなどから自動的に召喚する。
テストに関係ない装飾用の額縁など 構造物にそのまま置いておいてよし1

Game Test用の構造物を作るうえで重要な要素があります。
それは、テストブロックを設置する ことです

テストブロックの使い方を説明します。
まずテストブロックを取得します。

/give @p minecraft:test_block

設置し、UIからモードを「開始」「ログ」「失敗」「認証」と4つに変更できるはずです。

mode.png

それぞれのテストブロックには以下のように使うことができます。

モード 起こること
開始 テスト開始時にレッドストーンパルスが発せられる
ログ レッドストーン信号を受けた時、メッセージをログに出力する
失敗 レッドストーン信号を受けた時、テストを 失敗 させる
認証 レッドストーン信号を受けた時、テストを 成功 させる

  • 開始
    テスト開始時にレッドストーン信号が一瞬(具体的には1tick)発せられます。
    これを用いることで、装置を起動したり、コマンドブロックからエンティティを召喚したりすることができます。

  • ログ
    レッドストーン信号を受けた時に設定したメッセージをログファイルに出力します。
    ログファイルは、<ゲームフォルダ>/logs/latest.log か、 <ゲームフォルダ>/logs/日付-番号.log.gz に保存されています。2
    ログを確認すると Test log (at ja{x=X座標, y=Y座標, z=Z座標}): 設定したメッセージ3 などと出力されているはずです。
    これを用いることで、テスト中にログを出して、テストが思ったとおりに動いているか確認することができます。

  • 失敗
    レッドストーン信号を受けた時にテストを 失敗 させます。
    メッセージを設定することで、ログモード 時と同じように、メッセージをログファイルに出力できます。

  • 認証
    レッドストーン信号を受けた時にテストを 成功 させます。
    メッセージを設定することで、ログモード 時と同じように、メッセージをログファイルに出力できます。

Game Testの構造物には、最低でも 開始モード のテストブロックと 認証モード のテストブロックが1つずつ必要です
(何回かテストしましたが、 開始モード のテストブロックは複数個あるとダメっぽいです4

例として、テストブロック等でこんな構造物を作ってみました。5
dispenser_test.png
ディスペンサーの中には矢が一本入っています。

もし、見るだけでなんとなく装置の意味がわかるなら、以下の説明は飛ばしても構いません。

この装置の説明(クリックで表示) まず、テストを開始すると開始モードのテストブロックが起動し、レッドストーン信号が出ます。 レッドストーン信号によりディスペンサーが起動し、矢が発射されます。 ディスペンサーがアイテムを発射する方向は、若干ランダム要素を含みます。

なので、もし以下のような軌道を描いた場合、
dispenser_test_up.png
上の的ブロックに当たり、レッドストーン信号が発せられます。
それにより、隣接している 認証モード のテストブロックが起動し、このテストは「成功」となります。

ですが、以下のような軌道の場合、
dispenser_test_down.png
下の的ブロックに当たり、レッドストーン信号が発せられます。
それにより、隣接している 失敗モード のテストブロックが起動し、このテストは「失敗」となります。

つまりこの装置は、「ディスペンサーが発射した矢が7ブロック先の的へ落下せず、射止められるかどうか」の検証をしています。


これからTest InstanceとTest Environmentの説明をしますが、手っ取り早く実例を見たい場合は 2-5. 実例 に飛んでください

Test InstanceやTest Environmentの変更を適用したい場合、/reloadでは意味がありません。
ワールドに入りなおすと適用されます

2-3. Test Instanceの作成

構造物ができたので、Game Testをする上で必須の Test Instance を作成しましょう。

Test Instanceとは...

Minecraft Snapshot 25w03a より
...(中略) They're small assets defining a test to run.

つまりloot tableなどと同じように、どのようなGame Testなのか定義するものという認識で大丈夫です。多分

データパックを作成し、data/データパックの名前空間/test_instanceディレクトリにjson形式で記述します。

いつもお世話になっている、 misode氏作成のこのツール を使用することをオススメします。

Test Instanceの基本フィールドの説明

厳密なことは Minecraft Wiki-ゲームテスト 1.1 テストインスタンス に詳しく書いているので、ここではサクッと簡単に要約したものを書きます。

基本フィールド(クリックで表示)
  • type
    • 1. Game Testとは? で説明した、関数型のテストをするのか、ブロックベース型のテストをするのかを入力します
    • block_basedfunctionで指定してください
    • 今回はblock_basedしか解説していないので、この記事と同じように進めたいならblock_basedと指定するのをオススメします。6

  • environment
    • この次の 2-4. Test Environmentの作成 で解説する、Test Environmentか、その内容を指定してください
    • このTest Instanceを実行する際のセットアップに使用します


  • max_ticks
    • 何ティック経過したら、このテストがタイムアウト(時間切れで失敗)したと見なすかを指定します

  • setup_ticks
    • この項目はなくても大丈夫ですが、省略時には0と見なされます
    • 構造物設置から何ティック経過後に、テストを開始するかを指定します

  • required
    • この項目はなくても大丈夫ですが、省略時にはtrueと見なされます
    • 3. Game Testの実行と/testコマンドの構文 で解説しますが、/testコマンドを用いることで、複数のテストをひとまとめに実行できます。その際にこの項目がfalseの場合、このテストが失敗しても、まとまりとしてのテストには影響しません
    • 例えば(クリックで表示)3つのテスト(A, B, C)をまとめて実行したとします。この「A, B, Cのセット」が「テスト全体」です。
      それぞれの設定が以下のようだとします。
      テストA: 必須 (required: true)
      テストB: 必須 (required: true)
      テストC: オプション(required: false)

      この時、「テスト全体(セット)」としての成功か失敗かは以下のように決まります。

      A(成功)、B(成功)、C(成功)
      結果:「テスト全体」として成功

      A(成功)、B(成功)、C(失敗)
      結果:「テスト全体」として成功
      (理由:Cはオプションなので、失敗しても全体での失敗にはならないから)

      A(成功)、B(失敗)、C(成功)
      結果:「テスト全体」として失敗
      (理由:必須であるBが失敗したため、グループ全体が失敗扱いになる)

  • rotation
    • この項目はなくても大丈夫ですが、省略時にはnoneと見なされます
    • noneclockwise_90180counterclockwise_90かで指定して下さい
    • 読み込む構造物に適用する回転です

  • manual_only
    • この項目はなくても大丈夫ですが、省略時にはfalseと見なされます
    • 3-1-2. テストidセレクター で解説しますが、/testコマンドを用いることで、複数のテストをひとまとめに実行できますが、この項目がtrueのテストは実行されません。単体で実行しようとしない限り、実行しないという意味です

  • max_attempts, required_successes
    • どちらの項目はなくても大丈夫ですが、省略時にはどちらも1と見なされます
    • テストを実行した際に、required_successes回成功するまでmax_attempts回試行します
      max_attempts: 3 (最大3回チャンスがある)
      required_successes: 1 (そのうち1回でも成功すればOK)
      という感じ

  • sky_access
    • この項目はなくても大丈夫ですが、省略時にはfalseと見なされます
    • テストは実行時にバリアブロックで構造物を囲んだ状態で行われます
    • trueにすると上側のバリアブロックがない状態になり、空が遮断されなくなるます

2-4. Test Environmentの作成

Test Instanceを作るうえで、environmentという項目があったはずです。
そこで指定するのが、これから作る Test Environment です。

Test Environment(日:テスト環境)とは
名前のとおり、Test Instanceを実行する環境です。

天気や、ゲームルール、事前に実行する関数などを指定することができます

元々、単一で空の環境としてminecraft:defaultが用意されています
特に指定したい要素がないならこれを使用しましょう

データパックを作成し、data/データパックの名前空間/test_environmentディレクトリにjson形式で記述します。

またお世話になる、 misode氏作成のこのツール を使用することをオススメします。
(正直、 Minecraft Wiki-ゲームテスト 1.2 テスト環境 でフィールドについてわかりやすく解説してありますし、つまづきそうな所はなかったので、フィールドについての解説は今回は省略させてください。)

2-5. 実例

今回、私自身も以下のようなテストと環境を用意してみました。
1つ目の構造物はテストブロックの説明で使用した これ です
dispenser_test.png
テストインスタンスは

test_instance/dispenser_accuracy_test
{
	"type": "minecraft:block_based",
	"environment": "minecraft:default",
	"structure": "gametesttest:dispenser_accuracy_test",
	"max_ticks": 40
}

2つ目の構造物はこれを用意しました

開始すると下のコマンドブロック2つが起動します。

1つ目は、/setblock (岩盤ブロックの相対座標) dirt

2つ目は、/setblock (岩盤ブロックの相対座標の二個上) redstone_block

左のリピートコマンドブロックは、execute if block (岩盤ブロックの相対座標) mycelium run setblock ~ ~1 ~ redstone_block

右のリピートコマンドブロックは、execute if block (岩盤ブロックの相対座標) grass_block run setblock ~ ~1 ~ redstone_block
です。

この装置の詳しい説明(クリックで表示)

1つ目のコマンドブロックで、岩盤ブロックを土ブロックにし、
2つ目のコマンドブロックで、上2つのリピートコマンドブロックの間にレッドストーンブロックを設置し、リピートコマンドブロックを常備実行状態にします。7

それぞれリピートコマンドブロックは
土が草ブロックになったら上にレッドストーンブロックを設置するものと、
土が菌糸ブロックになったら上にレッドストーンブロックを設置するものがあります。

そしてそれぞれ、

草ブロックは隣り合う土ブロックを、草ブロックに変化させる。
菌糸ブロックは隣り合う土ブロックを、菌糸ブロックに変化させる。

という特性があります

つまりこの装置は、
土が草ブロックに変化したら成功
土が菌糸ブロックに変化したら成功

と言う、どっちが土を変化できるかの草 vs 菌糸ブロックのバトルのテストです8



test_instance/grass_vs_mycelium
{
	"type": "minecraft:block_based",
	"environment": "gametesttest:grass_vs_mycelium",
	"structure": "gametesttest:grass_vs_mycelium",
	"max_ticks": 200,
	"required": true
}

この装置は時間がかかり、タイムアウト(テストの時間切れ)がおきてしまいます。
なので環境をいじっています。

test_environment/grass_vs_mycelium
{
	"type": "minecraft:game_rules",
	"bool_rules": [],
	"int_rules": [
		{
			"rule": "randomTickSpeed",
			"value": 600
		}
	]
}
もちろん、まとめてこのように書くこともできます(クリックで表示)
test_instance/grass_vs_mycelium
{
	"type": "minecraft:block_based",
	"environment": {
		"type": "minecraft:game_rules",
		"bool_rules": [],
		"int_rules": [
			{
				"rule": "randomTickSpeed",
				"value": 600
			}
		]
	},
	"structure": "gametesttest:grass_vs_mycelium",
	"max_ticks": 200,
	"required": true
}

3. Game Testの実行

作ったテストを実行したいのですが、どうすればよいのでしょうか?

テストは/testコマンドか、 テストインスタンスブロック を使用することで実行できます。
まずは/testコマンドの構文を説明します

テストによって引き起こされた要素やイベントは、resetclearstopをしてもそのまま残る場合があります。

絶対に、破壊されても問題ないワールドで実行してください

正確なテストを行いたい場合、同じ操作を何度繰り返しても、同じ結果が得られることを確認してください。

3-1. /testコマンドの構文

構文の法則(クリックで非表示)

<>で囲まれた要素は必須です。無いとエラーがでます。
[<>]で囲まれた要素はオプションです。無くても大丈夫です。
例: give <ターゲット> <アイテムID> [<数>]
-> give @p test_command
-> または give @a test_instance_block 64

testコマンドでは法則があり、

サブコマンドの名前 意味
~~closest runclosest 半径15ブロック以内のテストを~~する
~~that clearthat ターゲットの先の(見ている先の)テストを~~する
~~these clearthese 半径250ブロック内のテストを~~する
test clearall [<半径>]
test clearthat
test clearthese

テスト構造物・ブロックを削除する。

test create <テストID> [<横幅>] [<高さ>] [<奥行き>]

<テストID>のテストのプラットフォームを作ります。
しかし、新しくテストインスタンスが作れるわけではありません
おとなしくdatapackで作成しましょう
この際に設置される テストインスタンスブロック は minecraft:test_instance_block として取得できます。

test pos [<変数名>]

テスト内で見ているブロックの テスト内の相対座標 を表示します。
test_pos.png

[<変数名>]について(Mod開発者向け)(クリックで表示)

オプションの 変数名 を指定すると、コマンドを実行した際に、チャットに出てくるメッセージの座標をクリックして取得できるjavaのコードに、その変数名が使用されます。

何を言っているのか分かりづらいと思いますが、Mod開発などでテストを使用していない限りは使用しないので、気にしないで大丈夫です。


test resetclosest
test resetthat
test resetthese

テストの構造物・ブロックをリセットします。
ゼロから構造物を再配置します。

test stop

すべてのテストを停止します。

test runclosest
test runthat
test runthese

選択したテストを再起動します

3-1-2. テストIDセレクター

ここ以降から<テストIDセレクター>が登場します。

これを使用することで1コマンドで複数のテストを指定できます。

複数のテスト指定すると、選択されたテストがそれぞれ並列的に実行されます

セレクターでは *? という文字を使うことで特殊な選択ができます。
* は「すべての文字」が「0文字以上」という意味で、
? は「すべての文字」が「1文字」という意味です。
名前空間が省略された場合は minecraft がデフォルトとなります。

セレクター 意味 ⭕️当てはまる例 ❎️当てはまらない例
*:* すべてのID minecraft:test
test:minecraft
a:b
なし
* minecraft名前空間内のすべて
minecraft:*と同じ)
minecraft:a
minecraft:test
test:a
custom:minecraft
a:*_test a名前空間の、後ろに _testが続くID a:villager_test
a:test_test
a:_test
a:test_test2
b:test? b名前空間の、testの後ろになにか1文字が続くID b:test1
b:testA
b:test
b:test10
*:*_test_? すべての名前空間の、プレフィックスの後ろに _test_ が続き、その後に任意の1文字が続くID custom:villager_test_1
a:test_test_test_a
minecraft:_test_b
custom:villager_test_10
a:_test_
テストの実行
test run <テストIDセレクター> [<テストを繰り返す回数>] [<失敗したら中断するか>] [<テストに適用する追加の90度回転の数>] [<グリッドの1行あたりに配置するテストの数>]

テストインスタンスブロックを設置し、起動をすることで構造物を配置し、
1つまたは複数のテストを実行します。

複数のテストを一度に実行する場合、グリッド状に配置され並列実行されます。
しかし上限があり、上限を超えた場合、ラウンド制で実行され、前のラウンドが完了してから次のラウンドが開始されます。

実行中のテストはバリアブロックで囲まれます。

ちなみにテストの繰り返し回数を0にすると無限にテストし続けます。

test runmultiple <テストIDセレクター> [<>]

<テストIDセレクター>[<数>]個だけ並列実行します
<テストIDセレクター>で複数のテストを指定すれば、複数のテストを複数回テストすることができます
runmultiple.gif

test runfailed [<テストを繰り返す回数>] [<失敗したら中断するか>] [<テストに適用する追加の90度回転の数>] [<グリッドの1行あたりに配置するテストの数>]
test runfailed [<requiredがtrueのテストだけにするか>] [<テストを繰り返す回数>]

今まで失敗したテストを再度実行します

test verify <テストIDセレクター>

テストを検証します。
「検証」とは、テストを90度ずつ回転し、それぞれ4つの回転あたり100回テストを実行します。
そして、計400回のテストにすべて成功した場合、「検証に成功」と見なされます。

test locate <テストIDセレクター>

読み込まれているチャンクから<テストIDセレクター>の位置を探します

私の環境だけかもれませんが、実行中のテストインスタンスブロック、読み込みをしリセットしたテストインスタンスブロックがあるにも関わらず、
test locate <テストID>を使用しても、テストインスタンスが見つからないと言われます。9

3-3. テストインスタンスブロック

Minecraft Wiki より
test_instance_block

テストインスタンスブロックはゲームテスト実行時にテスト構造物に伴って生成され、そのテストを代表するとともに、ワールド内からそのテストインスタンスを操作したり、テストの結果を出力したりする。

つまりテストインスタンスブロックはテスト用のコマンドブロックのような役割を果たします。

実行したテストインスタンスブロックには、ステータスを示すビーコンの光が表示されます。
必須テスト・オプションテストについては、 Test Instanceの基本フィールドの説明requiredの欄をご覧ください

意味
緑色 成功
灰色 進行中
赤色 失敗(必須テスト)
オレンジ色 失敗(オプションテスト)

test_status.png

更にこれはテストインスタンスブロックのnbtなのですが、
test_instance_nbt.png
data.statusを確認することで、簡単ではありますがテストの状況がわかります。

nbt 意味
cleared 未実行
running 実行中
finished 実行完了

3-2. 実際に実行してみる

では実際にテストを実行してみます。(村人のテストは急きょ入れたテストで、左右どちらの 職業ブロック に行くか、というものです)

複数テスト実行もできていますね。

矢のテストは100件中78件成功ということは、命中率は78%ということですね。(本当はもっと検証したほうが良いのですが)

grass_vs_myceliumは別で1000回検証した所、506回草の勝ちなので、ほぼ50%です
gvm_1000.png

4. おわりに

かなり長くなってしまいました。その割には最後の方はかなり適当だったと思います...
指摘、質問など至らぬところがございましたら、ぜひコメントしていただければ幸いです。

ご清覧ありがとうございました。

  1. そもそもテストに装飾すること自体がオススメはできませんが...

  2. ちなみにおすすめはMinecraft game outputを使うことです。調べてみてください。

  3. ここのat jaのjaはおそらくBlockPosクラスの難読化された名前だと思われます。なのでバージョンによってここの名前が変化する可能性がありますが、気にしないでください

  4. 別に複数あっても良さそうと思うのですが...もしかして、自分の検証が何か間違ってる?

  5. レバーは気にしないでください...

  6. というかデータパックやコマンドでGame Testにふれるなら、block_based以外指定することはないはず

  7. コマンドブロックには常時実行モードがありますが、テストに読み込まれると、再度常時実行モードにしないと起動しないバグ(?)があったので、こういった方法にしています

  8. YouTubeのショート動画でよく見るやつ

  9. もちろんチャンクも読み込まれていますし...情報求む

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?