ExtPlayerPrefs クラスのテストガイド
目的
この資料は、ExtPlayerPrefs クラスの機能を網羅的にテストするコードの内容と、その背景を詳細に説明するものです。本資料を通じて、ExtPlayerPrefs クラスの各機能に対する理解を深め、効果的なテスト手法について学ぶことができます。
テストの概要
ExtPlayerPrefs クラスのテストコードは、以下の機能を確認することを目的としています:
- プリミティブ型データの保存と読み出しが正しく行われること。
- 複雑なオブジェクトの保存と復元が期待通り動作すること。
- ScriptableObject の保存・読み出しが適切に処理されること。
- エラー処理が正しく動作し、適切な例外がスローされること。
各機能について、テストの手順、実装例、確認ポイントを明確に示し、開発者が確実に各シナリオをカバーできるようにしています。また、テストケースごとにユースケースを定義し、意図的なエラーハンドリングやデータの整合性の検証を行います。
テストの内容
1. プリミティブ型データの保存と読み出し
テストケース
- 整数型 (int) の同期保存と読み出し
- 文字列型 (string) の非同期保存と読み出し
このセクションでは、プリミティブ型データ(整数や文字列)の保存と読み出しが意図した通りに動作することを確認します。同期処理と非同期処理の両方についてテストを行い、非同期保存・読み出しの際のパフォーマンスや整合性についてもチェックしています。
実装例
[Test]
public void SaveAndLoad_ShouldWorkCorrectly()
{
var testData = new TestData { Name = "テストユーザー", Age = 25 };
// データを保存
var savedJson = ExtPlayerPrefs.Save(testData, TestFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(testFilePath), Is.True);
// データを読み込む
var loadedData = ExtPlayerPrefs.Load<TestData>(TestFileName, EncryptionKey);
Assert.That(loadedData, Is.Not.Null);
Assert.That(loadedData.Name, Is.EqualTo(testData.Name));
Assert.That(loadedData.Age, Is.EqualTo(testData.Age));
}
[Test]
public async Task SaveAndLoadAsync_ShouldWorkCorrectly()
{
var testData = new TestData { Name = "非同期ユーザー", Age = 30 };
// データを非同期で保存
var savedJson = await ExtPlayerPrefs.SaveAsync(testData, TestFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(testFilePath), Is.True);
// データを非同期で読み込む
var loadedData = await ExtPlayerPrefs.LoadAsync<TestData>(TestFileName, EncryptionKey);
Assert.That(loadedData, Is.Not.Null);
Assert.That(loadedData.Name, Is.EqualTo(testData.Name));
Assert.That(loadedData.Age, Is.EqualTo(testData.Age));
}
確認ポイント
- 保存した値と読み出した値が完全に一致するか。
- ファイルが正しく生成されるか。
- 非同期処理が正常に完了するか。
- パフォーマンスの観点から、非同期処理が効率的に行われているか。
2. 複雑なオブジェクトの保存と読み出し
テストケース
- カスタムクラス TestData の同期保存と読み出し
- 非同期処理によるデータ保存と復元
複雑なオブジェクトの保存と復元を通して、より現実的なユースケースにおけるデータ整合性と、復元時のオブジェクト構造の一致を検証します。これにより、カスタムクラスのデータを安全に永続化できることを確認します。
実装例
[Test]
public void SSaveAndLoad_ShouldWorkCorrectly)
{
var testData = new TestData { Name = "テストユーザー", Age = 25 };
// データを保存
var savedJson = ExtPlayerPrefs.Save(testData, TestFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(testFilePath), Is.True);
// データを読み込む
var loadedData = ExtPlayerPrefs.Load<TestData>(TestFileName, EncryptionKey);
Assert.That(loadedData, Is.Not.Null);
Assert.That(loadedData.Name, Is.EqualTo(testData.Name));
Assert.That(loadedData.Age, Is.EqualTo(testData.Age));
}
[Test]
public async Task SaveAndLoadAsync_ShouldWorkCorrectly()
{
var testData = new TestData { Name = "非同期ユーザー", Age = 30 };
// データを非同期で保存
var savedJson = await ExtPlayerPrefs.SaveAsync(testData, TestFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(testFilePath), Is.True);
// データを非同期で読み込む
var loadedData = await ExtPlayerPrefs.LoadAsync<TestData>(TestFileName, EncryptionKey);
Assert.That(loadedData, Is.Not.Null);
Assert.That(loadedData.Name, Is.EqualTo(testData.Name));
Assert.That(loadedData.Age, Is.EqualTo(testData.Age));
}
確認ポイント
- オブジェクトのプロパティが保存前後で一致しているか。
- 非同期処理が期待通り動作するか。
- カスタムクラスの各プロパティが正しく復元されているか。
- 非同期保存・復元が効率的で、実用的な速度で行われているか。
3. ScriptableObject の保存と読み出し
テストケース
- ScriptableObject の同期保存と読み出し
- 非同期処理による ScriptableObject の保存と復元
Unity特有の型である ScriptableObject の永続化をテストします。これはゲーム開発においてよく使用されるため、そのデータが正しく保存・読み出しできることは重要です。
実装例
[Test]
public void SaveScriptableObjectAndLoadScriptableObject_ShouldWorkCorrectly()
{
var scriptableObject = ScriptableObject.CreateInstance<TestScriptableObject>();
scriptableObject.Description = "テストの説明";
scriptableObject.Value = 42;
// ScriptableObject を保存
var savedJson = ExtPlayerPrefs.SaveScriptableObject(scriptableObject, TestScriptableObjectFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(Path.Combine(Application.persistentDataPath, TestScriptableObjectFileName)), Is.True);
// ScriptableObject を読み込む
var loadedObject = ScriptableObject.CreateInstance<TestScriptableObject>();
ExtPlayerPrefs.LoadScriptableObject(loadedObject, TestScriptableObjectFileName, EncryptionKey);
Assert.That(loadedObject.Description, Is.EqualTo(scriptableObject.Description));
Assert.That(loadedObject.Value, Is.EqualTo(scriptableObject.Value));
}
[Test]
public async Task SaveScriptableObjectAsyncAndLoadScriptableObjectAsync_ShouldWorkCorrectly()
{
var scriptableObject = ScriptableObject.CreateInstance<TestScriptableObject>();
scriptableObject.Description = "非同期テストの説明";
scriptableObject.Value = 99;
// ScriptableObject を非同期で保存
var savedJson = await ExtPlayerPrefs.SaveScriptableObjectAsync(scriptableObject, TestScriptableObjectFileName, EncryptionKey);
Assert.That(savedJson, Is.Not.Null);
Assert.That(File.Exists(Path.Combine(Application.persistentDataPath, TestScriptableObjectFileName)), Is.True);
// ScriptableObject を非同期で読み込む
var loadedObject = ScriptableObject.CreateInstance<TestScriptableObject>();
await ExtPlayerPrefs.LoadScriptableObjectAsync(loadedObject, TestScriptableObjectFileName, EncryptionKey);
Assert.That(loadedObject.Description, Is.EqualTo(scriptableObject.Description));
Assert.That(loadedObject.Value, Is.EqualTo(scriptableObject.Value));
}
確認ポイント
- ScriptableObject のプロパティが保存前後で一致しているか。
- 非同期処理による保存・読み出しが正常に動作するか。
- ScriptableObject のプロパティが、期待通りの状態で永続化されているか。
4. エラーハンドリング
テストケース
- 存在しないファイルを読み込もうとした場合
- null データを保存しようとした場合
エラーハンドリングのテストは、予期せぬ操作に対して適切な例外がスローされるかどうかを確認することを目的としています。これにより、アプリケーションの安定性と信頼性を確保します。
実装例
[Test]
public void Load_NonExistentFile_ShouldThrowFileNotFoundException()
{
Assert.That(() => ExtPlayerPrefs.Load<TestData>("存在しないファイル.json"), Throws.TypeOf<FileNotFoundException>());
}
[Test]
public void Save_NullObject_ShouldThrowArgumentNullException()
{
Assert.That(() => ExtPlayerPrefs.Save<TestData>(null, TestFileName), Throws.TypeOf<System.ArgumentNullException>());
}
[Test]
public void SaveScriptableObject_Null_ShouldThrowArgumentNullException()
{
Assert.That(() => ExtPlayerPrefs.SaveScriptableObject<TestScriptableObject>(null, TestScriptableObjectFileName), Throws.TypeOf<System.ArgumentNullException>());
}
確認ポイント
- 適切な例外がスローされるか (FileNotFoundException、ArgumentNullException)。
- 不正な操作によるシステムエラーが発生しないか。
- エラーが発生した際の挙動が、予期通りでありシステムの安定性を維持できるか。
テストコード全体の設計意図
網羅性
- ExtPlayerPrefs の全機能(プリミティブ型、複雑な型、ScriptableObject)をカバー。
- 同期処理・非同期処理の両方をテストし、幅広いシナリオに対応。
信頼性
- 保存前後のデータ一致を厳密に検証し、データが破損しないことを保証。
- ファイル操作における異常系を徹底的にチェックし、想定外の状況でも安定性を維持。
拡張性
- 新しいデータ型や機能を追加する際も、このテストを基盤として容易に検証を追加可能。
- テストコードを再利用しやすい設計にすることで、将来的な機能拡張に対応。
テストの実行方法
Unityエディタでテスト実行
- Window > General > Test Runner を開き、Edit Mode または Play Mode テストを選択。
- 対象のテストを実行して結果を確認。
テスト結果の確認
- 成功時: すべてのテストが緑色で表示されます。
- 失敗時: エラーが発生したテストが赤色で表示され、失敗の詳細を確認できます。
- 詳細なログを確認し、エラーの原因を特定し、適切な修正を行います。
結論
このテストコードは、ExtPlayerPrefs クラスの全機能を網羅し、実際の運用で信頼性の高い動作を保証するものです。これにより、開発者は安心して ExtPlayerPrefs をプロジェクトに導入し、データの永続化を行うことができます。
対応範囲
- プリミティブ型(int、string など)
- 複雑な型(クラス、オブジェクト)
- Unity特有の型(ScriptableObject)
検証内容
- 正常系(保存・読み出し)
- 異常系(エラー処理)
本テストコードを基に、ExtPlayerPrefs の信頼性を高め、Unityプロジェクトでのデータ管理を強化できます。さらなる機能追加や最適化の際にも、本資料で示したテストを参考にすることで、安心して拡張が可能です。
ディスカッション
コメント一覧
まだ、コメントがありません