Skip to main content

Test coverage detector — finds source files without tests, 9 languages

Project description

open-harness-testlens

Test coverage detector. Finds source files that don't have a corresponding test file, across 9 languages. Single native binary, zero runtime dependencies.

Part of the open-harness monorepo. Español abajo.

Same tool, other ecosystems: also available on npm (@open_harness/testlens) and on Packagist (open-harness/testlens). Identical binary, identical config; pick the registry that matches your stack.

Install

pip install open-harness-testlens

pip picks the right native wheel for your platform automatically (Linux x86_64, macOS arm64, macOS x86_64, Windows x86_64). Each wheel embeds the Go binary — no runtime deps.

Usage

testlens check                       # auto-detect language and scan
testlens check --lang typescript     # force a specific language
testlens check --dir ./src           # scan a specific directory
testlens check --config my.json      # use a specific config file
testlens check --fail                # exit 1 if files without tests are found
testlens init                        # generate a default config
testlens version                     # print version

Supported languages

Language Source extensions Test patterns
Go .go *_test.go
TypeScript .ts, .tsx *.test.ts, *.spec.ts, test_*.ts
JavaScript .js, .jsx *.test.js, *.spec.js, test_*.js
Python .py *_test.py, test_*.py
Ruby .rb *_spec.rb, *_test.rb
Rust .rs *_test.rs
Java .java *Test.java
Kotlin .kt, .kts *Test.kt
C# .cs *Tests.cs

Configuration

Place a testlens.json at the repo root:

{
  "language": "auto",
  "exclude": ["node_modules", ".git", "vendor", "dist", "build", "testdata"]
}
  • languageauto (default), go, typescript, javascript, python, ruby, rust, java, kotlin, csharp.
  • exclude — directories to skip during the scan.

Alternative: configure inside pyproject.toml or the dedicated testlens.json

If you prefer not to keep a separate testlens.json, add a testlens key in your package.json with the same shape:

{
  "name": "my-project",
  "testlens": {
    "language": "typescript",
    "exclude": ["node_modules", "dist", "fixtures"]
  }
}

Precedence: --config <path> > testlens.json > package.json key > built-in defaults. CLI flags win when passed explicitly (fs.Visit); if you don't pass --lang, the value from the config is used.

Why this exists

Coverage tools tell you which lines are tested. testlens tells you which files have no test at all — a different and complementary check. It surfaces orphan modules early, when adding a first test is cheapest. Combine both for a complete picture.

Integrations

# Husky pre-commit
testlens check --fail
# GitHub Actions
- name: Detect source files without tests
  run: npx @open_harness/testlens check --fail --lang typescript --dir src/

Exit codes

Code Meaning
0 All source files have tests (or --fail not passed)
1 Files without tests found and --fail was passed, or config error

Español

Detector de cobertura de tests. Encuentra archivos fuente que no tienen un archivo de test correspondiente, en 9 lenguajes. Un solo binario nativo, cero dependencias.

Parte del monorepo open-harness.

Instalación

pip install open-harness-testlens

pip descarga automáticamente la wheel nativa correcta para tu plataforma.

Uso

testlens check                       # autodetecta lenguaje y escanea
testlens check --lang typescript     # fuerza un lenguaje específico
testlens check --dir ./src           # escanea un directorio específico
testlens check --config my.json      # usa un archivo de config específico
testlens check --fail                # exit 1 si hay archivos sin test
testlens init                        # genera la config por defecto
testlens version                     # imprime la versión

Lenguajes soportados

Go, TypeScript, JavaScript, Python, Ruby, Rust, Java, Kotlin, C#. Ver la tabla arriba para las extensiones y patrones de naming de test que reconoce cada uno.

Configuración

Colocá un testlens.json en la raíz del repo (ver ejemplo arriba).

  • languageauto (default), go, typescript, javascript, python, ruby, rust, java, kotlin, csharp.
  • exclude — directorios a ignorar durante el escaneo.

Alternativa: configurar dentro de pyproject.toml o testlens.json

Si preferís no tener un testlens.json separado, agregá una key testlens en tu package.json con la misma forma. Precedencia: --config <path> > testlens.json > key en package.json > defaults. Los flags CLI ganan solo cuando se pasan explícitamente; si omitís --lang, se usa el valor de la config.

Por qué existe

Las herramientas tradicionales de cobertura te dicen qué líneas están testeadas. testlens te dice qué archivos no tienen ningún test — una verificación distinta y complementaria. Detecta módulos huérfanos temprano, cuando agregar el primer test es más barato. Combinalos para tener una vista completa.

Integraciones

Sirve con Husky, lefthook o GitHub Actions usando los snippets de la sección en inglés.

Códigos de salida

Código Significado
0 Todos los archivos fuente tienen tests (o no se pasó --fail)
1 Hay archivos sin test con --fail, o error de configuración

License

MIT — see the main repository.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

open_harness_testlens-0.2.1-py3-none-win_amd64.whl (1.7 MB view details)

Uploaded Python 3Windows x86-64

open_harness_testlens-0.2.1-py3-none-macosx_11_0_arm64.whl (803.2 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

open_harness_testlens-0.2.1-py3-none-macosx_10_9_x86_64.whl (848.0 kB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file open_harness_testlens-0.2.1-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for open_harness_testlens-0.2.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bf071cc74be28b1144c8161f34b4b724795742f8fbd5b757a29fa6aaf5e8d179
MD5 ec08f04b4105c569c84302700662a09c
BLAKE2b-256 c0c39aa0953aa15088b6c6c8dbb56d1ace15eb95d719214782ed461856bb1ee5

See more details on using hashes here.

File details

Details for the file open_harness_testlens-0.2.1-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for open_harness_testlens-0.2.1-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7ce7b43783c1c5d8afaeadb2881b6ad96968d54ee8dc8f88201a0b1fcb9ebd83
MD5 0286c712ed46b981f8ba0aae11a33636
BLAKE2b-256 cdee23733be5457498262162c960bb42abfa205724693210324417e0f2c1ebce

See more details on using hashes here.

File details

Details for the file open_harness_testlens-0.2.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for open_harness_testlens-0.2.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e11bee39d9fed1197144cad813f882ef4cdee1c7a504e55f829d1f188c7b7bb5
MD5 5ae183976891253a2e8e8308408e201f
BLAKE2b-256 4b4e13b231ff67f0ec49fa2b5c6fd56212f7a290d2692352f8f50001c474adfc

See more details on using hashes here.

File details

Details for the file open_harness_testlens-0.2.1-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for open_harness_testlens-0.2.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fd7d1ce3d5ecb47d138c889dc0522d4521b7a69e51b5c797443937e803342c42
MD5 77fcb13421c02e2a9f9af11ada66ba94
BLAKE2b-256 8e48ef7bd319a4bd4a8c184dd6e1ca4bd37406c69e006cb8d46191b7e44821a8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page