gui/docs/ref/wails-v3/contributing/testing-ci.mdx
Snider 4bdbb68f46
Some checks failed
Security Scan / security (push) Failing after 9s
Test / test (push) Failing after 1m21s
refactor: update import path from go-config to core/config
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 10:26:36 +00:00

216 lines
5.5 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Testing & Continuous Integration
description: How Wails v3 ensures quality with unit tests, integration suites, race detection, and GitHub Actions CI.
sidebar:
order: 9
---
Robust desktop frameworks demand rock-solid testing.
Wails v3 employs a **layered strategy**:
| Layer | Goal | Tooling |
|-------|------|---------|
| Unit tests | Fast feedback for isolated functions | `go test ./...` |
| Integration / Example tests | Validate whole features across packages | Example apps + headless assertions |
| Race detection | Catch data races in the runtime & bridge | `go test -race`, `wails3 dev -race` |
| CI matrix | Cross-OS confidence on every PR | GitHub Actions |
This document explains **where tests live**, **how to run them**, and **what happens in CI**.
---
## 1. Directory Conventions
```
v3/
├── internal/.../_test.go # Unit tests for internal packages
├── pkg/.../_test.go # Public API tests
├── examples/... # Example apps double as integration tests
├── tasks/events/... # Generated code tests run in CI
└── pkg/application/RACE.md # Race test guidance & known safe suppressions
```
Guidelines:
* **Keep unit tests next to code** (`foo.go` ↔ `foo_test.go`)
* Use the **black-box style** for `pkg/` packages (`package application_test`)
* Integration helpers go in `internal/testutil/` (shared mocks, fixtures)
---
## 2. Unit Tests
### Writing Tests
```go
func TestColourParseHex(t *testing.T) {
c, err := colour.Parse("#FF00FF")
require.NoError(t, err)
assert.Equal(t, 255, c.R)
}
```
Recommendations:
* Use [`stretchr/testify`](https://github.com/stretchr/testify) already vendor-imported.
* Follow **table-driven** style for branches.
* Stub platform quirks behind build tags (`_test_windows.go` etc.) when needed.
### Running Locally
```bash
cd v3
go test ./... -cover
```
Taskfile shortcut:
```
task test # same as above + vet + lint
```
---
## 3. Integration & Example Tests
Every folder under `v3/examples/` is a **self-contained app**.
Three techniques turn them into tests:
| Technique | File | What it checks |
|-----------|------|----------------|
| `go test ./...` inside example | `*_test.go` spins up `wails dev` in headless mode | Build & startup |
| CLI golden tests | `internal/commands/appimage_test.go` | Generated artefact hashes |
| Scripted e2e | `tasks/events/generate.go` | Emits Go that launches example, asserts runtime logs |
Run all with:
```
task integration
```
> Headless mode uses **Xvfb** on Linux runners; macOS & Windows start minimized.
---
## 4. Race Detection
Data races are fatal in GUI runtimes.
### Dedicated Doc
See `v3/pkg/application/RACE.md` for:
* Known benign races and suppression rationale
* How to interpret stack-traces crossing Cgo boundaries
### Local Race Suite
```
go test -race ./...
```
or
```
wails3 dev -race
```
*The latter rebuilds runtime with race flags and launches a demo window.
Close the window; any races print after exit.*
CI runs the race suite on **linux/amd64** (fastest) for every PR.
---
## 5. GitHub Actions Workflows
### 5.1 `build-and-test-v3.yml`
Location: `.github/workflows/build-and-test-v3.yml`
Key features:
* **Matrix** over `os: [ubuntu-latest, windows-latest, macos-latest]`
* Caches Go & npm deps for speed
* Steps:
1. `setup-go` @ 1.25
2. `go vet ./...`
3. `go test ./... -v -coverprofile=cover.out`
4. Build CLI + sample app (`wails3 build -skip-package`)
5. Upload coverage to Codecov
* Conditional **race** job on Ubuntu:
```yaml
- name: Race Detector
if: matrix.os == 'ubuntu-latest'
run: go test -race ./...
```
### 5.2 Static Analysis
* `semgrep.yml` security/lint scanning (`.github/workflows/semgrep.yml`)
* `qodana.yaml` JetBrains Qodana cloud inspection (optional in PR)
### 5.3 Release Pipeline
`runtime.yml` builds and publishes the JS runtime to npm on tag push; out of testing scope but referenced by build matrix.
---
## 6. Local CI Parity
Run the **exact** CI task set via Taskfile:
```
task ci
```
It executes:
1. `lint` (golangci-lint, govet)
2. `test` (unit + race)
3. `integration`
4. `build` (for host platform)
---
## 7. Troubleshooting Failing Tests
| Symptom | Likely Cause | Fix |
|---------|--------------|-----|
| **Race in `runtime_darwin.go`** | Forgot to lock `mainthread.Call` | Use `mainthread.Sync` helper |
| **Windows headless hangs** | Console window waiting for input | Pass `-verbose` and ensure no dialogs open |
| **CI example build fails** | Template changed without bumping example deps | `task update-examples` regenerates lockfiles |
| **Coverpkg errors** | Integration test importing `main` | Switch to build tags `//go:build integration` |
---
## 8. Adding New Tests
1. **Unit** create `*_test.go`, run `go test ./...`
2. **Integration** update or add example app + test harness
3. **CI** commit; the workflow auto-discovers tests
If OS-specific, add skip tags:
```go
//go:build !windows
```
---
## 9. Key File Map
| What | Path |
|------|------|
| Unit test example | `internal/colour/colour_test.go` |
| Integration harness | `internal/commands/appimage_test.go` |
| Race guide | `pkg/application/RACE.md` |
| Taskfile test targets | `v3/Taskfile.yaml` |
| CI workflow | `.github/workflows/build-and-test-v3.yml` |
---
Quality isnt an afterthought in Wails v3.
With unit tests, integration suites, race detection, and a cross-platform CI
matrix you can contribute confidently, knowing your changes run green on every
OS we support.
Happy testing!