from new_case.devops.conftest import prepare_jenkins
from new_case.devops.conftest import prepare_harbor
from new_case.devops.conftest import prepare_gitlab
@pytest.mark.skipif(not prepare_jenkins(), reason="jenkins不可用")
@pytest.mark.skipif(not prepare_harbor(), reason="harbor不可用")
@pytest.mark.skipif(not prepare_gitlab(), reason="gitlab不可用")
mark执行顺序在conftest之前
def 测试创建golang构建配置(self, jenkins, gitlab, harbor, sonarqube):
self.CodeQualityBinding.update({"name": sonarqube["bind_name"]})
self.values['CodeQualityBinding'] = json.dumps(self.CodeQualityBinding)
data = {
"pipeline_name": self.config_name,
"display_name": self.config_name,
"project_name": PROJECT_NAME,
"jenkins_bind_name": jenkins["bind_name"],
"pipeline_template_name": "GoLangBuilder",
"values": self.values
}
@pytest.fixture(scope="session")
def jenkins():
delete_tool = False
secret_info = {
"secret_name": "{}-ares-jenkins".format(settings.RESOURCE_PREFIX),
"secret_type": "kubernetes.io/basic-auth",
"username": str(base64.b64encode(settings.JENKINS_USERNAME.encode('utf-8')), 'utf8'),
"password": str(base64.b64encode(settings.JENKINS_PASSWORD.encode('utf-8')), 'utf8')
}
tool_info = {
"tool_name": settings.JENKINS_TOOL_NAME,
"host_url": settings.JENKINS_URL,
"accessUrl": settings.JENKINS_URL,
"api_type": "jenkinses",
"tooltypename": "jenkins"
}
bind_info = {
"bind_name": "{}-ares-jenkins-cicd".format(settings.RESOURCE_PREFIX),
"kind": "JenkinsBinding",
"api_type": "jenkinsbinding",
"audit_type": "jenkinsbindings"
}
pre_clear_data(secret_info, bind_info, tool_info)
# create tool chain
ret = chain_tool.create_chain(tool_info["api_type"], './test_data/tool_chain/create_chain.jinja2',
data=tool_info)
if ret.status_code != 201:
tool_name = get_tool_name('continuousIntegration', tool_info['host_url'])
tool_info['tool_name'] = tool_name
secret.create_secret(scope="", file='./test_data/devops_secret/create_secret.jinja2', data=secret_info)
# bind to project
bind_data = {
"kind": "JenkinsBinding",
"description": "description",
"bind_name": bind_info["bind_name"],
"namespace": settings.PROJECT_NAME,
"secret_name": secret_info['secret_name'],
"tool_name": tool_info['tool_name'],
"secret_namespace": "global-credentials" if settings.DEFAULT_NS == "alauda-system" else "{}-global-credentials".format(
settings.DEFAULT_NS)
}
bind_info.update(bind_data)
ret = chain_tool.bind_chain("jenkinsbinding", "test_data/tool_chain/create_jenkins_bind.jinja2",
bind_data)
assert ret.status_code == 200, "初始化绑定jenkins工具链失败"
# 清理数据
yield bind_info
conftest 使用yield做为返回值, yield后的内容就是返回值, 测试用例直接调用函数名称即可。 函数名称就是返回值的内容
多个conftest的执行顺序
首先执行外层conftest
接着执行内层conftest
最后执行外层conftest的teardown
如果直接运行pytest -s 通常会打印日志 但是 如果有pytest.ini 文件而且使用了多线程插件 此时 多线程会导致无法打印日志
-n 1 --dist=loaddir 去掉pytest.ini 中的这个配置即可打印