Skip to content

Commit 2560486

Browse files
authored
test(bats): generate coverage info during end-to-end tests (#61)
test(bats): generate coverage info during end-to-end tests For the bats-test target, build and use a specific binary with the -cover option For the test target, generate coverage information in the same directory as e2e with test.gocoverdir Add a separate github job to generate coverage information Signed-off-by: Daniel Vérité <[email protected]>
1 parent 350ce6e commit 2560486

File tree

8 files changed

+132
-48
lines changed

8 files changed

+132
-48
lines changed

.github/workflows/test.yaml

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,7 @@ jobs:
2727
run: make build
2828
- name: Run Go tests
2929
run: make test
30-
- name: Code Coverage Report
31-
uses: irongut/[email protected]
32-
with:
33-
filename: coverage.xml
34-
badge: true
35-
fail_below_min: false
36-
format: markdown
37-
hide_branch_rate: false
38-
hide_complexity: true
39-
indicators: true
40-
output: both
41-
thresholds: '60 80'
42-
- uses: jwalton/gh-find-current-pr@v1
43-
id: finder
44-
- name: Add Coverage PR Comment
45-
uses: marocchino/sticky-pull-request-comment@v2
46-
with:
47-
number: ${{ steps.finder.outputs.pr }}
48-
path: code-coverage-results.md
49-
recreate: true
30+
5031
- name: Upload artifact
5132
uses: actions/upload-artifact@v4
5233
with:
@@ -156,6 +137,75 @@ jobs:
156137
- name: Run Debian package tests
157138
run: make debian-test-ci
158139

140+
coverage:
141+
name: Test Coverage
142+
needs: go
143+
runs-on: ubuntu-latest
144+
permissions:
145+
contents: read
146+
pull-requests: write
147+
env:
148+
BATS_LIB_PATH: "${{ github.workspace }}/test/bats/lib/"
149+
PGHOST: localhost
150+
PGUSER: postgres
151+
PGPASSWORD: hackme
152+
PGDATABASE: unittest
153+
services:
154+
postgres:
155+
image: postgres:14
156+
options: >-
157+
--health-cmd pg_isready
158+
--health-interval 10s
159+
--health-timeout 5s
160+
--health-retries 5
161+
--hostname postgres
162+
env:
163+
POSTGRES_PASSWORD: hackme
164+
ports:
165+
- 5432:5432
166+
steps:
167+
- uses: actions/checkout@v4
168+
- uses: actions/setup-go@v5
169+
with:
170+
go-version: '1.21'
171+
- name: Install dependencies
172+
run: |
173+
go get .
174+
- name: Build
175+
run: make build
176+
177+
- name: Setup Bats and bats libs
178+
uses: bats-core/[email protected]
179+
with:
180+
support-path: ${{ github.workspace }}/test/bats/lib/bats-support
181+
assert-path: ${{ github.workspace }}/test/bats/lib/bats-assert
182+
file-install: false # Unused
183+
detik-install: false # Unused
184+
185+
- name: Run Go and e2e tests
186+
run: make coverage
187+
188+
- name: Code Coverage Report
189+
uses: irongut/[email protected]
190+
with:
191+
filename: coverage.xml
192+
badge: true
193+
fail_below_min: false
194+
format: markdown
195+
hide_branch_rate: false
196+
hide_complexity: true
197+
indicators: true
198+
output: both
199+
thresholds: '60 80'
200+
- uses: jwalton/gh-find-current-pr@v1
201+
id: finder
202+
- name: Add Coverage PR Comment
203+
uses: marocchino/sticky-pull-request-comment@v2
204+
with:
205+
number: ${{ steps.finder.outputs.pr }}
206+
path: code-coverage-results.md
207+
recreate: true
208+
159209
# checkcov:
160210
# permissions:
161211
# security-events: write # for github/codeql-action/upload-sarif to upload SARIF results

Makefile

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ BUILD_INFO_PACKAGE_PATH=github.com/qonto/postgresql-partition-manager/internal/i
33
BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
44
GIT_COMMIT_SHA=$(shell git rev-parse HEAD)
55
BINARY=postgresql-partition-manager
6+
COVER_BINARY=test-postgresql-partition-manager
67
ARCHITECTURE=$(shell uname -m)
78
HELM_CHART_NAME=postgresql-partition-manager-chart
89
RELEASE_VERSION=$(shell jq .tag dist/metadata.json)
@@ -18,6 +19,23 @@ format:
1819
build:
1920
CGO_ENABLED=0 go build -v -ldflags="-X '$(BUILD_INFO_PACKAGE_PATH).Version=development' -X '$(BUILD_INFO_PACKAGE_PATH).CommitSHA=$(GIT_COMMIT_SHA)' -X '$(BUILD_INFO_PACKAGE_PATH).Date=$(BUILD_DATE)'" -o $(BINARY)
2021

22+
coverage: $(COVER_BINARY)
23+
test -d ./coverage-data || mkdir ./coverage-data
24+
rm -f ./coverage-data/cov*
25+
# run tests with the testing package
26+
go test -v ./... -cover -test.gocoverdir=$(PWD)/coverage-data -covermode set
27+
# run e2e test collecting coverage data
28+
cd scripts/bats && GOCOVERDIR=$(PWD)/coverage-data bats *.bats
29+
# merge the collected traces
30+
go tool covdata textfmt -i=./coverage-data -o coverage.txt
31+
go run github.com/boumenot/gocover-cobertura@latest < coverage.txt > coverage.xml
32+
go tool cover -html coverage.txt -o cover.html
33+
34+
35+
# build for coverage
36+
$(COVER_BINARY): build
37+
CGO_ENABLED=0 go build -cover -v -ldflags="-X '$(BUILD_INFO_PACKAGE_PATH).Version=development' -X '$(BUILD_INFO_PACKAGE_PATH).CommitSHA=$(GIT_COMMIT_SHA)' -X '$(BUILD_INFO_PACKAGE_PATH).Date=$(BUILD_DATE)'" -o $(COVER_BINARY)
38+
2139
.PHONY: run
2240
run:
2341
./$(BINARY) $(args)
@@ -27,8 +45,9 @@ install: build
2745
GOBIN=/usr/local/bin/ go install -v -ldflags="-X '$(BUILD_INFO_PACKAGE_PATH).Version=development' -X '$(BUILD_INFO_PACKAGE_PATH).CommitSHA=$(GIT_COMMIT_SHA)' -X '$(BUILD_INFO_PACKAGE_PATH).Date=$(BUILD_DATE)'"
2846

2947
.PHONY: bats-test
30-
bats-test:
31-
cd scripts/bats && bats *.bats
48+
bats-test: build $(COVER_BINARY)
49+
test -d ./coverage-data || mkdir ./coverage-data
50+
cd scripts/bats && GOCOVERDIR=$(PWD)/coverage-data bats *.bats
3251

3352
.PHONY: helm-test
3453
helm-test:
@@ -60,9 +79,8 @@ checkcov:
6079

6180
.PHONY: test
6281
test:
63-
go test -race -v ./... -coverprofile=coverage.txt -covermode atomic
64-
go run github.com/boumenot/gocover-cobertura@latest < coverage.txt > coverage.xml
65-
go tool cover -html coverage.txt -o cover.html
82+
test -d ./coverage-data || mkdir ./coverage-data
83+
go test -v ./... -cover -test.gocoverdir=$(PWD)/coverage-data -covermode set
6684

6785
.PHONY: lint
6886
lint:

scripts/bats/00_cli.bats

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1+
load 'test/libs/startup'
2+
13
setup() {
2-
bats_load_library bats-support
3-
bats_load_library bats-assert
4+
bats_load_library bats-support
5+
bats_load_library bats-assert
6+
ppm_setup
47
}
58

69
@test "Test returns its version" {
7-
run postgresql-partition-manager --version
10+
run "$PPM_PROG" --version
811

912
assert_success
1013
assert_output --partial "postgresql-partition-manager version development"
1114
}
1215

1316
@test "Test help message" {
14-
run postgresql-partition-manager --help
17+
run "$PPM_PROG" --help
1518

1619
assert_success
1720
assert_output --partial "Simplified PostgreSQL partitioning management"

scripts/bats/10_validate.bats

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
load 'test/libs/startup'
2+
13
setup() {
24
bats_load_library bats-support
35
bats_load_library bats-assert
6+
ppm_setup
47
}
58

69
# Test for program's behavior when the configuration file is empty
710
@test "Program should exit when passed an empty configuration file" {
8-
run postgresql-partition-manager validate -c /dev/null
11+
run "$PPM_PROG" validate -c /dev/null
912

1013
assert_failure
1114
assert_equal "$status" 1
@@ -15,7 +18,7 @@ setup() {
1518
}
1619

1720
@test "Ensure validate command executes successfully with a valid configuration file" {
18-
run postgresql-partition-manager validate -c configuration/valid.yaml
21+
run "$PPM_PROG" validate -c configuration/valid.yaml
1922

2023
assert_success
2124
assert_output --partial "Configuration is valid"

scripts/bats/20_check.bats

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
load 'test/libs/startup'
12
load 'test/libs/dependencies'
23
load 'test/libs/partitions'
34
load 'test/libs/seeds'
@@ -10,10 +11,11 @@ setup_file() {
1011
setup() {
1112
bats_load_library bats-support
1213
bats_load_library bats-assert
14+
ppm_setup
1315
}
1416

1517
@test "Test exit code on PostgreSQL connection error" {
16-
run postgresql-partition-manager run check -c configuration/valid.yaml --connection-url an-invalid-connection-url
18+
run "$PPM_PROG" run check -c configuration/valid.yaml --connection-url an-invalid-connection-url
1719

1820
assert_failure
1921
assert_equal "$status" 3
@@ -43,7 +45,7 @@ EOF
4345
)
4446
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
4547

46-
run postgresql-partition-manager run check -c ${CONFIGURATION_FILE}
48+
run "$PPM_PROG" run check -c ${CONFIGURATION_FILE}
4749

4850
assert_success
4951
assert_output --partial "All partitions are correctly configured"
@@ -73,7 +75,7 @@ EOF
7375
)
7476
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
7577

76-
run postgresql-partition-manager run check -c ${CONFIGURATION_FILE}
78+
run "$PPM_PROG" run check -c ${CONFIGURATION_FILE}
7779

7880
assert_failure
7981
assert_output --partial "Found missing tables"
@@ -103,7 +105,7 @@ EOF
103105
)
104106
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
105107

106-
run postgresql-partition-manager run check -c ${CONFIGURATION_FILE}
108+
run "$PPM_PROG" run check -c ${CONFIGURATION_FILE}
107109

108110
assert_failure
109111
assert_output --partial "Found missing tables"
@@ -141,7 +143,7 @@ EOF
141143
)
142144
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
143145

144-
PPM_WORK_DATE="2025-02-10" run postgresql-partition-manager run check -c ${CONFIGURATION_FILE}
146+
PPM_WORK_DATE="2025-02-10" run "$PPM_PROG" run check -c ${CONFIGURATION_FILE}
145147

146148
assert_success
147149
assert_output --partial "All partitions are correctly configured"

scripts/bats/30_provisioning.bats

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
load 'test/libs/startup'
12
load 'test/libs/dependencies'
23
load 'test/libs/partitions'
34
load 'test/libs/seeds'
@@ -11,6 +12,7 @@ setup_file() {
1112
setup() {
1213
bats_load_library bats-support
1314
bats_load_library bats-assert
15+
ppm_setup
1416
}
1517

1618
@test "Test that provisioning succeed on up-to-date partitioning" {
@@ -36,7 +38,7 @@ EOF
3638
)
3739
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
3840

39-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
41+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
4042

4143
assert_success
4244
assert_output --partial "All partitions are correctly provisioned"
@@ -68,7 +70,7 @@ EOF
6870
)
6971
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
7072

71-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
73+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
7274

7375
assert_success
7476
assert_output --partial "All partitions are correctly provisioned"
@@ -82,7 +84,7 @@ EOF
8284
yq eval ".partitions.unittest.retention = ${NEW_RETENTION}" -i ${CONFIGURATION_FILE}
8385
yq eval ".partitions.unittest.preProvisioned = ${NEW_PREPROVISIONED}" -i ${CONFIGURATION_FILE}
8486

85-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
87+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
8688

8789
assert_success
8890
assert_output --partial "All partitions are correctly provisioned"
@@ -118,7 +120,7 @@ EOF
118120

119121
cat ${CONFIGURATION_FILE}
120122

121-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
123+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
122124

123125
assert_success
124126
assert_output --partial "All partitions are correctly provisioned"
@@ -153,7 +155,7 @@ EOF
153155
)
154156
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
155157

156-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
158+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
157159

158160

159161
assert_success
@@ -189,7 +191,7 @@ EOF
189191
)
190192
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
191193

