9.3 KiB
贡献指南
入门
开发指导
测试用例
通过具体示例,完成openMind Library的功能测试。
-
安装测试依赖包。 在项目根目录下执行如下命令。
pip install -e .[test]
-
编写测试脚本。
以PTTrainer.train为例,分别在"tests/unit/trainer/"和"tests/functional/trainer/"路径下编写测试脚本文件:test_trainer.py。
以下示例仅为一个简单的用例实现,供用户参考。具体测试用例的实现,需要根据方法定义进行完整的覆盖才能保证功能的基本正确。
# 引入依赖库 import importlib import numpy as np from testtools import TestCase from tests.utils_for_test import slow # 定义PTTrainer测试用例类 class TestPTTrainer(TestCase): # 定义测试初始化函数 def setUp(self): super().setUp() import uuid from openmind.archived.trainers import trainer importlib.reload(trainer) self.output_dir = "test-trainer-%s" % uuid.uuid4() self.hub_model_id = f"{ORGANIZATION}/{self.output_dir}" # 定义测试资源清理函数 def tearDown(self): from openmind_hub import delete_repo super().tearDown() try: delete_repo(self.hub_model_id) except Exception: pass # 定义具体的测试函数,可以加入slow装饰器,以便在执行ci的时候跳过执行较久的用例,也可以在tests.utils_for_test中定义其他业务需要的装饰器,比如require_npu等 @slow("need 5 minutes to run, skip for PR") def test_train_and_push_to_hub(self): from openmind import AutoModelForSequenceClassification, Trainer, TrainingArguments from openmind import AutoTokenizer from openmind_hub import ModelInfo, repo_info from transformers import DataCollatorWithPadding from transformers.trainer import TrainOutput checkpoint = f"{ORGANIZATION}/tiny-random-BertModel" training_args = TrainingArguments(self.output_dir, push_to_hub=True) training_args.set_push_to_hub(self.hub_model_id, token=TOKEN) raw_datasets = get_glue_dataset() tokenizer = AutoTokenizer.from_pretrained(checkpoint) def tokenize_function(example): return tokenizer(example["sentence1"], example["sentence2"], truncation=True) tokenized_datasets = raw_datasets.map(tokenize_function, batched=True) data_collator = DataCollatorWithPadding(tokenizer=tokenizer) model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2) trainer = Trainer( model, training_args, train_dataset=tokenized_datasets["train"], eval_dataset=tokenized_datasets["validation"], data_collator=data_collator, tokenizer=tokenizer, compute_metrics=compute_metrics, ) train_output = trainer.train() self.assertTrue(isinstance(repo_info(self.hub_model_id, token=TOKEN), ModelInfo)) self.assertTrue(isinstance(train_output, TrainOutput)) self.assertTrue(train_output.training_loss > 0)
-
执行测试用例脚本。
单元测试在项目根目录下执行如下命令。
pytest --cov=src --cov-report=html --no-cov-on-fail tests/unit/
功能测试在项目根目录下执行如下命令。
export HUB_TOKEN="your_token" pytest tests/functional/
代码风格
请遵循这些风格,使魔乐社区易于开发、审查和维护。
-
编码指南
请在魔乐社区使用统一的编码风格,Python建议的编码风格是PEP 8编码样式。可以使用black和ruff检查代码的格式,建议您在IDE中安装这些插件。
pip install black ruff -i https://mirrors.huaweicloud.com/repository/pypi/simple # 项目根目录下执行 black . ruff --fix .
-
单元测试指南
请在魔乐社区使用统一的单元测试风格,Python中建议的单元测试风格是pytest。测试用例的设计意图应该通过它的注释名称来反映。
-
重构指南
我们鼓励开发人员重构我们的代码以消除代码异味。所有的代码都应该符合编码风格和测试风格的需求,重构代码也不例外。当您收到警告时,您必须重构要合并的代码。
门禁异常处理
门禁异常主要包含如下几种,请根据相关提示解决异常问题。
-
静态检查异常(代码Bug、代码漏洞、代码异味)
请根据提示查找代码中的异常并解决。
-
UT测试未通过
请根据提示,查找测试用例不通过项并检查原因,解决后再测试。
-
FT测试未通过
请根据提示,查找测试用例不通过项并检查原因,解决后再测试。
-
文档测试未通过
请依照提示查找文档中的规范异常并解决。
开发模式
-
Fork openMind Library存储库。
在向openMind Library项目提交代码之前,请确保该项目已经Fork到您自己的存储库。这意味着openMind Library存储库和您自己的存储库之间将存在并行开发,因此请注意避免存储库之间的不一致。
-
克隆远程仓库。
可以使用git将代码下载到本地环境。
# For Gitee git clone https://gitee.com/{insert_your_forked_repo}/openmind.git git remote add upstream https://gitee.com/modelers/openmind.git
-
本地开发代码。
为了避免多个分支之间的不一致,建议创建新的分支进行开发。
git checkout -b {new_branch_name} origin/dev
以dev分支为例,openMind Library可能会根据需要创建版本分支和下游开发分支,请先修复上游的bug。然后即可以自由地对代码进行修改。
-
将代码推送到远程仓库。
更新代码后,您需要以正式的方式推送更新。
git add . git status # Check the update status git commit -m "Your commit title" git commit -s --amend # Add the concrete description of your commit git push origin {new_branch_name}
-
向openMind Library存储库拉取请求。
在最后一步中,您需要在新分支和"openMind Library dev"分支之间拉取比较请求。完成拉取请求后,后端将自动构建、测试。您的Pull Request应该尽快合并到上游dev分支,以降低冲突的风险。
报告问题
在遇到问题时发送详细报告也是对项目的一种贡献。我们对那些精心编写、全面周到的错误报告表示衷心的感谢!在您的支持下,我们将能够更有效地识别并解决问题,从而提升整个项目的稳定性和效能。
在报告问题时,请遵循以下标准格式以确保问题能够得到有效处理:
- 环境版本信息:请明确指出您所使用的openMind Library、操作系统(OS)、Python等关键组件的版本号。
- 问题类型:请明确指出这是一份错误报告还是一项功能请求。
- 问题描述与分类:清晰阐述出现的问题,并为其添加适当的标签以便分类处理。
- 实际发生情况:详细描述问题的具体表现,包括出现的错误消息、异常行为等。
- 预期结果:阐述在正常情况下,您期望系统或功能如何运作。
- 重现步骤:提供一套尽可能简单且精确的操作步骤,以便他人能够重现您遇到的问题。
- 特别说明:如有任何对审稿人而言至关重要的额外信息或注意事项,请在此处详细说明。
解决问题:
- 如果您发现一个未解决的问题,而这正是您要解决的问题,请对该问题发表一些评论,告诉其他人您将负责它。
- 如果问题已打开一段时间,建议贡献者在解决该问题之前进行预检查。
- 如果您解决了自己报告的问题,则还需要在关闭该问题之前让其他人知道。
提出PR
- 在Gitee上提出您的问题。
- 如果是需要大量设计细节的新功能,还应提交设计方案。
- 在问题讨论和设计提案审查中达成共识后,在您的分支完成开发并提交PR(Pull Request)。
- 在从审核者那里收到3+ LGTM(Looks Good To Me)之前,不允许合入任何PR 。请注意,提请人不允许在自己的PR上添加LGTM。
- 在PR被充分讨论后,它将根据讨论的结果被合并、放弃或拒绝。
注意事项:
- 应避免任何不相关的更改。
- 确保您的提交历史的顺序是正确的。
- 确保分支与主分支保持一致。
- 对于错误修复类型的PR,请确保关联所有相关问题。