Quick answer: DLC testing requires a separate checklist from base game testing because DLC introduces risks that base game QA never encounters: forward save compatibility, entitlement boundary behavior, content appearing where it shouldn’t, and base game regressions caused by shared code changes. Run explicit test passes for each of these categories before every DLC release.
Shipping DLC feels like shipping a smaller game — less content, presumably less risk. In practice, DLC is one of the most dangerous updates you can ship because it touches two things at once: it adds new content and it patches the existing game. Every base game player gets the patch whether they buy the DLC or not, which means a bug in your DLC patch can break the experience for 100% of your player base, not just the fraction who purchased the expansion. This guide covers the test categories that matter most.
The DLC Must Work With the Base Game AND Independently
If your DLC is standalone — it can be purchased and played without owning the base game — you need two separate QA passes: one playing the DLC as a standalone experience, and one playing it alongside the base game. These are genuinely different scenarios. The standalone experience may be missing context, characters, or systems that the combined experience provides, and you need to confirm that the standalone version is coherent and bug-free on its own terms.
If your DLC requires the base game, verify that the entitlement check works correctly before any DLC content is accessible. What does the player see if they somehow navigate to DLC content without owning it? Does the game crash, show a purchase prompt, or simply prevent access gracefully? Test the purchase prompt flow itself: clicking “buy” should open the correct store page, and canceling should return the player to a sensible game state without errors.
Also test what happens when a player owns the DLC but the base game data is in an unexpected state — for example, they have completed the base game but the DLC assumes they haven’t started. Or they have the DLC installed but are launching a new game for the first time. All entry points into your DLC content need explicit test cases, not just the expected happy path.
Save Game Forward Compatibility
This is the bug category that generates the most angry reviews after DLC launches, and it’s entirely preventable. Forward compatibility means a save file created before the DLC is installed must load correctly after the DLC is installed. Your pre-DLC save does not contain any of the fields your DLC introduces. If your save loading code assumes those fields exist — because it was written while DLC was enabled — it will crash or corrupt data on old saves.
The correct approach is to always load save fields with a default fallback:
// Bad: crashes if dlc_companion_state doesn’t exist in old saves
companion_state = save_data["dlc_companion_state"]
// Good: falls back to initial state for old saves
companion_state = save_data.get("dlc_companion_state", CompanionState.NOT_MET)
Test this explicitly and without shortcuts. Create a save file before installing the DLC, then install the DLC and load that save. Play through the major progression milestones — area transitions, cutscenes, save-and-quit cycles — and verify nothing breaks. It is not sufficient to test only loading; test the entire session after loading the old save, because some bugs only surface when the newly loaded state is mutated by DLC systems expecting fresh data.
Also test the reverse: a save created with the DLC active must load correctly if the player later disables or uninstalls the DLC. This is less common but matters if you want to avoid corrupted saves for players who try a DLC and refund it.
DLC Entitlement Checks and Platform Ownership Verification
Every platform — Steam, GOG, Epic Games Store, consoles — has its own DLC ownership verification API. You should be testing all of them if you ship on multiple platforms. Steam’s BIsDlcInstalled returns true if the DLC is owned and installed. GOG uses Galaxy SDK entitlement checks. EGS uses Epic Online Services entitlement APIs. Each has different timing characteristics: some complete synchronously, some require a callback.
The dangerous bug pattern is calling your DLC content initialization before the entitlement check has completed. On fast machines with good connections, the check may return quickly enough that this appears to work during testing. On a slow machine with a poor connection, the check takes a moment longer, your initialization fires before the result arrives, and the player either gets DLC content they didn’t buy or gets no DLC content despite owning it. Always await the entitlement confirmation before gating or unlocking DLC content.
Test the entitlement check with network throttling or simulated offline mode. Test with an account that owns the DLC and one that does not. Test mid-session: what happens if the entitlement check is called again (such as on resume from sleep) and returns a different result? While rare, this scenario can occur and should fail gracefully.
Content Interoperability Bugs
One of the trickiest DLC bug categories is content appearing in places it shouldn’t. This happens when DLC items, characters, or events are registered in global systems that also affect base game content. Common examples:
- DLC weapons appearing in base game loot tables, even for players who don’t own the DLC
- DLC characters referenced in base game NPC dialogue trees, causing null reference crashes for non-DLC players
- DLC difficulty modifiers affecting base game balance
- DLC achievements counting toward base game completion percentages
- DLC area NPCs spawning in base game areas due to shared spawn group definitions
Test these scenarios explicitly by playing the base game — without DLC content enabled — after the DLC patch is installed. Use a non-DLC-owning test account if your game gates content by entitlement. Walk through all major base game areas and systems looking for any DLC content that has leaked through. If your game has a loot table editor or debug spawn menu, use it to verify that the available item pool is correct for a non-DLC session.
Regression Testing the Base Game After a DLC Patch
The DLC patch ships to everyone, not just DLC buyers. Every code change in that patch — bug fixes, performance improvements, system refactors made to support the DLC — lands on the full player base. This means your full base game regression suite must pass before the DLC build ships, even for test scenarios that have nothing to do with the DLC content itself.
Build a checklist of the critical base game paths most likely to be affected by DLC-related code changes:
- Save and load across all major game states (beginning, mid-game, end-game, post-credits)
- Any system that the DLC extends (if DLC adds a crafting category, test base game crafting)
- Performance in the most demanding base game scenes (DLC content often adds assets that affect global memory budgets)
- All base game achievements, especially if the DLC adds new achievement hooks to shared systems
- Multiplayer or co-op functionality if applicable — version mismatches between DLC and non-DLC players need explicit handling
If you maintain automated tests, run them against the DLC build. If you rely on manual QA, assign a dedicated tester whose only job for the DLC release cycle is base game regression. This pass is not optional, regardless of schedule pressure.
Using Crash Reporting to Separate DLC Crashes from Base Game Crashes
After launch, you need to be able to answer this question quickly: is this crash from the DLC or the base game patch? Stack traces help, but the fastest answer comes from session context tags.
Before any DLC content loads, set a session property in Bugnet that indicates DLC state:
// Set early in DLC initialization, before any DLC assets load
Bugnet.SetSessionProperty("dlc_owned", true);
Bugnet.SetSessionProperty("dlc_version", "1.2.0");
Bugnet.SetSessionProperty("dlc_active", true); // set when player enters DLC content
This gives you three layers of filtering in the Bugnet dashboard. Crashes from players with dlc_owned=false are pure base game regressions from your patch. Crashes with dlc_owned=true but dlc_active=false might be base game regressions or DLC initialization issues. Crashes with dlc_active=true are likely DLC content bugs. The distinction matters for prioritization — base game regressions are P0 because they affect all players; DLC-specific crashes affect only buyers.
“The patch we shipped with our first DLC had a subtle bug in the save serializer that only surfaced when loading saves created in chapter 3. Because we had DLC session tagging in Bugnet, we could see immediately that the crash was happening in both DLC and non-DLC sessions — it was a base game regression, not a DLC bug. We had a hotfix live in four hours.”
DLC QA Test Matrix Summary
Here is a condensed test matrix to run before every DLC release:
- Entitlement check: DLC owner loads DLC content (pass), non-owner attempts access (graceful block), offline/throttled network entitlement (graceful fallback)
- Save forward compatibility: Load pre-DLC save with DLC installed, complete full session, save and reload
- Standalone DLC (if applicable): Full playthrough without base game installed or owned
- Content isolation: Non-DLC session after DLC patch — verify no DLC items, NPCs, or events leak into base game
- Base game regression: Full regression suite on DLC patch build using a non-DLC test account
- Crash reporting validation: Confirm Bugnet session tags are set correctly for DLC and non-DLC sessions
- Platform-specific DLC ownership: Test on each target platform using both owning and non-owning accounts