游戏测试 【测试工具】用 pytest 实现配置表自动化检查(三)检查逻辑 ConfigCheck

特尔斯特 · 2021年04月14日 · 最后由 特尔斯特 回复于 2022年01月04日 · 3112 次阅读

接上篇

目前只做了以下几种检查:
1.为空检查,检查表中是否有空

# 为空检查
  def check_null(self, list_check,table_name,column_name):
      print("check null")
      for index, sub in enumerate(list_check):
          pytest.assume(len(str(sub).strip())!=0,'    {0}      {1}列  第{2}行  为空 '.format(table_name,column_name,index+self.ignore_row+1))
          #pytest.assume(len(str(sub).strip())!=0),"value not "

2.重复检查,某些列中的内容是不能有重复的

# 重复检查
def check_repeat(self, list_check,table_name,column_name):
    print("check repeat")
    if(list_check==None):
        assert "{0}为空".format(list_check)
    else:
        if (len(set(list_check)) == len(list_check)):#set() 的长度和原来的相等说明没有重复项
            return

    counter_list_check = Counter(list_check)
    repeat_item = [key for key,value in counter_list_check.items() if value>1] #得到重复元素的列表
    for item in repeat_item:
        item_repeat_row = [i+self.ignore_row+1 for i,sub in enumerate(list_check) if sub == item]
        pytest.assume(item==None,'   {0}  {1}列   {2}   在{3}行重复  '.format(table_name,column_name,item,item_repeat_row))

3.格式检查,比如应该要配成 200;2003;4412;12,然后策划一不小心多了个分号,用脚本可以立刻检查出来。这里我用正则表达式来实现

# 格式检查
# 检查指定列是否符合给定的正则表达式
def check_regex(self,list_check,regex ,table_name,column_name):
    print("check regex")
    for index, sub in enumerate(list_check):
        sub= str(sub)
        pattern = re.compile(regex)
        pytest.assume(pattern.fullmatch(sub)!=None ,' {0}   {1}列  第{2}行  格式有误 '.format(table_name,column_name,index+self.ignore_row+1))

4.索引检查,比如某个宝箱的奖励物品 id 必须能索引到 item 表的 id ,不然箱子打不开,

# 索引检查
   def check_reference(self, list_checK, table_name,column_name, com_table_name,com_column_name,com_column_list):
       # list_check 被检查的列
       # com_talbe_name 需要索引到的表名
       # com_column_name 需要索引到的列名
       print("check reference")
       for index, sub in enumerate(list_checK):
           pytest.assume(sub in com_column_list,'    {0}     {1}列    第{2}行  无法索引到  {3}表的{4}列'.format(table_name,column_name,index+self.ignore_row+1,com_table_name,com_column_name))

5.值域检查,主要用来检测某些重要配置的数据在某个范围内,比如某些重要道具的奖励数量或者抽高级卡的概率,避免策划一步小心多填了个 0 导致的事故

# 值域检查
    def check_range(self,list_check,min,max,table_name,column_name):
        #被检查的内容必须是数值
        #todo 考虑字符也可以装换成数字
        for  index,sub  in enumerate(list_check):
            num = float(sub)
            pytest.assume(num>=min and num<= max,' {0}    {1}列  第{2}行  超出预期范围[{3} ,{4}]'.format(table_name,column_name,index+self.ignore_row+1,min,max))

详细源码 ConfigCheck.py

import pytest
import re
from collections import Counter

class ConfigChecker:
    def __init__(self):
        #一般配置表前3行是表头,不参与检查
        self.ignore_row = 3

    # 索引检查
    def check_reference(self, list_checK, table_name,column_name, com_table_name,com_column_name,com_column_list):
        # list_check 被检查的列
        # com_talbe_name 需要索引到的表名
        # com_column_name 需要索引到的列名
        print("check reference")
        for index, sub in enumerate(list_checK):
            pytest.assume(sub in com_column_list,'    {0}     {1}列    第{2}行  无法索引到  {3}表的{4}列'.format(table_name,column_name,index+self.ignore_row+1,com_table_name,com_column_name))

    # 为空检查
    @pytest.mark.skip('不执行')
    def check_null(self, list_check,table_name,column_name):
        print("check null")
        for index, sub in enumerate(list_check):
            pytest.assume(len(str(sub).strip())!=0,'    {0}      {1}列  第{2}行  为空 '.format(table_name,column_name,index+self.ignore_row+1))
            #pytest.assume(len(str(sub).strip())!=0),"value not "

    # 重复检查
    def check_repeat(self, list_check,table_name,column_name):
        print("check repeat")
        if(list_check==None):
            assert "{0}为空".format(list_check)
        else:
            if (len(set(list_check)) == len(list_check)):#set() 的长度和原来的相等说明没有重复项
                return

        counter_list_check = Counter(list_check)
        repeat_item = [key for key,value in counter_list_check.items() if value>1] #得到重复元素的列表
        for item in repeat_item:
            item_repeat_row = [i+self.ignore_row+1 for i,sub in enumerate(list_check) if sub == item]
            pytest.assume(item==None,'   {0}  {1}列   {2}   在{3}行重复  '.format(table_name,column_name,item,item_repeat_row))


    # 格式检查
    # 检查指定列是否符合给定的正则表达式
    def check_regex(self,list_check,regex ,table_name,column_name):
        print("check regex")
        for index, sub in enumerate(list_check):
            sub= str(sub)
            pattern = re.compile(regex)
            pytest.assume(pattern.fullmatch(sub)!=None ,' {0}   {1}列  第{2}行  格式有误 '.format(table_name,column_name,index+self.ignore_row+1))


    # 值域检查
    def check_range(self,list_check,min,max,table_name,column_name):
        #被检查的内容必须是数值
        #todo 考虑字符也可以装换成数字
        for  index,sub  in enumerate(list_check):
            num = float(sub)
            pytest.assume(num>=min and num<= max,' {0}    {1}列  第{2}行  超出预期范围[{3} ,{4}]'.format(table_name,column_name,index+self.ignore_row+1,min,max))

    # 是否与某列完全相等
        #pass


总结:目前是以一个配置表对应一个 py 来实现的,之后改成 基于 “数据驱动 + 关键字驱动” 来实现,这样别的组员不懂代码也可以用 excel 来写用例并执行了。完成了再更新下一篇。

共收到 3 条回复 时间 点赞

向大佬学习

索引检查这里,如果被检查的列里配的是一串字符串,奖励物品 id,数量,概率,是否绑定等好几个元素,而且每一行可能规律都不一样怎么办?我之前也是想搞一个这种检查工具,结果数值跟我说每个活动的奖励配法都不一样,搞得我很蛋疼

gf 回复

考验你正则表达式功力的时候到了😁

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册