自动化测试平台设计与实现(三、自动化用例对象成为可执行文件,用例执行机的设计与实现、用例调试)

cnblogs 2024-08-08 08:39:00 阅读 89

1、将数据库内自动化用例相关信息读取出来,生成可执行(测试)文件

通过之前的设计,我们实现了在平台上,增删改查用例、关键字、断言等操作。但最终数据库中用例的数据,要组合成可执行文件,来进行测试活动。

我们需要设计一个方法,输入project name, testcase title,定位唯一的testcase,然后通过testcase、TestCaseKeyword、assertion,这些是组成一个http请求测试的充分必要元素。然后把这个写到当前目录的新py文件,文件名就是project_name和title的拼接。构建一个可执行的python文件,执行python文件内的函数,我们就得到本次测试的结果。

回顾通常的python测试脚本,它一般有:

import requests

import json

def projectA_testcase1():

# step1: 有几步keyword,就有几个step注释

url = "example.com"

headers = {'Content-Type': 'application/json'}

data = {

"name": "abc",

"email": "abc@example.com"

}

response = requests.post(url, data=json.dumps(data), headers=headers)

assert response.status_code == 200

assert response.message == "success"

而这个测试脚本需要的元素,刚好存储在我们的数据库内。我们读取数据库,传递project和testcase title,拿到需要的信息,然后生成测试文件。

import os

import json

import django

from django.core.exceptions import ValidationError

# 设置 Django 环境

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TestBench.settings') # 修改为您的 settings 模块路径

django.setup()

from testplatform.models import Project, Testcase, TestCaseKeyword, Assertion

def create_test_script(project_name, testcase_title):

try:

project = Project.objects.get(name=project_name)

except Project.DoesNotExist:

raise ValidationError(f"Project '{project_name}' not found")

try:

testcase = Testcase.objects.get(project=project, title=testcase_title)

except Testcase.DoesNotExist:

raise ValidationError(f"Testcase with title '{testcase_title}' not found in project '{project_name}'")

testcase_keywords = TestCaseKeyword.objects.filter(test_case=testcase)

steps = []

for tk in testcase_keywords:

assertions = Assertion.objects.filter(testcase_keyword=tk).values('target_value', 'operator', 'compared_value')

steps.append({

'url': tk.url,

'method': tk.method,

'params': tk.params,

'headers': tk.headers,

'body_type': tk.body_type,

'body': tk.body,

'assertions': list(assertions)

})

# 生成文件内容

script_content = f"""

import requests

import json

def {project_name}_{testcase_title}():

"""

for i, step in enumerate(steps, start=1):

script_content += f"""

# step{i}: 执行请求并验证断言

url = "{step['url']}"

method = "{step['method']}"

params = {step['params']}

headers = {step['headers']}

body = {step['body']}

"""

if step['body_type'] == "application/x-www-form-urlencoded":

script_content += f"""

response = requests.request(method, url, params=params, headers=headers, data=body)

"""

else:

script_content += f"""

response = requests.request(method, url, params=params, headers=headers, json=json.dumps(body))

"""

for assertion in step['assertions']:

target_value = assertion['target_value']

operator = assertion['operator']

compared_value = assertion['compared_value']

if operator == 'greater_than':

script_content += f" assert {target_value} > {compared_value}\n"

elif operator == 'less_than':

script_content += f" assert {target_value} < {compared_value}\n"

elif operator == 'equal':

script_content += f" assert {target_value} == {compared_value}\n"

elif operator == 'greater_than_or_equal':

script_content += f" assert {target_value} >= {compared_value}\n"

elif operator == 'less_than_or_equal':

script_content += f" assert {target_value} <= {compared_value}\n"

elif operator == 'equal_to':

script_content += f" assert '{compared_value}' in {target_value}\n"

elif operator == 'contains':

script_content += f" assert '{compared_value}' in {target_value}\n"

elif operator == 'in':

script_content += f" assert {target_value} in '{compared_value}'\n"

script_content += f"""

if __name__ == "__main__":

{project_name}_{testcase_title}()

"""

# 文件名

file_name = f"{project_name}_{testcase_title}.py"

# 上一级目录的casefile文件夹路径

casefile_dir = os.path.join(os.path.dirname(os.getcwd()), 'casefile')

# 确保casefile文件夹存在

os.makedirs(casefile_dir, exist_ok=True)

# 完整的文件路径

file_path = os.path.join(casefile_dir, file_name)

# 写入文件

with open(file_path, 'w', encoding='utf-8') as file:

file.write(script_content)

print(f"Test script written to {file_path}")

if __name__ == '__main__':

create_test_script(project_name="Project B", testcase_title="autocase0807_001")



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。