ExtPlayerPrefs クラスのテストガイド

2024年12月5日

目的

この資料は、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プロジェクトでのデータ管理を強化できます。さらなる機能追加や最適化の際にも、本資料で示したテストを参考にすることで、安心して拡張が可能です。

テスト

Posted by hidepon