Write Artemis tests
SkillDev toolsWrite or debug Artemis JUnit and Vitest tests, including failures that differ between local runs and CI.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Write Artemis tests skill
What this skill tells your AI
The instructions your AI receives, as published by ls1intum/artemis in skills/write-tests/SKILL.md and read by ahel’s review.
Server tests
Server tests need Docker. They run against PostgreSQL through Testcontainers, locally and in CI.
./gradlew test -x webapp # everything
./gradlew test --tests ExamIntegrationTest -x webapp # one class
./gradlew test --tests ExamIntegrationTest.testGetExamScore # one method
./gradlew test -DincludeTags='ArchitectureTest' -x webapp # architecture only, fast
Name tests *Test.java. Reuse the module's base class where one exists.
Read reference/server.md for base class selection, the admin naming rule that forces a different
@ResourceLock, date comparison, and shared-spy flakiness.
In the admin module, naming a test *IntegrationTest forces it
onto a batch base class carrying a shared @ResourceLock. A test that mutates global state and
needs isolation must be named *Test and extend AbstractSpringIntegrationIndependentTest
instead. Enforced by
src/test/java/de/tum/cit/aet/artemis/admin/architecture/AdminTestArchitectureTest.java.
Client tests
Vitest, not Jest. Use vi.spyOn(), vi.fn(), vi.clearAllMocks().
pnpm run vitest # watch
pnpm run vitest:run # single run, everything
pnpm exec vitest run <path/to/spec.ts> # single file
pnpm run vitest:coverage
pnpm run test-diff # only specs affected by the diff
pnpm run vitest:run -- <path> runs the entire suite. The path is swallowed. Use
pnpm exec vitest run <path> for a single file.
Vitest is not the type check CI runs. CI runs a stricter spec tsc:
pnpm run compile:tests
It enforces member visibility, which Vitest does not. A spec that reaches a private member as
component.privateThing passes locally and fails in CI. Use bracket access,
component['privateThing'], and run compile:tests before pushing.
Test a directive with TestBed.createDirective, not a throwaway host component. Keep a host
only when the directive is structural or needs a template around it: something around or beside
it, content Angular keeps rendering inside it, a static attribute its constructor reads, or an input
that takes a TemplateRef or a component instance from the same template. Input bindings apply
on the first detectChanges().
Read reference/client.md for the rest: the createDirective pattern and its limits, the monaco
stub, zoneless test setup, model() versus input() plus output(), and why template errors need
a build rather than a test run.
Both
Keep tests deterministic. Mock external services and WebSockets. CI enforces per-module coverage thresholds, so a new class with no test can fail the build even when nothing is broken.
For E2E tests, see skills/e2e-pr-check/SKILL.md. Do not add a Playwright test for behavior
that a unit or integration test can cover.
Signals
- GitHub stars
- 813
- Forks
- 396
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
write-tests-ls1intum- Source
- github.com/ls1intum/artemis