Testen
======
Builds und Links
----------------
.. _build-errors:
Build-Fehler
~~~~~~~~~~~~
Ihr habt die Möglichkeit, vor der Veröffentlichung eurer Änderungen zu
überprüfen, ob eure Inhalte ordnungsgemäß erstellt werden. Hierfür hat
`Sphinx `_ einen pingelig (:abbr:`engl.
(englisch)` nitpicky)-Modus, der mit der Option ``-n`` aufgerufen werden kann,
also :abbr:`z.B. (zum Beispiel)` mit:
.. tab:: Linux/macOS
.. code-block:: console
$ python -m sphinx -nb html docs/ docs/_build/
.. tab:: Windows
.. code-block:: ps1con
C:> python -m sphinx -nb html docs\ docs\_build\
.. _link-checks:
Links
~~~~~
Ihr könnt auch automatisiert sicherstellen, dass die von euch angegebenen
Linkziele erreichbar sind. Unser Dokumentationswerkzeug Sphinx verwendet hierfür
einen ``linkcheck``-Builder, den ihr :abbr:`ggf. (gegebenenfalls)` aufrufen
könnt mit:
.. tab:: Linux/macOS
.. code-block:: console
$ python -m sphinx -b linkcheck docs/ docs/_build/
.. tab:: Windows
.. code-block:: ps1con
C:> python -m sphinx -b linkcheck docs\ docs\_build\
Die Ausgabe kann dann :abbr:`z.B. (zum Beispiel)` so aussehen:
.. tab:: Linux/macOS
.. code-block:: console
$ python -m sphinx -b linkcheck docs/ docs/_build/
Running Sphinx v3.5.2
loading translations [de]... done
…
building [mo]: targets for 0 po files that are out of date
building [linkcheck]: targets for 27 source files that are out of date
…
(content/accessibility: line 89) ok https://bbc.github.io/subtitle-guidelines/
(content/writing-style: line 164) ok http://disabilityinkidlit.com/2016/07/08/introduction-to-disability-terminology/
…
( index: line 5) redirect https://cusy-design-system.readthedocs.io/ - with Found to https://cusy-design-system.readthedocs.io/de/latest/
…
(accessibility/color: line 114) broken https://chrome.google.com/webstore/detail/nocoffee/jjeeggmbnhckmgdhmgdckeigabjfbddl - 404 Client Error: Not Found for url: https://chrome.google.com/webstore/detail/nocoffee/jjeeggmbnhckmgdhmgdckeigabjfbddl
.. tab:: Windows
.. code-block:: ps1con
C:> python -m sphinx -b linkcheck docs\ docs\_build\
Running Sphinx v3.5.2
loading translations [de]... done
…
building [mo]: targets for 0 po files that are out of date
building [linkcheck]: targets for 27 source files that are out of date
…
(content/accessibility: line 89) ok https://bbc.github.io/subtitle-guidelines/
(content/writing-style: line 164) ok http://disabilityinkidlit.com/2016/07/08/introduction-to-disability-terminology/
…
( index: line 5) redirect https://cusy-design-system.readthedocs.io/ - with Found to https://cusy-design-system.readthedocs.io/de/latest/
…
(accessibility/color: line 114) broken https://chrome.google.com/webstore/detail/nocoffee/jjeeggmbnhckmgdhmgdckeigabjfbddl - 404 Client Error: Not Found for url: https://chrome.google.com/webstore/detail/nocoffee/jjeeggmbnhckmgdhmgdckeigabjfbddl
.. _ci-docs:
Kontinuierliche Integration
~~~~~~~~~~~~~~~~~~~~~~~~~~~
:abbr:`Ggf. (Gegebenenfalls)` könnt ihr auch automatisiert in eurer
:term:`CI`-Pipeline überprüfen, ob die Dokumentation gebaut wird und die Links
gültig sind. In :doc:`../../test/tox` kann die Konfiguration folgendermaßen
ergänzt werden:
.. code-block:: ini
:caption: tox.ini
[testenv:docs]
# Keep base_python in sync with ci.yml and .readthedocs.yaml.
base_python = py312
extras = docs
commands =
sphinx-build -n -T -W -b html -d {envtmpdir}/doctrees docs docs/_build/html
[testenv:docs-linkcheck]
base_python = {[testenv:docs]base_python}
extras = {[testenv:docs]extras}
commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees docs docs/_build/html
Anschließend könnt ihr :abbr:`z.B. (zum Beispiel)` für GitHub folgende Jobs
definieren:
.. code-block:: yaml
:caption: .github/workflows/ci.yml
docs:
name: Build docs and run doctests
needs: build-package
runs-on: ubuntu-latest
steps:
- name: Download pre-built packages
uses: actions/download-artifact@v4
with:
name: Packages
path: dist
- run: tar xf dist/*.tar.gz --strip-components=1
- uses: actions/setup-python@v5
with:
# Keep in sync with tox.ini/docs and .readthedocs.yaml
python-version: "3.12"
cache: pip
- run: python -m pip install tox
- run: python -m tox run -e docs
reST-Formatierung
-----------------
Ob die :doc:`Sphinx `-Dokumentation in gültigem :doc:`rest`-Format
geschrieben ist, lässt sich mit `sphinx-lint
`_ überprüfen. Dies binden wir
üblicherweise in unsere :doc:`pre-commit
`-Konfiguration
ein:
.. code-block:: yaml
:caption: .pre-commit-config.yaml
- repo: https://github.com/sphinx-contrib/sphinx-lint
rev: v1.0.0
hooks:
- id: sphinx-lint
types: [rst]
.. seealso::
Mit :doc:`Sybil:index` könnt ihr nicht nur :doc:`rest` überprüfen, sondern
:abbr:`z.B. (zum Beispiel)` auch :doc:`Markdown ` und
:doc:`Myst `. Darüberhinaus kann Sybil auch Code-Blöcke in der
Dokumentation entweder mit :doc:`../../test/pytest/index` oder mit
:doc:`../../test/unittest` überprüfen.
.. _test_code:
Code
----
Mit der eingebauten Python-Bibliothek :doc:`../doctest` könnt ihr auch Code in
eurer Dokumentation mit der :func:`doctest.testfile`-Methode testen:
.. code-block:: Python
import doctest
doctest.testfile("example.rst")
Dieses kurze Skript führt alle interaktiven Python-Beispiele aus, die in der
Datei :file:`example.rst` enthalten sind, und überprüft sie. Der Inhalt der
Datei wird so behandelt, als wäre er ein einziger riesiger Docstring.
.. seealso::
Ein einfaches Beispiel findet ihr in der Python-Dokumentation: `Simple Usage:
Checking Examples in a Text File
`_.
Eine andere Möglichkeit, Code in Dokumentationen zu testen ist
`pytest-doctestplus `_.
Code-Formatierung
-----------------
Die Formatierung von Code-Blöcken lässt sich mit `blacken-docs
`_ überprüfen, das
:doc:`Python4DataScience:productive/qa/black` verwendet. Üblicherweise binden
wir die Bibliothek über das :doc:`pre-commit
`-Framework ein:
.. code-block:: yaml
:caption: .pre-commit-config.yaml
- repo: https://github.com/adamchainz/blacken-docs
rev: "v1.12.1"
hooks:
- id: blacken-docs
additional_dependencies:
- black
blacken-docs unterstützt aktuell die folgenden Black-Optionen:
* `line-length
`_
* `preview
`_
* `skip-string-normalization
`_
* `target-version
`_
Rechtschreibung
---------------
Die englische Rechtschreibung lässt sich überprüfen mit `codespell
`_. Es nutzt eine erweiterte
Version der auf `Wikipedia
`_
verfügbaren Wörterbücher. :abbr:`Ggf. (Gegebenenfalls)` könnt ihr jedoch auch
eigene Wörterbücher mit der ``--builtin``-Option bereitstellen.
Ihr könnt ``codespell`` in der :file:`pyproject.toml` konfigurieren, :abbr:`z.B.
(zum Beispiel)`:
.. code-block:: toml
:caption: pyproject.toml
[project.optional-dependencies]
docs = [
"...",
"codespell",
]
[tool.codespell]
ignore-words-list = "uint"
skip = "./.*, *.po, ./docs/_build"
count = true
quiet-level = 3
Ihr könnt ``codespell`` automatisch vor jedem Git-Commit ausführen, indem ihr
folgendes in die :file:`.pre-commit-config.yaml`-Datei eintragt:
.. code-block:: yaml
:caption: .pre-commit-config.yaml
- repo: https://github.com/codespell-project/codespell
rev: v2.3.0
hooks:
- id: codespell
`Vale `_ geht über Rechtschreib- und Grammatikprüfungen hinaus.
Es überprüft auch den Sprachstil: Wiederholt sich das Gesagte? Ist die Sprache
zu informell? Ist die Ansprache inkonsistent? Werden unerwünschte Klischees
bedient? Oder ist die Sprache sexistisch?
Vale wird von vielen Open-Source-Projekten genutzt, :abbr:`u.a. (unter anderem)`
von
* GitLab (`.vale.ini
`__, `Regeln
`__)
* Homebrew (`.vale.ini
`__, `Regeln
`__)
Mit Vale selbst kommen die folgenden Stile mit:
`Microsoft `_
Eine Implementierung des `Microsoft Writing Style Guide
`__.
`Google `_
Eine Implementierung des Styleguides für den `Google developer documentation
style guide `__.
`write-good `_
Eine Umsetzung der vom `write-good
`__-Linter erzwungenen Richtlinien.
`proselint `_
Eine Umsetzung der vom `proselint
`__-Linter erzwungenen Richtlinien.
`Joblint `_
Eine Umsetzung der vom `Joblint
`__-Linter erzwungenen Richtlinien.
Vale wird in der :file:`.vale.ini`-Datei konfiguriert:
.. code-block:: ini
:caption: .vale.ini
StylesPath = styles
MinAlertLevel = suggestion
Packages = https://github.com/cusyio/cusy-vale/archive/refs/tags/v0.1.0.zip
[*.{md,rst}]
BasedOnStyles = cusy-de
.. seealso::
* `.vale.ini `__
Anschließend solltet ihr :abbr:`ggf. (gegebenenfalls)` eure :ref:`.gitignore
`-Datei aktualisieren:
.. code-block:: ini
:caption: .gitignore
styles/*
Ihr könnt Vale für das :doc:`pre-commit
`-Framework
konfigurieren mit:
.. code-block:: yaml
:caption: .pre-commit-config.yaml
- repo: https://github.com/errata-ai/vale
rev: v3.7.1
hooks:
- id: vale sync
pass_filenames: false
args: [sync]
- id: vale
args: [--output=line, --minAlertLevel=error, .]
.. _docstrings-coverage:
Docstrings-Coverage
-------------------
`interrogate `_ prüft eure
Codebasis auf fehlende Dokumentationsstrings und generiert ein
`shields.io-ähnliches Badge
`_.
Ihr könnt ``interrogate`` :abbr:`z.B. (zum Beispiel)` in der
:ref:`pyproject-toml`-Datei konfigurieren:
.. code-block:: toml
:caption: pyproject.toml
:emphasize-lines: 4, 7-
[project.optional-dependencies]
docs = [
"...",
"interrogate",
]
[tool.interrogate]
ignore-init-method = true
ignore-init-module = false
ignore-magic = false
ignore-semiprivate = false
ignore-private = false
ignore-module = false
ignore-property-decorators = false
fail-under = 95
exclude = ["tests/functional/sample", "setup.py", "docs"]
verbose = 0
omit-covered-files = false
quiet = false
whitelist-regex = []
ignore-regex = []
color = true
.. seealso::
* `Configuration `_
Nun könnt ihr ``interrogate`` in eure :doc:`../../test/tox`-Datei einfügen,
:abbr:`z.B. (zum Beispiel)` mit
.. code-block:: ini
:caption: tox.ini
[testenv:doc]
deps = interrogate
skip_install = true
commands =
interrogate --quiet --fail-under 95 src tests
Ihr könnt ``interrogate`` auch mit :doc:`pre-commit
` nutzen:
.. code-block:: yaml
:caption: .pre-commit-config.yaml
repos:
- repo: https://github.com/econchick/interrogate
rev: 1.7.0
hooks:
- id: interrogate
args: [--quiet, --fail-under=95]
pass_filenames: false