192-
run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
194+
run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
193195

194196
assert_success
195197
assert_output --partial "All partitions are correctly provisioned"
@@ -222,7 +224,7 @@ EOF
222224
)
223225
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
224226

225-
PPM_WORK_DATE="2025-01-20" run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
227+
PPM_WORK_DATE="2025-01-20" run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
226228
assert_success
227229
assert_output --partial "All partitions are correctly provisioned"
228230

@@ -242,7 +244,7 @@ EOF
242244
yq eval ".partitions.unittest.retention = 2" -i ${CONFIGURATION_FILE}
243245
yq eval ".partitions.unittest.preProvisioned = 10" -i ${CONFIGURATION_FILE}
244246

245-
PPM_WORK_DATE="2025-02-01" run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
247+
PPM_WORK_DATE="2025-02-01" run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
246248
assert_success
247249

248250
local expected_mix=$(cat <<EOF
@@ -290,7 +292,7 @@ EOF
290292
create_partitioned_table "table_unittest1"
291293
create_partitioned_table "table_unittest2"
292294

293-
PPM_WORK_DATE="2025-02-01" run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
295+
PPM_WORK_DATE="2025-02-01" run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
294296
assert_success
295297

296298
local expected1=$(cat <<'EOF'
@@ -344,7 +346,7 @@ EOF
344346

345347
create_partitioned_table "${TABLE}"
346348

347-
PPM_WORK_DATE="2025-02-01" run postgresql-partition-manager run provisioning -c ${CONFIGURATION_FILE}
349+
PPM_WORK_DATE="2025-02-01" run "$PPM_PROG" run provisioning -c ${CONFIGURATION_FILE}
348350

349351
# The status must reflect the fact that one partition set failed
350352
[ "$status" -eq 4 ] # PartitionsProvisioningFailedExitCode

scripts/bats/40_cleanup.bats

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
load 'test/libs/startup'
12
load 'test/libs/dependencies'
23
load 'test/libs/partitions'
34
load 'test/libs/seeds'
@@ -10,6 +11,7 @@ setup_file() {
1011
setup() {
1112
bats_load_library bats-support
1213
bats_load_library bats-assert
14+
ppm_setup
1315
}
1416

1517
@test "Test that useless partitions are removed by the cleanup" {
@@ -46,7 +48,7 @@ EOF
4648
)
4749
local CONFIGURATION_FILE=$(generate_configuration_file "${CONFIGURATION}")
4850

49-
run postgresql-partition-manager run cleanup -c ${CONFIGURATION_FILE}
51+
run "$PPM_PROG" run cleanup -c ${CONFIGURATION_FILE}
5052

5153
assert_success
5254
assert_output --partial "All partitions are cleaned"
@@ -99,7 +101,7 @@ EOF
99101
# When run on 2025-03-15 with a retention of 1 month, the partition for 2024-12
100102
# is old enough to be dropped. But since 2025-01 is missing, it is an error that
101103
# should prevent the drop.
102-
PPM_WORK_DATE="2025-03-15" run postgresql-partition-manager run cleanup -c ${CONFIGURATION_FILE}
104+
PPM_WORK_DATE="2025-03-15" run "$PPM_PROG" run cleanup -c ${CONFIGURATION_FILE}
103105

104106
assert_failure
105107
assert_output --partial 'level=ERROR msg="Partition Gap"'

0 commit comments

Comments
 (0)