feat: added code coverage reporting (#9081)
* added code coverage reporting * fix issues * more cleanup * fix action configs * cleanup token debug * added comments to codecov.yml config --------- Co-authored-by: Edwin Jose <edwin.jose@datastax.com>
This commit is contained in:
parent
ca595ac7fb
commit
65a977cba2
4 changed files with 128 additions and 1 deletions
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
|
|
@ -171,12 +171,15 @@ jobs:
|
||||||
secrets:
|
secrets:
|
||||||
OPENAI_API_KEY: "${{ secrets.OPENAI_API_KEY }}"
|
OPENAI_API_KEY: "${{ secrets.OPENAI_API_KEY }}"
|
||||||
ANTHROPIC_API_KEY: "${{ secrets.ANTHROPIC_API_KEY }}"
|
ANTHROPIC_API_KEY: "${{ secrets.ANTHROPIC_API_KEY }}"
|
||||||
|
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
|
||||||
|
|
||||||
test-frontend-unit:
|
test-frontend-unit:
|
||||||
needs: [path-filter, set-ci-condition]
|
needs: [path-filter, set-ci-condition]
|
||||||
name: Run Frontend Unit Tests
|
name: Run Frontend Unit Tests
|
||||||
if: ${{ needs.path-filter.outputs.frontend == 'true' && needs.set-ci-condition.outputs.should-run-tests == 'true' }}
|
if: ${{ needs.path-filter.outputs.frontend == 'true' && needs.set-ci-condition.outputs.should-run-tests == 'true' }}
|
||||||
uses: ./.github/workflows/jest_test.yml
|
uses: ./.github/workflows/jest_test.yml
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
|
||||||
|
|
||||||
test-frontend:
|
test-frontend:
|
||||||
needs: [path-filter, set-ci-condition]
|
needs: [path-filter, set-ci-condition]
|
||||||
|
|
|
||||||
13
.github/workflows/jest_test.yml
vendored
13
.github/workflows/jest_test.yml
vendored
|
|
@ -2,6 +2,9 @@ name: Run Frontend Jest Unit Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN:
|
||||||
|
required: false
|
||||||
inputs:
|
inputs:
|
||||||
ref:
|
ref:
|
||||||
description: "(Optional) ref to checkout"
|
description: "(Optional) ref to checkout"
|
||||||
|
|
@ -65,6 +68,16 @@ jobs:
|
||||||
junitxml-title: Unit Test Results
|
junitxml-title: Unit Test Results
|
||||||
junitxml-path: src/frontend/test-results/junit.xml
|
junitxml-path: src/frontend/test-results/junit.xml
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
files: src/frontend/coverage/lcov.info
|
||||||
|
flags: frontend
|
||||||
|
name: frontend-coverage
|
||||||
|
fail_ci_if_error: false
|
||||||
|
directory: src/frontend/coverage/
|
||||||
|
|
||||||
- name: Upload Coverage Reports
|
- name: Upload Coverage Reports
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
|
|
|
||||||
28
.github/workflows/python_test.yml
vendored
28
.github/workflows/python_test.yml
vendored
|
|
@ -7,6 +7,8 @@ on:
|
||||||
required: true
|
required: true
|
||||||
ANTHROPIC_API_KEY:
|
ANTHROPIC_API_KEY:
|
||||||
required: true
|
required: true
|
||||||
|
CODECOV_TOKEN:
|
||||||
|
required: false
|
||||||
inputs:
|
inputs:
|
||||||
python-versions:
|
python-versions:
|
||||||
description: "(Optional) Python versions to test"
|
description: "(Optional) Python versions to test"
|
||||||
|
|
@ -50,11 +52,13 @@ jobs:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.ref || github.ref }}
|
ref: ${{ inputs.ref || github.ref }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
id: setup-node
|
id: setup-node
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
|
||||||
- name: "Setup Environment"
|
- name: "Setup Environment"
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v6
|
||||||
with:
|
with:
|
||||||
|
|
@ -62,15 +66,37 @@ jobs:
|
||||||
cache-dependency-glob: "uv.lock"
|
cache-dependency-glob: "uv.lock"
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
prune-cache: false
|
prune-cache: false
|
||||||
|
|
||||||
- name: Install the project
|
- name: Install the project
|
||||||
run: uv sync
|
run: uv sync
|
||||||
|
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
uses: nick-fields/retry@v3
|
uses: nick-fields/retry@v3
|
||||||
with:
|
with:
|
||||||
timeout_minutes: 12
|
timeout_minutes: 12
|
||||||
max_attempts: 2
|
max_attempts: 2
|
||||||
command: make unit_tests args="-x -vv --splits ${{ matrix.splitCount }} --group ${{ matrix.group }} --reruns 5"
|
command: make unit_tests args="-x -vv --splits ${{ matrix.splitCount }} --group ${{ matrix.group }} --reruns 5 --cov --cov-report=xml --cov-report=html"
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
if: matrix.python-version == '3.10'
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
files: ./coverage.xml
|
||||||
|
flags: backend
|
||||||
|
name: backend-coverage-group-${{ matrix.group }}
|
||||||
|
fail_ci_if_error: false
|
||||||
|
directory: ./
|
||||||
|
|
||||||
|
- name: Upload coverage artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: matrix.python-version == '3.10'
|
||||||
|
with:
|
||||||
|
name: backend-coverage-report-group-${{ matrix.group }}
|
||||||
|
path: |
|
||||||
|
coverage.xml
|
||||||
|
htmlcov/
|
||||||
|
retention-days: 30
|
||||||
|
|
||||||
|
|
||||||
integration-tests:
|
integration-tests:
|
||||||
|
|
|
||||||
85
codecov.yml
Normal file
85
codecov.yml
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
codecov:
|
||||||
|
# Don't block CI if codecov fails to process reports
|
||||||
|
require_ci_to_pass: false
|
||||||
|
notify:
|
||||||
|
after_n_builds: 1 # Comment after each report (don't wait for all)
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
# Display range from 30-100% to provide meaningful color gradients
|
||||||
|
range: "30...100"
|
||||||
|
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
# Overall project coverage target
|
||||||
|
default:
|
||||||
|
target: 60%
|
||||||
|
threshold: 3%
|
||||||
|
|
||||||
|
# Backend coverage strategy: Aspirational target for progress tracking
|
||||||
|
# Current coverage: ~33%, Target: 55% (intentionally higher than current)
|
||||||
|
# This creates visual progress indicators (red->yellow->green) without blocking PRs
|
||||||
|
# Shows improvement over time while encouraging better test coverage
|
||||||
|
backend:
|
||||||
|
target: 55%
|
||||||
|
# Threshold: Allowable drop in coverage before failing the check
|
||||||
|
# 5% = coverage can drop from 33% to 28% without failing status
|
||||||
|
# Higher threshold to avoid blocking PRs during improvement phase
|
||||||
|
threshold: 5%
|
||||||
|
flags:
|
||||||
|
- backend
|
||||||
|
|
||||||
|
# Frontend coverage: Realistic target based on current state
|
||||||
|
# Current coverage: ~70%, maintains existing high standards
|
||||||
|
frontend:
|
||||||
|
target: 70%
|
||||||
|
# Threshold: Allowable drop in coverage before failing the check
|
||||||
|
# 2% = coverage can drop from 70% to 68% without failing status
|
||||||
|
# Stricter threshold to maintain established quality standards
|
||||||
|
threshold: 2%
|
||||||
|
flags:
|
||||||
|
- frontend
|
||||||
|
|
||||||
|
# New code coverage requirements - encourages well-tested new features
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 70%
|
||||||
|
threshold: 3%
|
||||||
|
|
||||||
|
# PR comment configuration - what information to show in coverage reports
|
||||||
|
comment:
|
||||||
|
layout: "reach,diff,flags,tree" # Show coverage, changes, flags, and file tree
|
||||||
|
behavior: default
|
||||||
|
require_changes: false # Comment even if no changes
|
||||||
|
require_base: false # Don't require base branch comparison
|
||||||
|
require_head: true # Require current branch coverage
|
||||||
|
|
||||||
|
# Define separate coverage tracking for frontend and backend
|
||||||
|
flags:
|
||||||
|
backend:
|
||||||
|
paths:
|
||||||
|
- src/backend/
|
||||||
|
carryforward: true # Preserve coverage data across builds if missing
|
||||||
|
frontend:
|
||||||
|
paths:
|
||||||
|
- src/frontend/
|
||||||
|
carryforward: true # Preserve coverage data across builds if missing
|
||||||
|
|
||||||
|
# Files/directories to exclude from coverage calculations
|
||||||
|
ignore:
|
||||||
|
# Database migrations - infrastructure code, not business logic
|
||||||
|
- "src/backend/base/langflow/alembic/**"
|
||||||
|
# Test files themselves don't need coverage
|
||||||
|
- "src/backend/tests/**"
|
||||||
|
- "src/frontend/tests/**"
|
||||||
|
- "src/frontend/test-results/**"
|
||||||
|
# Build artifacts and dependencies
|
||||||
|
- "**/__pycache__/**"
|
||||||
|
- "**/*.pyc"
|
||||||
|
- "**/node_modules/**"
|
||||||
|
- "**/coverage/**"
|
||||||
|
# Python package init files - typically just imports
|
||||||
|
- "**/__init__.py"
|
||||||
|
# Database migrations
|
||||||
|
- "**/migrations/**"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue