带状态的测试
本部分旨在解释 Kea 的带状态的测试是如何设计及实现的
功能说明与功能设计
Bundle类是带状态测试的核心类。 主要负责记录多组不同类型数据的相关状态和操作的组合,用于测试系统在不同状态下的行为。 该类提供了完整的成员方法用于状态的增删改查操作。 Bundle所包含的主要方法有:
根据当前类型数据的状态情况判断是否需要新增状态(单例模式)。
对某类型数据状态的增删改查。
随机生成指定长度的状态文本值。
随机获取某类型数据的一个状态。
Bundle 类的组成
Bundle类中的数据结构的实现
_bundle_
_bundle_为Bundle的类变量,是带状态测试中各种类型数据的状态记录库,用于存储应用状态便于对状态的操作。 每个数据项以 <string, Bundle> 的键值对方式存储。
data_name
data_name为string类型,存储了一个类型的数据的名称。
data_value
data_value是list类型,存储了该类型的数据的所有状态。
备注
为了便于读者理解,本文中提供的代码段简化版本仅对核心流程进行抽象并展示,实际代码与简化的参考代码不完全一致。
Bundle类中功能方法的实现
单例模式方法
__new__
根据当前类型数据的名称判断是否已经实例化过该类型数据的Bundle对象,若没有实例化则实例化该类型Bundle对象并返回。 否则,不实例化并返回之前实例化的对象。
- 参数:
data_name: 想要实例化的某个类型数据名称。
- 返回:
该类型数据的实例。
def __new__(cls, data_name: str = None): if data_name in cls._bundles_: return cls._bundles_[data_name] else: instance = super().__new__(cls) cls._bundles_[data_name] = instance return instance
数据状态增删改查的成员方法
add
为当前类型数据增加状态。
- 参数:
value: 新增的状态值。
def add(self, value = None): if value is None: raise ValueError("the value of " + self.data_name + " cannot be None") self.data_value.append(value)
delete
为当前类型数据删除状态。
- 参数:
value: 要删除的状态值。
def delete(self, value = None): if value is None: raise ValueError("the value of " + self.data_name + " cannot be None") self.data_value.remove(value)
update
为当前类型数据更新状态。
- 参数:
value: 要修改的旧状态值。new_value: 新的状态值。
def update(self, value = None, new_value = None): if new_value is None: raise ValueError("the new name of " + self.data_name + " cannot be None") if value is None: raise ValueError("the old name of " + self.data_name + " cannot be None") try: self.data_value.remove(value) self.data_value.append(new_value) except KeyError: print(f"'{value}' is not a object of Bundle.")
get_all_data
获取该类型数据的所有状态。
- 返回:
状态列表
def get_all_data(self): return self.data_value
随机生成状态文本的成员方法
get_random_text
随机生成指定长度的状态文本值。
- 参数:
value_max_len: 需要状态文本值的最大长度。
- 返回:
合法的状态文本值
def get_random_text(self, value_max_len = 10): text = st.text(alphabet=string.ascii_letters, min_size=1, max_size=value_max_len).example() return text
随机获取一个状态的成员方法
get_random_data
随机获取某类型数据的一个状态。
- 返回:
该类型数据的一个状态值
def get_random_data(self): random_item = random.choice(self.data_value) return random_item