7. Scene Validation Test
Learning Objectives
Test scene for presence of Sara and Wand game object. Utilize Test Framework feature to make this test use all scenes as fixtures.
Exercise
- Create ValidationTest.cs file with a single namespace and two classes SceneValidationTests and GameplayScenesProvider.
- In the Tests class create SaraAndWandArePresent test to check that "Sara Variant" and "Wand" game objects are not null.
- In the Fixture class
GameplayScenesProvider
implementIEnumerable<string>
and in generator method yield all scenes from EditorBuildSettings.scenes. - Use
TestFixture
and TestFixtureSource annotations on SceneValidationTests class. - Create a new Empty Scene and attach it to
EditorBuildSettings
to verify if tests are created dynamically.
Hints
TestFixture
andTestFixtureSource
NUnit annotations require Test Class to be present inside Namespace.- To attach a scene to
EditorBuildSettings
, you need to create a new Scene, and then add it to File > Build Settings.
Solution
ValidationTests.cs
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
namespace ValidationTests
{
[TestFixture]
[TestFixtureSource(typeof(GameplayScenesProvider))]
public class SceneValidationTests
{
private readonly string _scenePath;
public SceneValidationTests(string scenePath)
{
_scenePath = scenePath;
}
[OneTimeSetUp]
public void LoadScene()
{
SceneManager.LoadScene(_scenePath);
}
[UnityTest]
public IEnumerator SaraAndWandArePresent()
{
yield return waitForSceneLoad();
var wand = GameObject.Find("Wand");
var sara = GameObject.Find("Sara Variant");
Assert.NotNull(wand, "Wand object exists");
Assert.NotNull(sara, "Sara object exists");
}
IEnumerator waitForSceneLoad()
{
while (!SceneManager.GetActiveScene().isLoaded)
{
yield return null;
}
}
}
public class GameplayScenesProvider : IEnumerable
{
public IEnumerator GetEnumerator()
{
foreach (var scene in EditorBuildSettings.scenes)
{
if (!scene.enabled || scene.path == null)
{
continue;
}
yield return scene.path;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}