使用Unittest 与ddt完成自动化测试

# 相关概念与项目概论

## Unittest介绍

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些**校验返回的结果方法**和一些用例执行前的初始化操作

 1. unittest.TestCase:TestCase类,所有测试用例类继承的基本类。

unittest.main()运行时,框架自动寻找Test.Case子类,并且运行
例如:class Test(unittest.TestCase):
 2. setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。用于测试用例执行前自动被调用
 3. tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。
 4. assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
 5. 定义测试用例,以“test_”开头命名的方法。在TestCase类中,只有把以test开头的方法当做测试用例,然后执行


## 数据驱动ddt
1、概念:它将测试中的测试数据和操作分离,数据存放在另外一个文件中单独维护。通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
2@ddt : 类的装饰器,在测试类前引用
3@data:直接输入测试数据


## 一Conf:

**1 LogConf**:设置自定义log级别
Example:

import logging
user_define_log_level=logging.DEBUG
logging.basicConfig(
    level=user_define_log_level,  # 定义输出到文件的log级别,
    format='[%(asctime)s][%(filename)s]-[%(funcName)s]-[%(lineno)d] [%(levelname)s] %(message)s',  # 定义输出log的格式
    datefmt='%Y-%m-%d %H:%M:%S',  # 时间
    )
if __name__ == '__main__':
    logging.debug('一个debug信息')

 

**2Urlconf**:设置接口相关信息,包括protocol,domain,path,method等

Exaple:Product={ "Tour_Group_Product_Type": {
    "protocol": "http",
    "domain": "",
    "path": "/tour/group/product/type",
    "method": "get",
    "comments": "获取产品类型"
 }

 

## 二Data

测试数据集合:
不同的测试场景:不同的productID,AdultNum,ChildNum,ChildFreeNum

ProductSet = {
    "data":[
        {
            "ProductID": "1111111",
            "AdultNum": 2,
            "ChildNum": 2,
            "ChildFreedNum": 0,
            "SelectedDate": ""
        },]}


## 三Src
公共类common
1状态返回判断successJudge

class SuccessJudge:
    def __init__(self, success, msg):
        self.__success = success
        self.__msg = msg
    def judge(self):
        if self.__success and self.__msg:
            return True
        else:
            return False
if __name__ == "__main__":
    print(SuccessJudge(True,True).judge())


2定义测试结果结构体result

class Result:
    def __init__(self):
        self.__success = False
        self.__msg = ""
        self.__data = {}
    @property
    def json(self):
        return {"success": self.__success, "msg": self.__msg, "data": self.__data}
    def setResult(self, *, success, msg=None, data=None):
        self.success = success
        if not msg is None:
            self.msg = msg
        if not data is None:
            self.data = data
    @property
    def success(self):
        return self.__success
    @success.setter
    def success(self, value):
        self.__success = value

3接口键正确interfaceUtility
判断key是否正确,先判断是否存在,然后判断key的值value
4文件路径设定fileUtility
保存数据,读取全部文件内容
5基类interfaceBase
初始化地址,参数,方法;处理请求的Url,返回状态码
6初始化接口类(产品详情,产品类型,城市列表,旅游详情,评论,推荐,线下零售,价格日历,满意度,签证)

## 四Test
1定义接口地址变量(参数productId,productType,bookCode,poiId),发送Url,获取返回结果
2data校验,校验是否为空,json格式,字典套字典的数据呈现,校验数据(字段)不为空且为正确的内容
3定义一个类继承unittest.testcase,每一接口都定义一个test_方法,

@ddt
class test(unittest.TestCase):
    def setUp(self):
        print("")
    @data(*ProductSet["data"])
    def test_groupinfo(self,value):
            res = InterfaceTestCaseResult(testcasename='校验pc跟团产品详情页基本信息')
            res.startTimer()
            vs = Groupgetinfo(Group)
            #print(vs)        rs=vs.status(ProductSet["data"][0]['bookCityCode'],ProductSet["data"][0]['ProductID'])
            # print(ProductSet["data"][0]['ProductID'], ProductSet["data"][0]['bookCityCode'])
            #print(rs)
            res.stopTimer()
            res.success = rs['success']
            res.msg = rs['msg']
            res.data = rs['data']
            # FileUtility.write(mode="a+", Data=res.toString())
            self.assertTrue(res.success)
            self.assertTrue(res.msg)
            self.assertTrue(res.data)
if __name__ == '__main__':
    unittest.main()

## 五report
结果呈现
 

你可能感兴趣的:(自动化测试)