133 lines
3.7 KiB
Markdown
133 lines
3.7 KiB
Markdown
|
# pytest-csv-params
|
||
|
|
||
|
A pytest plugin to parametrize tests by CSV files.
|
||
|
|
||
|
## Requirements
|
||
|
|
||
|
- Python 3.8, 3.9 or 3.10
|
||
|
- pytest >= 7.1
|
||
|
|
||
|
There's no operating system dependend code in this plugin, so it should run anywhere where pytest runs.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
Simply install it with pip...
|
||
|
|
||
|
```bash
|
||
|
pip install pytest-csv-plugin
|
||
|
```
|
||
|
|
||
|
... or poetry ...
|
||
|
|
||
|
```bash
|
||
|
poetry add --dev pytest-csv-plugin
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
Simply decorate your test method with `@csv_params` and the following parameters:
|
||
|
|
||
|
| Parameter | Type | Description | Example |
|
||
|
|--------------|--------------------------|-----------------------------------------------------------|-------------------------------------|
|
||
|
| `data_file` | `str` | The CSV file to use, relative or absolute path | `/var/testdata/test1.csv` |
|
||
|
| `base_dir` | `str` (optional) | Directory to look up relative CSV files (see `data_file`) | `join(dirname(__file__), "assets")` |
|
||
|
| `id_col` | `str` (optional) | Column name of the CSV that contains test case IDs | `ID#` |
|
||
|
| `dialect` | `csv.Dialect` (optional) | CSV Dialect definition (see [1]) | `csv.excel_tab` |
|
||
|
| `data_casts` | `dict` (optional) | Cast Methods for the CSV Data (see "Data Casting" below) | `{ "a": int, "b": float }` |
|
||
|
|
||
|
[1] [Python CSV Documentation](https://docs.python.org/3/library/csv.html#dialects-and-formatting-parameters)
|
||
|
|
||
|
### Data Casting
|
||
|
|
||
|
When data is read from CSV, they are always parsed as `str`. If you need them in other formats, you can set a method that should be called with the value.
|
||
|
|
||
|
These methods can also be lambdas, and are also good for further transformations.
|
||
|
|
||
|
#### Data Casting Example
|
||
|
|
||
|
```python
|
||
|
from pytest_csv_params.decorator import csv_params
|
||
|
|
||
|
def normalize(x: str) -> str:
|
||
|
return x.strip().upper()
|
||
|
|
||
|
@csv_params(
|
||
|
data_file="/test/data.csv",
|
||
|
data_casts={
|
||
|
"col_x": normalize,
|
||
|
"col_y": float,
|
||
|
},
|
||
|
)
|
||
|
def test_something(col_x, col_y):
|
||
|
# Test something...
|
||
|
...
|
||
|
```
|
||
|
|
||
|
### CSV Format
|
||
|
|
||
|
The default CSV format is:
|
||
|
|
||
|
- `\r\n` as line ending
|
||
|
- All non-numeric fields are surrounded by "
|
||
|
- If you need a " in the value, use "" (double quote)
|
||
|
- Fields are separated by comma (",")
|
||
|
|
||
|
#### Example CSV
|
||
|
|
||
|
```text
|
||
|
"ID#", "part_a", "part_b", "expected_result"
|
||
|
"first", 1, 2, 3
|
||
|
"second", 3, 4, 7
|
||
|
"third", 10, 11, 21
|
||
|
```
|
||
|
|
||
|
### Usage Example
|
||
|
|
||
|
This example uses the CSV example from above.
|
||
|
|
||
|
```python
|
||
|
from pytest_csv_params.decorator import csv_params
|
||
|
|
||
|
@csv_params(
|
||
|
data_file="/data/test-lib/cases/addition.csv",
|
||
|
id_col="#ID",
|
||
|
data_casts={
|
||
|
"part_a": int,
|
||
|
"part_b": int,
|
||
|
"expected_result": int,
|
||
|
},
|
||
|
)
|
||
|
def test_addition(part_a, part_b, expected_result):
|
||
|
assert part_a + part_b == expected_result
|
||
|
```
|
||
|
|
||
|
## Contributing
|
||
|
|
||
|
### Build and test
|
||
|
|
||
|
You need [Poetry](https://python-poetry.org/) in order to build this project.
|
||
|
|
||
|
Tests are implemented with `pytest`, and `tox` is used to orchestrate them for the supported python versions.
|
||
|
|
||
|
- Checkout this repo
|
||
|
- Run `poetry install`
|
||
|
- Run `poetry run tox` (for all supported python versions) or `poetry run pytest` (for your current version)
|
||
|
|
||
|
### Bugs etc.
|
||
|
|
||
|
Please send your issues to `csv-params_issues` (at) `jued.de`. Please include the following:
|
||
|
|
||
|
- Plugin Version used
|
||
|
- Pytest version
|
||
|
- Python version with operating system
|
||
|
|
||
|
It would be great if you could include example code that clarifies your issue.
|
||
|
|
||
|
### Pull Requests
|
||
|
|
||
|
Pull requests are always welcome. Since this Gitea instance is not open to public, just send an e-mail to discuss options.
|
||
|
|
||
|
## License
|
||
|
|
||
|
Code is under MIT license. See [LICENCE.txt](./LICENSE.txt) for details.
|