自动化测试平台设计与实现(二、自动化测试用例对象设计实现、关键字对象设计与实现)

cnblogs 2024-08-06 09:09:01 阅读 62

1、模型设计

建立自动化用例,关键字模型。其中自动化用例基本内容包含title(目录展示)、name等常见文本信息,关键字则是实现自动化测试提速的关键所在,考虑到业务场景的自动化,就能发现有很多业务步骤是重复的:比如一个管理系统里面的创建对象,我们将该步骤抽象出来,形成一个关键字(keyword),关键字保存url、header等信息,要录入到自动化用例testcase模型中,则使用中间表TestCaseKeyword,它会详细记录某个自动化用例的(关键字-顺序),并且关键字会带有详细的params、body等信息,也就是可以被全局变量,或者常量所覆盖。

import functools

import uuid

import random

import string

from django.db import models

from django.core.exceptions import ValidationError

from django.utils import timezone

# Create your models here.

def generate_random_string(except_str, length=10):

characters = string.ascii_letters + string.digits

random_chars = ''.join(random.choice(characters) for _ in range(length))

return f'{except_str}_{random_chars}' if except_str else random_chars

def validate_positive(value):

if value < 0:

raise ValidationError('%(value)s is not a positive integer or 0', params={'value': value})

class Testcase(models.Model):

# title:标题; name:编号; level:等级;前置条件,测试步骤,预期结果

title_default = functools.partial(generate_random_string, "title")

name_default = functools.partial(generate_random_string, "test")

title = models.CharField(max_length=50, unique=True, null=False, blank=False, default=title_default)

name = models.CharField(max_length=50, unique=True, null=False, blank=False, default=name_default)

level = models.IntegerField(default=0, validators=[validate_positive])

precondition = models.CharField(max_length=300, null=True, blank=True, default=None)

test_precondition = models.CharField(max_length=300, null=True, blank=True, default=None)

expected_result = models.CharField(max_length=300, null=True, blank=True, default=None)

TYPE = [

("function_case", "功能用例"),

("performance_case", "性能用例"),

("reliability_case", "可靠性用例"),

]

type = models.CharField(max_length=20, choices=TYPE, default="function_case")

auto_flag = models.BooleanField(default=False, null=True, blank=True)

description = models.TextField(blank=True, null=True)

keywords = models.ManyToManyField("KeyWord", through='TestCaseKeyword')

def __str__(self):

return f"{self.title}_{self.name}"

class KeyWord(models.Model):

BODY_TYPES = [

('application/x-www-form-urlencoded', 'Application/X-WWW-Form-Urlencoded'),

('raw', 'Raw'),

('multipart/form-data', 'Multipart/Form-Data'),

]

name_default = functools.partial(generate_random_string, "kw")

name = models.CharField(max_length=100, unique=True, null=False, blank=False, default=name_default)

url = models.URLField()

params = models.JSONField(blank=True, null=True)

headers = models.JSONField(blank=True, null=True)

body_type = models.CharField(max_length=50, choices=BODY_TYPES)

body = models.TextField(blank=True, null=True)

description = models.TextField(blank=True, null=True)

def __str__(self):

return self.name

class TestCaseKeyword(models.Model):

test_case = models.ForeignKey(Testcase, on_delete=models.CASCADE)

keyword = models.ForeignKey(KeyWord, on_delete=models.CASCADE)

order = models.PositiveIntegerField()

params = models.JSONField(blank=True, null=True)

headers = models.JSONField(blank=True, null=True)

body = models.TextField(blank=True, null=True)

class Meta:

ordering = ['order']

def __str__(self):

return f"{self.test_case.name} - {self.keyword.name} ({self.order})"

tips:

1. python有前向引用:如果在一个模型类中引用了另一个尚未定义的模型类,可能会出现 Unresolved reference 错误。

可以在 Testcase 模型中使用前向引用,即在字符串中引用 KeyWord 模型。这样可以解决。但函数可以在代码的任何位置定义和调用。

前向引用:在字段定义中使用字符串形式的类名引用未定义的模型类。



声明

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