320 lines
9.7 KiB
Markdown
320 lines
9.7 KiB
Markdown
# Platform Certification Testing Guide
|
|
|
|
## Overview
|
|
|
|
Certification testing ensures games meet platform holder requirements (Sony TRC, Microsoft XR, Nintendo Guidelines). Failing certification delays launch and costs money—test thoroughly before submission.
|
|
|
|
## Platform Requirements Overview
|
|
|
|
### Major Platforms
|
|
|
|
| Platform | Requirements Doc | Submission Portal |
|
|
| --------------- | -------------------------------------- | ------------------------- |
|
|
| PlayStation | TRC (Technical Requirements Checklist) | PlayStation Partners |
|
|
| Xbox | XR (Xbox Requirements) | Xbox Partner Center |
|
|
| Nintendo Switch | Guidelines | Nintendo Developer Portal |
|
|
| Steam | Guidelines (less strict) | Steamworks |
|
|
| iOS | App Store Guidelines | App Store Connect |
|
|
| Android | Play Store Policies | Google Play Console |
|
|
|
|
## Common Certification Categories
|
|
|
|
### Account and User Management
|
|
|
|
```
|
|
REQUIREMENT: User Switching
|
|
GIVEN user is playing game
|
|
WHEN system-level user switch occurs
|
|
THEN game handles transition gracefully
|
|
AND no data corruption
|
|
AND correct user data loads
|
|
|
|
REQUIREMENT: Guest Accounts
|
|
GIVEN guest user plays game
|
|
WHEN guest makes progress
|
|
THEN progress is not saved to other accounts
|
|
AND appropriate warnings displayed
|
|
|
|
REQUIREMENT: Parental Controls
|
|
GIVEN parental controls restrict content
|
|
WHEN restricted content is accessed
|
|
THEN content is blocked or modified
|
|
AND appropriate messaging shown
|
|
```
|
|
|
|
### System Events
|
|
|
|
```
|
|
REQUIREMENT: Suspend/Resume (PS4/PS5)
|
|
GIVEN game is running
|
|
WHEN console enters rest mode
|
|
AND console wakes from rest mode
|
|
THEN game resumes correctly
|
|
AND network reconnects if needed
|
|
AND no audio/visual glitches
|
|
|
|
REQUIREMENT: Controller Disconnect
|
|
GIVEN player is in gameplay
|
|
WHEN controller battery dies
|
|
THEN game pauses immediately
|
|
AND reconnect prompt appears
|
|
AND gameplay resumes when connected
|
|
|
|
REQUIREMENT: Storage Full
|
|
GIVEN storage is nearly full
|
|
WHEN game attempts save
|
|
THEN graceful error handling
|
|
AND user informed of issue
|
|
AND no data corruption
|
|
```
|
|
|
|
### Network Requirements
|
|
|
|
```
|
|
REQUIREMENT: PSN/Xbox Live Unavailable
|
|
GIVEN online features
|
|
WHEN platform network is unavailable
|
|
THEN offline features still work
|
|
AND appropriate error messages
|
|
AND no crashes
|
|
|
|
REQUIREMENT: Network Transition
|
|
GIVEN active online session
|
|
WHEN network connection lost
|
|
THEN graceful handling
|
|
AND reconnection attempted
|
|
AND user informed of status
|
|
|
|
REQUIREMENT: NAT Type Handling
|
|
GIVEN various NAT configurations
|
|
WHEN multiplayer is attempted
|
|
THEN appropriate feedback on connectivity
|
|
AND fallback options offered
|
|
```
|
|
|
|
### Save Data
|
|
|
|
```
|
|
REQUIREMENT: Save Data Integrity
|
|
GIVEN save data exists
|
|
WHEN save is loaded
|
|
THEN data is validated
|
|
AND corrupted data handled gracefully
|
|
AND no crashes on invalid data
|
|
|
|
REQUIREMENT: Cloud Save Sync
|
|
GIVEN cloud saves enabled
|
|
WHEN save conflict occurs
|
|
THEN user chooses which to keep
|
|
AND no silent data loss
|
|
|
|
REQUIREMENT: Save Data Portability (PS4→PS5)
|
|
GIVEN save from previous generation
|
|
WHEN loaded on current generation
|
|
THEN data migrates correctly
|
|
AND no features lost
|
|
```
|
|
|
|
## Platform-Specific Requirements
|
|
|
|
### PlayStation (TRC)
|
|
|
|
| Requirement | Description | Priority |
|
|
| ----------- | --------------------------- | -------- |
|
|
| TRC R4010 | Suspend/resume handling | Critical |
|
|
| TRC R4037 | User switching | Critical |
|
|
| TRC R4062 | Parental controls | Critical |
|
|
| TRC R4103 | PS VR comfort ratings | VR only |
|
|
| TRC R4120 | DualSense haptics standards | PS5 |
|
|
| TRC R5102 | PSN sign-in requirements | Online |
|
|
|
|
### Xbox (XR)
|
|
|
|
| Requirement | Description | Priority |
|
|
| ----------- | ----------------------------- | ----------- |
|
|
| XR-015 | Title timeout handling | Critical |
|
|
| XR-045 | User sign-out handling | Critical |
|
|
| XR-067 | Active user requirement | Critical |
|
|
| XR-074 | Quick Resume support | Series X/S |
|
|
| XR-115 | Xbox Accessibility Guidelines | Recommended |
|
|
|
|
### Nintendo Switch
|
|
|
|
| Requirement | Description | Priority |
|
|
| ------------------ | ------------------- | -------- |
|
|
| Docked/Handheld | Seamless transition | Critical |
|
|
| Joy-Con detachment | Controller handling | Critical |
|
|
| Home button | Immediate response | Critical |
|
|
| Screenshots/Video | Proper support | Required |
|
|
| Sleep mode | Resume correctly | Critical |
|
|
|
|
## Automated Test Examples
|
|
|
|
### System Event Testing
|
|
|
|
```cpp
|
|
// Unreal - Suspend/Resume Test
|
|
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
|
FSuspendResumeTest,
|
|
"Certification.System.SuspendResume",
|
|
EAutomationTestFlags::ApplicationContextMask | EAutomationTestFlags::ProductFilter
|
|
)
|
|
|
|
bool FSuspendResumeTest::RunTest(const FString& Parameters)
|
|
{
|
|
// Get game state before suspend
|
|
FGameState StateBefore = GetCurrentGameState();
|
|
|
|
// Simulate suspend
|
|
FCoreDelegates::ApplicationWillEnterBackgroundDelegate.Broadcast();
|
|
|
|
// Simulate resume
|
|
FCoreDelegates::ApplicationHasEnteredForegroundDelegate.Broadcast();
|
|
|
|
// Verify state matches
|
|
FGameState StateAfter = GetCurrentGameState();
|
|
|
|
TestEqual("Player position preserved",
|
|
StateAfter.PlayerPosition, StateBefore.PlayerPosition);
|
|
TestEqual("Game progress preserved",
|
|
StateAfter.Progress, StateBefore.Progress);
|
|
|
|
return true;
|
|
}
|
|
```
|
|
|
|
```csharp
|
|
// Unity - Controller Disconnect Test
|
|
[UnityTest]
|
|
public IEnumerator ControllerDisconnect_ShowsPauseMenu()
|
|
{
|
|
// Simulate gameplay
|
|
GameManager.Instance.StartGame();
|
|
yield return new WaitForSeconds(1f);
|
|
|
|
// Simulate controller disconnect
|
|
InputSystem.DisconnectDevice(Gamepad.current);
|
|
yield return null;
|
|
|
|
// Verify pause menu shown
|
|
Assert.IsTrue(PauseMenu.IsVisible, "Pause menu should appear");
|
|
Assert.IsTrue(Time.timeScale == 0, "Game should be paused");
|
|
|
|
// Simulate reconnect
|
|
InputSystem.ReconnectDevice(Gamepad.current);
|
|
yield return null;
|
|
|
|
// Verify prompt appears
|
|
Assert.IsTrue(ReconnectPrompt.IsVisible);
|
|
}
|
|
```
|
|
|
|
```gdscript
|
|
# Godot - Save Corruption Test
|
|
func test_corrupted_save_handling():
|
|
# Create corrupted save file
|
|
var file = FileAccess.open("user://save_corrupt.dat", FileAccess.WRITE)
|
|
file.store_string("CORRUPTED_GARBAGE_DATA")
|
|
file.close()
|
|
|
|
# Attempt to load
|
|
var result = SaveManager.load("save_corrupt")
|
|
|
|
# Should handle gracefully
|
|
assert_null(result, "Should return null for corrupted save")
|
|
assert_false(OS.has_feature("crashed"), "Should not crash")
|
|
|
|
# Should show user message
|
|
var message_shown = ErrorDisplay.current_message != ""
|
|
assert_true(message_shown, "Should inform user of corruption")
|
|
```
|
|
|
|
## Pre-Submission Checklist
|
|
|
|
### General Requirements
|
|
|
|
- [ ] Game boots to interactive state within platform time limit
|
|
- [ ] Controller disconnect pauses game
|
|
- [ ] User sign-out handled correctly
|
|
- [ ] Save data validates on load
|
|
- [ ] No crashes in 8+ hours of automated testing
|
|
- [ ] Memory usage within platform limits
|
|
- [ ] Load times meet requirements
|
|
|
|
### Platform Services
|
|
|
|
- [ ] Achievements/Trophies work correctly
|
|
- [ ] Friends list integration works
|
|
- [ ] Invite system functions
|
|
- [ ] Store/DLC integration validated
|
|
- [ ] Cloud saves sync properly
|
|
|
|
### Accessibility (Increasingly Required)
|
|
|
|
- [ ] Text size options
|
|
- [ ] Colorblind modes
|
|
- [ ] Subtitle options
|
|
- [ ] Controller remapping
|
|
- [ ] Screen reader support (where applicable)
|
|
|
|
### Content Compliance
|
|
|
|
- [ ] Age rating displayed correctly
|
|
- [ ] Parental controls respected
|
|
- [ ] No prohibited content
|
|
- [ ] Required legal text present
|
|
|
|
## Common Certification Failures
|
|
|
|
| Issue | Platform | Fix |
|
|
| --------------------- | ------------ | ----------------------------------- |
|
|
| Home button delay | All consoles | Respond within required time |
|
|
| Controller timeout | PlayStation | Handle reactivation properly |
|
|
| Save on suspend | PlayStation | Don't save during suspend |
|
|
| User context loss | Xbox | Track active user correctly |
|
|
| Joy-Con drift | Switch | Proper deadzone handling |
|
|
| Background memory | Mobile | Release resources when backgrounded |
|
|
| Crash on corrupt data | All | Validate all loaded data |
|
|
|
|
## Testing Matrix
|
|
|
|
### Build Configurations to Test
|
|
|
|
| Configuration | Scenarios |
|
|
| --------------- | ----------------------- |
|
|
| First boot | No save data exists |
|
|
| Return user | Save data present |
|
|
| Upgrade path | Previous version save |
|
|
| Fresh install | After uninstall |
|
|
| Low storage | Minimum space available |
|
|
| Network offline | No connectivity |
|
|
|
|
### Hardware Variants
|
|
|
|
| Platform | Variants to Test |
|
|
| ----------- | ------------------------------- |
|
|
| PlayStation | PS4, PS4 Pro, PS5 |
|
|
| Xbox | One, One X, Series S, Series X |
|
|
| Switch | Docked, Handheld, Lite |
|
|
| PC | Min spec, recommended, high-end |
|
|
|
|
## Best Practices
|
|
|
|
### DO
|
|
|
|
- Read platform requirements document thoroughly
|
|
- Test on actual hardware, not just dev kits
|
|
- Automate certification test scenarios
|
|
- Submit with extra time for re-submission
|
|
- Document all edge case handling
|
|
- Test with real user accounts
|
|
|
|
### DON'T
|
|
|
|
- Assume debug builds behave like retail
|
|
- Skip testing on oldest supported hardware
|
|
- Ignore platform-specific features
|
|
- Wait until last minute to test certification items
|
|
- Use placeholder content in submission build
|
|
- Skip testing with real platform services
|