bcquality/community/knowledge/testing/initialize-function-pattern.md
2026-06-15 07:55:26 +08:00

1.5 KiB

bc-version domain keywords technologies countries application-area
all
testing
initialize
isinitialized
test-isolation
test-pollution
test-setup
libraryvariablestorage
al
w1
all

Test codeunit Initialize function must use an IsInitialized guard

Description

Every test codeunit should have a single Initialize() procedure called as the first statement in each [Test] function. Without an IsInitialized boolean guard, setup runs before every test — which is slow and causes side effects. Without Initialize() at all, setup logic gets duplicated across test functions and shared state bleeds between tests.

Best Practice

Declare IsInitialized as a boolean at codeunit scope. In Initialize(), call LibraryVariableStorage.Clear() first — it must run on every test call regardless of the guard. Then check if IsInitialized then exit. Run one-time setup after the guard, set IsInitialized := true, then call Commit(). Call Initialize() as the first statement in every [Test] procedure.

See sample: initialize-function-pattern.good.al.

Anti Pattern

Duplicating setup logic directly inside each test function, or calling Initialize() without the IsInitialized guard. Duplicated setup diverges silently when changed in one place. Omitting LibraryVariableStorage.Clear() leaves stale message handlers from prior tests, causing unrelated tests to fail intermittently.

See sample: initialize-function-pattern.bad.al.