跳到内容

风格指南与测试

编码风格指南

我们希望贡献的代码能遵循现有代码库中的模式并展示良好的实践:代码应简洁、可读、符合 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% 测试覆盖率目标的贡献!

检查清单

运行测试之前,请确保

  1. 您的 Python 环境已正确配置以运行 Ludwig。
  2. 已安装测试所需的所有依赖项:pip install ludwig[test]
  3. 您在机器上具有写入权限。某些测试需要将临时文件保存到磁盘。

运行测试

要运行所有测试,请在 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