风格指南与测试
编码风格指南¶
我们希望贡献的代码能遵循现有代码库中的模式并展示良好的实践:代码应简洁、可读、符合 PEP8 规范,并且每行限制在 120 个字符以内。
请参阅代码库结构,了解关于添加新模块的指南。
pre-commit.ci¶
Ludwig 仓库集成了 pre-commit.ci,它会强制执行基本的代码风格指南,并通过向拉取请求添加提交来自动修复细微的风格问题。因此,在创建新的拉取请求后,请检查 pre-commit.ci 的结果。可能会有自动修复需要拉取,或者需要手动编辑才能解决的问题。
要在本地分支上运行 pre-commit,您可以使用 pip 在本地安装 pre-commit
# Installs pre-commit tool
pip install pre-commit
# Adds pre-commit hooks to local clone of git repository.
pre-commit install
# Runs pre-commit on all files
pre-commit run --all-files
# To disable, simply uninstall pre-commit from the local clone.
pre-commit uninstall
文档字符串¶
所有新文件、类和方法都应该有文档字符串。文档字符串应简洁地描述方法,并说明每个参数的含义以及可能的返回值。函数签名中应尽可能使用类型提示,并应使用方法接受的最具体的类型。
示例
def load_processed_dataset(
self,
split
) -> Union[pd.DataFrame, Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]]:
"""Loads the processed Parquet into a dataframe.
:param split: Splits along 'split' column if present.
:returns: The preprocessed dataset, or a tuple of (train, validation, test).
"""
没有参数或返回值的函数可以使用单行文档字符串,例如
@pytest.fixture()
def csv_filename():
"""Yields a csv filename for holding temporary data."""
测试¶
Ludwig 使用两种类型的测试:单元测试和集成测试。单元测试测试单个模块,应非常快速地独立运行。集成测试对 Ludwig 的单一功能(如超参数优化或可视化)进行端到端测试。Ludwig 测试组织在以下目录中
├── ludwig - Ludwig library source code
└── tests
├── integration_tests - End-to-end tests of Ludwig workflows
└── ludwig - Unit tests. Subdirectories match ludwig/ structure
我们使用 pytest
作为测试框架。更多信息请参阅 pytest 文档。
注意
Ludwig 的测试覆盖率正在完善中,许多模块还没有足够的测试覆盖。欢迎有助于我们实现 100% 测试覆盖率目标的贡献!
检查清单¶
运行测试之前,请确保
- 您的 Python 环境已正确配置以运行 Ludwig。
- 已安装测试所需的所有依赖项:
pip install ludwig[test]
- 您在机器上具有写入权限。某些测试需要将临时文件保存到磁盘。
运行测试¶
要运行所有测试,请在 ludwig 根目录下执行 python -m pytest
。请注意,您无需安装 ludwig 模块。在 ludwig 源代码根目录运行测试对于开发很有用,因为测试将直接从源树导入 ludwig 模块。
运行所有单元测试(需要几分钟)
python -m pytest tests/ludwig/
运行单个测试模块
python -m pytest tests/ludwig/decoders/test_sequence_decoder.py
要运行模块中的单个测试用例,您可以使用 -k
指定测试用例名称
python -m pytest tests/integration_tests/test_experiment.py \
-k "test_visual_question_answering"
另一个有用的调试工具是 -vs
标志,它会以 eager stdout 方式运行测试。这会将日志消息实时打印到控制台。此外,可以使用 module::test_case
模式而不是 -k
来指定单个测试用例。
python -m pytest \
tests/integration_tests/test_api.py::test_api_training_determinism -vs