PHPackages                             osinet/qa - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. osinet/qa

ActiveDrupal-module[Testing &amp; Quality](/categories/testing)

osinet/qa
=========

Quality Assurance tools for Drupal

2415[5 issues](https://github.com/OSInet/qa/issues)[2 PRs](https://github.com/OSInet/qa/pulls)PHP

Since Aug 16Pushed 3y ago1 watchersCompare

[ Source](https://github.com/OSInet/qa)[ Packagist](https://packagist.org/packages/osinet/qa)[ RSS](/packages/osinet-qa/feed)WikiDiscussions 8.x-1.x Synced today

READMEChangelogDependenciesVersions (4)Used By (0)

Quality Assurance module
========================

[](#quality-assurance-module)

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/dae0c07875b04a72ad5e31fee4f710f7a2b4315ec7f2823cf08ef281fd314f16/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4f53496e65742f71612f6261646765732f7175616c6974792d73636f72652e706e673f623d382e782d312e78)](https://scrutinizer-ci.com/g/OSInet/qa/?branch=8.x-1.x)

This module needs to be installed on your site to run checks on various aspects of your Drupal production database, configuration storage (D9/D8) and file layout.

It also has branches for D7 and D6, each running on the matching version.

*CAVEAT EMPTOR* - using this module and interpreting its results requires significant understanding of core operation: just because a check reports on suspicious data does not *imply* there is actually an problem, only that human review is needed. This tools is primarily designed to help professional auditors review sites; it is not meant for webmasters in the general case.

Built-in checks
---------------

[](#built-in-checks)

QA is designed to be extended by additional modules implementing control plugins.

CheckStatusDescriptionCache.SizesOKReport on cache bins with suspicious sizes: empty, too big, too many items, items too largeConfig.OverridesPlanFind config not matching its default value.Config.SchemaPlanFind config not matching its schema and schemaless configReferences.IntegrityOKFind broken references in `file`, `image`, `entity_reference`, `entity_reference_revisions`, and `dynamic_entity_reference` fieldsReferences.TaxonomyIndexOKFind broken links in the `taxonomy` relating nodes and taxonomy termsSystem.ExternalOKFind code loaded from directories outside the projectSystem.ForceRemovedTBPFind incorrectly removed extensionsSystem.UndeclaredDependenciesOKFind module dependencies not declared in `.info.yml` files.System.UnusedOKFind entirely unused projectsTaxonomy.FreetaggingTBPFind unused free-tagging terms.Workflows.SummaryOKSummarize content moderation workflowsWorkflows.TransitionsWIPFind inconsistent transitions- Plan: check is expected to be developed, but not yet started
- TBP: to be ported = check existing in earlier versions but not yet ported to D9/D8.
- WIP: work in progress.

QA also includes some non-check commands.

GraphStatusDescription`qa:dependencies`OKGraph of module and theme dependencies`qa:workflows-list`WIPGraph of workflow### Graphs

[](#graphs)

- dependency graph of enabled modules and themes, usable either on the Web UI for smaller sites or from drush for bigger graphs. This feature will generate GraphViz `.dot` files, to convert with Graphviz `dot` command, typically by piping the output like this:

```
      $ drush qa-dependencies | dot -Tsvg > qa_dependencies.svg
```

- On Drupal 8.3 and later, graphs of the transitions in a given workflow (for core workflows, not for the contrib workflow module). This feature will generate GraphViz `.dot` files, to convert with Graphviz `dot` command, typically by piping the output like this:

```
       $ drush qa_workflow_graph | dot -Tsvg > qa_workflow.svg
```

- The workflow graph also has a tabular version.

Copyright and license
---------------------

[](#copyright-and-license)

This module is © 2005-2020 [Frédéric G. MARAND](https://blog.riff.org/), for [OSInet](https://osinet.fr).

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Contributing
------------

[](#contributing)

Developing additional custom checks follows this process:

- create a custom module
- create a `QaCheck` plugin, which will implement `QaCheckInterface`, and likely be based on `QaCheckBase` for simplicity. Its properties are:
    - `id` : just like any Drupal plugin. The name should be like `.`, where `` will be used to group related packages in the UI. Plugins are expected to be located in the `Plugin\QaCheck\` directory, instead of being just in the `Plugin\QaCheck` directory.
    - `label`: the short description of the plugin, used in admin lists.
    - `details`: optional. A longer description of the plugin purpose, used for help in the Web UI. Default: empty.
    - `usesBatch`: optional. Enables use of the Batch API for long-running checks (WIP). Default: `false`.
    - `steps`: optional. The number of different steps reported by the check. Default: 1.
- add a command to `QaCommands`, calling `QaCommands::runPlugin($name)`.

Contributions are welcome: use Github issues and pull requests.

###  Health Score

17

—

LowBetter than 6% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity37

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/71aaa3a88679f828a7bc64acf1a235d392f38a97f5fe25dd6849813ef9306e33?d=identicon)[FGM](/maintainers/FGM)

---

Top Contributors

[![fgm](https://avatars.githubusercontent.com/u/143311?v=4)](https://github.com/fgm "fgm (78 commits)")

---

Tags

drupal-8drupal-9drupal-moduleqaquality-assurancestatic-analysis

### Embed Badge

![Health badge](/badges/osinet-qa/health.svg)

```
[![Health](https://phpackages.com/badges/osinet-qa/health.svg)](https://phpackages.com/packages/osinet-qa)
```

###  Alternatives

[dms/phpunit-arraysubset-asserts

This package provides ArraySubset and related asserts once deprecated in PHPUnit 8

14429.2M360](/packages/dms-phpunit-arraysubset-asserts)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
