Some changes to fixtures and added tests README
This commit is contained in:
@@ -0,0 +1,68 @@
|
|||||||
|
# novelWriter Tests
|
||||||
|
|
||||||
|
The test suite uses PyTest for testing.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
* `python3-pytest` for the basic framework (required)
|
||||||
|
* `python3-pytestqt` for Qt support (required)
|
||||||
|
* `python3-pytest-cov` for code coverage reports (optional)
|
||||||
|
* `python3-pytest-xvfb` for headless tests (optional)
|
||||||
|
|
||||||
|
## HowTo
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
To run all tests, type:
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
```bash
|
||||||
|
export QT_QPA_PLATFORM=offscreen
|
||||||
|
```
|
||||||
|
|
||||||
|
or run with `xvfb`:
|
||||||
|
```bash
|
||||||
|
xvfb-run pytest-3 -v
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Coverage
|
||||||
|
|
||||||
|
To add test coverage, run the following:
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
```bash
|
||||||
|
pytest-3 -v -m core
|
||||||
|
```
|
||||||
|
|
||||||
|
Available markers are:
|
||||||
|
|
||||||
|
* '`core`' for test covering the classes in the `nw/core` folder
|
||||||
|
|
||||||
|
## 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 | Core functions | nw/core/tools.py | `-m core` | `-k testCoreTools` |
|
||||||
|
| Unit | NWIndex class | nw/core/index.py | `-m core` | `-k testCoreIndex` |
|
||||||
|
| Unit | NWItem class | nw/core/item.py | `-m core` | `-k testCoreItem` |
|
||||||
|
| Unit | NWTree class | nw/core/tree.py | `-m core` | `-k testCoreTree` |
|
||||||
|
|
||||||
+17
-8
@@ -26,12 +26,12 @@ def tmpDir():
|
|||||||
be checked. The folder is instead cleared before a new test session.
|
be checked. The folder is instead cleared before a new test session.
|
||||||
"""
|
"""
|
||||||
testDir = os.path.dirname(__file__)
|
testDir = os.path.dirname(__file__)
|
||||||
tempDir = os.path.join(testDir, "temp")
|
theDir = os.path.join(testDir, "temp")
|
||||||
if os.path.isdir(tempDir):
|
if os.path.isdir(theDir):
|
||||||
shutil.rmtree(tempDir)
|
shutil.rmtree(theDir)
|
||||||
if not os.path.isdir(tempDir):
|
if not os.path.isdir(theDir):
|
||||||
os.mkdir(tempDir)
|
os.mkdir(theDir)
|
||||||
return tempDir
|
return theDir
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def refDir():
|
def refDir():
|
||||||
@@ -39,8 +39,17 @@ def refDir():
|
|||||||
the results of tests.
|
the results of tests.
|
||||||
"""
|
"""
|
||||||
testDir = os.path.dirname(__file__)
|
testDir = os.path.dirname(__file__)
|
||||||
refDir = os.path.join(testDir, "reference")
|
theDir = os.path.join(testDir, "reference")
|
||||||
return refDir
|
return theDir
|
||||||
|
|
||||||
|
@pytest.fixture(scope="session")
|
||||||
|
def outDir(tmpDir):
|
||||||
|
"""An output folder for test results
|
||||||
|
"""
|
||||||
|
theDir = os.path.join(tmpDir, "results")
|
||||||
|
if not os.path.isdir(theDir):
|
||||||
|
os.mkdir(theDir)
|
||||||
|
return theDir
|
||||||
|
|
||||||
##
|
##
|
||||||
# novelWriter Objects
|
# novelWriter Objects
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ from nw.core.index import NWIndex
|
|||||||
from nw.constants import nwItemClass, nwItemLayout
|
from nw.constants import nwItemClass, nwItemLayout
|
||||||
|
|
||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testCoreIndex_LoadSave(monkeypatch, nwLipsum, dummyGUI, nwTempProj, refDir):
|
def testCoreIndex_LoadSave(monkeypatch, nwLipsum, dummyGUI, outDir, refDir):
|
||||||
"""Test core functionality of scaning, saving, loading and checking
|
"""Test core functionality of scaning, saving, loading and checking
|
||||||
the index cache file.
|
the index cache file.
|
||||||
"""
|
"""
|
||||||
projFile = os.path.join(nwLipsum, "meta", "tagsIndex.json")
|
projFile = os.path.join(nwLipsum, "meta", "tagsIndex.json")
|
||||||
testFile = os.path.join(nwTempProj, "coreIndex_LoadSave_tagsIndex.json")
|
testFile = os.path.join(outDir, "coreIndex_LoadSave_tagsIndex.json")
|
||||||
compFile = os.path.join(refDir, "coreIndex_LoadSave_tagsIndex.json")
|
compFile = os.path.join(refDir, "coreIndex_LoadSave_tagsIndex.json")
|
||||||
|
|
||||||
theProject = NWProject(dummyGUI)
|
theProject = NWProject(dummyGUI)
|
||||||
|
|||||||
Reference in New Issue
Block a user