属性动态管理和及unittest框架

一、属性动态管理机制

  1. 常规的属性添加方法

    类属性添加

# 1、类里面的实例方法中:self.属性名 = 属性值
# 2、类外部:对象.属性名 = 属性值
class A:
def func(self):
# 类里面的方法中
self.name = '小小简'
a = A()
# 类外部
a.age = 18

实例属性添加


# 1、类里面的实例方法中:self.属性名 = 属性值 
# 2、类外部:对象.属性名 = 属性值 
class A: def func(self): 
    # 类里面的方法中 
    self.name = '小小简' 
a = A() 
# 类外部 
a.age = 18
class A:
    pass 
# 实例化一个对象 
a = A() 
name = input('属性名:') 
value = input('属性值:')
# 问题一:如何把上面输入的name和value的值,设置为对象a的属性,和属性值?
# 问题二:如何把列表['age',18]中的两个值,设置为对象a的属性和属性值?

 

  1. 需求

    class A:
        pass 
    ​
    # 实例化一个对象 
    ​
    a = A() 
    name = input('属性名:') 
    value = input('属性值:')
    ​
    # 问题一:如何把上面输入的name和value的值,设置为对象a的属性,和属性值?
    # 问题二:如何把列表['age',18]中的两个值,设置为对象a的属性和属性值?\
    ​

    动态添加属性

    setattr(obj,name,value)
    参数1:对象
    参数2:属性名
    参数3:属性值

    动态获取属性

    getattr(obj,name,`默认值`) 
    参数1:对象 
    参数2:属性名 
    参数3:属性不存在是返回的默认值(非必填)

    动态删除属性

    delattr(obj,name)
    参数1:对象 
    参数2: 属性名

    动态判断对象属性是否存在

    hasattr(obj,name,默认值)
    参数1:对象
    参数2:属性名
    参数3:默认值
    属性存在返回True,不存在返回Flase

二:测试需求

登录功能校验函数
入参: 
出参(返回值)
:{"code":业务码,"msg":"提示信息"} 
内部校验逻辑,账号密码是否为空,
账号密码是否正确 
正常登录的账号为:python47 密码:lemonban 
功能函数如下
def login_check(username=None, password=None):
    """ 登录校验的函数 
    :param username: 账号 
    :param password: 密码 :
    return: dict type """ 
    if username and password :
        if username == 'python47' and password == 'lemonban': 
            return {"code": 0, "msg": "登录成功"} 
        else: return {"code": 1, "msg": "账号或密码不正确"} 
    else: return {"code": 1, "msg": "所有的参数不能为空"}

用例设计

1、账号密码正确 
入参:账号python35 密码lemonban 
预期结果:{"code": 0, "msg": "登录成功"} 
实际结果: 
2、账号正确,密码错误 
入参:账号python35 密码lemonban11 
预期结果:{"code": 1, "msg": "账号或密码不正确"} 
实际结果: 
3、错误的账号 
入参:账号python25 密码lemonban 
预期结果:{"code": 1, "msg": "账号或密码不正确"} 
实际结果: 
4、账号为空 
入参:账号为空 密码lemonban11 
预期结果:{"code": 1, "msg": "所以的参数不能为空"} 
实际结果: 
5、密码为空 
入参:账号Python6 密码为空 
预期结果:{"code": 1, "msg": "所以的参数不能为空"} 
实际结果

三、unittest框架

1、TestCase:测试用例

用例编写需求

  • 1、定义一个类,让它继承unittest.TestCase

  • 2、在测试类中定义方法(每个以test开头的方法,就是一条用例)

  • 3、在测试方法中编写用例执行的逻辑代码

unittest中关于用例执行通过和失败的评判标准

用例执行过程中是否出现(断言异常)AssertionError,来评判用例是否执行通过

注意点:在unittest中比较预期结果和实际结果时,一定要用断言

class TestLogin(TestCase): 
    def test_login_success(self):
        """登录成功的用例"""
        # 调用功能函数获取实际结果
        result = login_check('python47', "lemonban") 
        # 如果是做接口测试(调用 接口) 
        # 预期结果 excepted = {"code": 0, "msg": "登录成功"} 
        # 1、使用python中的关键字assert来断言(不推荐) 
        # assert excepted == result 
        # 如果条件不相等:抛出断言异常 
        # 2、unittest中提供的断言方法(推荐) 
        self.assertEqual(excepted, result)

用例执行顺序

1、先按文件名,以ASCII进行排序

2、文件内的测试类,以ASCII对测试类的名称进行排序

3、测试类内的用例,以ASCII对用例方法的名称进行排序

2、TestSuite:测试套件

TestSuite:存放用例的用例集 收集用例到套件的几种方式:

1、通过用例文件的路径进行加载(常用,推荐)

suite = unittest.defaultTestLoader.discover(r'C:\project\py47\code_demo\testcases') 

#注意点:目录的路径,不是py文件的路径

2、通过用例模块进行加载(不常用)

# 导入测试模块
from code_demo.testcases import test_login 
#加载模块用例到测试套件 
suite = unittest.defaultTestLoader.loadTestsFromModule(test_login)

3、通过测试类收集(不常用)

# 导入测试类
from code_demo.testcases.test_demo import TestDemo
# 加载测试类用例到测试套件
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestDemo)

3、TestRunner:测试运行器

unittest内置的运行器:

unittest.TextTestRunner(一般不用,没有报告)

# 收集用例到测试套件 
suite = unittest.defaultTestLoader.discover(r'用例文件目录的路径') 
# 1、创建一个测试执行器 
runner = unittest.TextTestRunner() 
# 2、执行测试套件中的所有用例 runner.run(suite)
runner.run(suite)

使用第三方运行器生成报告

  1. unittestreport

  • 安装命令:pip install unittestreport

# 收集用例到测试套件
suite = unittest.defaultTestLoader.discover(r'用例文件目录的路径')
from unittestreport import TestRunner
runner = TestRunner(suite)
runner.run()
  1. BeautifulReport

  • 安装命令 :pip install BeautifulReport

    from BeautifulReport import BeautifulReport
    runner = BeautifulReport(suite)
    runner.report(description='测试报告'
posted @ 2022-01-21 10:30  nicole_cute  阅读(31)  评论(0)    收藏  举报