OmniNose

The Ultimate Test Smell Detector

A universal static analyzer that detects test smells in 16 programming languages using an unified Tree-sitter AST, semantic Lua profiles and canonical detection rules.

omninose analyze ./project --recursive
# omninose analyze ./smells --recursive

[ERROR]   sleepy_test      test_api.py:14
[WARNING] unknown_test     test_api.py:42
[WARNING] eager_test       test_api.py:57
[WARNING] print_statement test_ui.js:88
[ERROR]   resource_leak  test_db.rs:23

------------------------------------------------------------
Summary: 5 smells found (2 errors, 3 warnings)
Files analyzed: 128   Tests found: 412   Languages: 6
# the same report is available as JSON:
$ omninose analyze . --format json
About

About

OmniNose is a tool developed to automatically detect test smells in test code of 16 languages. It solves the M × N combinatorial problem (M languages × N smells) by splitting analysis into three decoupled layers — grammar, semantics and rules — so a single rule implementation works across every supported language.

  • ∞1 unified Tree-sitter AST
  • ▤16 language grammars
  • λSemantic profiles in Lua
  • ✓26 canonical test smells
OmniNose
RustEngine core
Tree-sitterParsing · 16 grammars
Lua 5.4Rules & profiles
TokioParallel + LSP
TopcoatWeb interface
MITOpen source
Features

Features

16

Polyglot Detection

C, C++, C#, Java, Go, Rust, Swift, Dart, JavaScript, TypeScript, TSX, Python, Ruby, Lua, PHP and Bash — all in a single run.

26

Test Smell Catalog

26 canonical smells from the JNose and DNose catalogs: sleepy test, eager test, assertion roulette, mystery guest, resource leak and more.

λ

Data-Driven Profiles

Each language has a languages/*.lua file declaring assertions, sleeps, resources and keywords — add a language without touching the rules.

⚙

LSP Enrichment

Optional Language Server Protocol integration adds diagnostics and symbol information to sharpen the analysis on real projects.

⇉

Parallel Analysis

Files are processed concurrently (one task per file) with bounded parallelism, delivering a deterministic, file-ordered report.

☰

CLI + Web UI

Use the CLI (analyze | list | web) with pretty or JSON output, or the Topcoat web interface served locally on port 3000.

Demonstration

Demonstration

We will quickly introduce how OmniNose works:

  • collect: recursively walks a file or directory and detects the language of each source file.
  • parse: builds a unified AstNode tree with Tree-sitter and loads the language semantic profile.
  • detect: selects the test nodes and runs the 26 Lua plugins, each reading ctx.ast, ctx.utils and ctx.profile.
  • report: aggregates deterministic findings in the console (ANSI) or as structured JSON; the web interface renders the results in a table.

Analyze a project with a single command:

$ omninose analyze path/to/project --recursive
$ omninose analyze path/to/project --format json
$ omninose web        # http://localhost:3000
$ omninose list       # shows the 26 available plugins

Structured JSON output:

{
  "project_dir": "./project",
  "findings": [
    {
      "smell": "sleepy_test",
      "severity": "error",
      "file": "test_api.py",
      "line": 14,
      "message": "contains 1 sleep/wait call"
    }
  ],
  "summary": { "files": 128, "tests": 412,
               "smells": 5, "errors": 2 }
}
Publications

Publications

★ VIRGINIO, T. G. A.; MARTINS, L. A.; SOARES, L. R.; SANTANA, R. S.; CRUZ, A. P. S.; COSTA, H. A. X.; MACHADO, I. C. JNose: Java Test Smell Detector. In: Simpósio Brasileiro de Engenharia de Software (SBES), 2020. XXXIV SBES - Trilha de Ferramentas, 2020.

★ VIRGINIO, T. G. A.; MARTINS, L. A.; SOARES, L. R.; SANTANA, R. S.; COSTA, H. A. X.; MACHADO, I. C. An empirical study of automatically-generated tests from the perspective of test smells. In: Simpósio Brasileiro de Engenharia de Software (SBES), 2020. XXXIV SBES, 2020.

★ VIRGÍNIO, TÁSSIO; SANTANA, RAILANA; MARTINS, LUANA ALMEIDA; SOARES, LARISSA ROCHA; COSTA, HEITOR; MACHADO, IVAN. On the influence of Test Smells on Test Coverage. In: XXXIII Brazilian Symposium on Software Engineering - SBES 2019, 2019. p. 467.

OmniNose is the evolution of this research line — JNose (Java) and DNose (Dart) — re-architected as a polyglot engine.

Development

OmniNose Development

Tassio Virginio

Tassio Virginio

Tech Leader
Ph.D. Candidate in Computer Science

OmniNose Test Tool

The OmniNose tool was designed by Tassio Virginio. It is one of the main contributions of his doctoral research in Computer Science from the Federal University of Bahia, supervised by Professor Dr. Ivan Machado, and builds directly on the JNose and DNose experiences.

The tool is part of a work developed by the research group Aries Lab at the Federal University of Bahia (UFBA).

Contact email: tassio.virginio@gmail.com

Contact

Contact

OmniNose is part of a work developed by the research group Aries Lab at the Federal University of Bahia (UFBA).

⌖

Our Address

Universidade Federal da Bahia

Institute of Mathematics and Statistics

Av. Adhemar de Barros, s/nº - Ondina

Salvador - BA, Brazil, 40170-110

✉

Aries Lab e-mail

arieslab@gmail.com

↑