novelWriter Tests
The test suite uses PyTest for testing.
Dependencies
python3-pytestfor the basic framework (required)python3-pytestqtfor Qt support (required)python3-pytest-covfor code coverage reports (optional)python3-pytest-xvfbfor headless tests (optional)
HowTo
Basic Usage
To run all tests, type:
pytest-3 -v
The -v switch enables verbose mode, with one test per line.
For a more compact view, omit this switch.
Headless
To run tests in headless mode, either use the Qt offscreen mode:
export QT_QPA_PLATFORM=offscreen
or run with xvfb:
xvfb-run pytest-3 -v
Test Coverage
To add test coverage, run the following:
pytest-3 -v --cov=nw --cov-report=html
The --cov-report switch generates an html report, omit it to print a coverage summary to the
terminal. The html coverage report will be available in the htmlcov folder.
Test Markers (Categories)
To run with specific test markers, add the -m switch:
pytest-3 -v -m core
Available markers are:
basefor unit tests covering the non-gui classes of thebwfolder..corefor unit tests covering the classes in thenw/corefolder.guifor unit and integrations tests covering the classes in thenw/guifolder.
Tests
To filter specific groups of tests, use the -k switch.
The commands for the respective test categories are listed below.
| Type | Test Target | Source File(s) | Marker | Filter |
|---|---|---|---|---|
| Unit | Main function | nw/__init__.py | -m base |
-k testBaseInit |
| Unit | Common functions | nw/common.py | -m base |
-k testBaseCommon |
| Unit | Config class | nw/config.py | -m base |
-k testBaseConfig |
| Unit | Error handlers | nw/error.py | -m base |
-k testBaseError |
| Unit | Core functions | nw/core/tools.py | -m core |
-k testCoreTools |
| Unit | NWDoc class | nw/core/document.py | -m core |
-k testCoreDocument |
| Unit | NWIndex class | nw/core/index.py | -m core |
-k testCoreIndex |
| Unit | NWItem class | nw/core/item.py | -m core |
-k testCoreItem |
| Unit | NWProject class | nw/core/project.py | -m core |
-k testCoreProject |
| Unit | NWSpell* classes | nw/core/spellcheck.py | -m core |
-k testCoreSpell |
| Unit | NWStatus class | nw/core/status.py | -m core |
-k testCoreStatus |
| Unit | NWTree class | nw/core/tree.py | -m core |
-k testCoreTree |
| Unit | OptionsState class | nw/core/options.py | -m core |
-k testCoreOptions |
| Unit | ToHtml class | nw/core/tohtml.py | -m core |
-k testCoreToHtml |
| Unit | Tokenizer class | nw/core/tokenizer.py | -m core |
-k testCoreToken |
| Integration | About Dialogs | nw/gui/about.py | -m gui |
-k testGuiAbout |
| Integration | Build Novel Project Tool | nw/gui/build.py | -m gui |
-k testGuiBuild |
| Integration | Document Editor Widget | nw/gui/doceditor.py | -m gui |
-k testGuiEditor |
| Integration | Document Viewer Widget | nw/gui/docviewer.py | -m gui |
-k testGuiViewer |
| Integration | Item Editor Dialog | nw/gui/itemeditor.py | -m gui |
-k testGuiItemEditor |
| Integration | Menu Widgets | nw/gui/mainmenu.py | -m gui |
-k testGuiMenu |
| Integration | Merge Tool | nw/gui/docmerge.py | -m gui |
-k testGuiMergeSplit |
| Integration | Outline Widget | nw/gui/outline.py | -m gui |
-k testGuiOutline |
| Integration | Preferences Dialog | nw/gui/preferences.py | -m gui |
-k testGuiPreferences |
| Integration | Project Load Dialog | nw/gui/projload.py | -m gui |
-k testGuiProjLoad |
| Integration | Project Settings Dialog | nw/gui/projsettings.py | -m gui |
-k testGuiProjSettings |
| Integration | Project Tree Widget | nw/gui/projtree.py | -m gui |
-k testGuiProjTree |
| Integration | Theme/Icon Classes | nw/gui/theme.py | -m gui |
-k testGuiTheme |
| Integration | Split Tool | nw/gui/docsplit.py | -m gui |
-k testGuiMergeSplit |
| Integration | Writing Stats Dialog | nw/gui/writingstats.py | -m gui |
-k testGuiWritingStats |
| Integration | Various Dialogs | N/A | -m gui |
-k testGuiDialogs |