案例回顾及编写测试用例
使用新测试库BaseAPI
删除原先的测试库
organizapi.py,使用新的测试库
修改测试用例
from pylib.webapi.bussiness import OrganizAPI
import pytest
from conf.env import g_pwd,g_email
from pylib.webapi.common import login
@pytest.fixture()
def before_tc000001():
cookies=login(g_email,g_pwd)
org_api=OrganizAPI(cookies)
org_api.delete_all()
return org_api
def test_tc000001(before_tc000001):
org_api=before_tc000001
#step1
org=org_api.add(name='研发部')
#step2
orgs=org_api.list_all()
assert org in orgs#检查列表中包含刚刚创建的部门信息
执行成功,但是发现抓包工具有红色的报错
发现是跟以前的报错一样,提示总公司不能删除
但是我们又不能在BaseAPI中过滤,因为其他接口是可以删除所有的
那怎么办呢?我们只能取子类中操作,重写父类的方法,然后加上过滤条件
重写父类的方法
#部门API
class OrganizAPI(BaseAPI):
#删除所有
def delete_all(self):
lists=self.list_all()[1:]
for list in lists:
self.delete(list['_id'])
接着分析又发现,add和edit方法,parentid没有动态获取,只用到了模板中的id
这就要重写父类的add和edit方法
判断key是否存在,要用get方法,如果以[]形式,如果不存在,会报错key不存在
#增加
def add(self,**kwargs):
#如果传了parent_id,就无法起作用,需要进行判断,如果没有传,才使用总公司的id
if not kwargs.get("parent",None):
parent_id=self.list_all()[0]['_id']#默认为总公司的id
kwargs['parent']=parent_id
#复用父类的方法
super().add(**kwargs)
#修改
def edit(self,_id,**kwargs):
#如果传了parent_id,就无法起作用,需要进行判断,如果没有传,才使用总公司的id
if not kwargs.get("parent",None):
parent_id=self.list_all()[0]['_id']#默认为总公司的id
kwargs['parent']=parent_id
#复用父类的方法
super().edit(**kwargs)
用例优化--清除操作
@pytest.fixture()
def before_tc000001():
cookies=login(g_email,g_pwd)
org_api=OrganizAPI(cookies)
org_api.delete_all()
yield org_api #yield后面没有代码时类似return,相当于运行中的断点,python中的协程就是用这个关键字,还会用在这个编程中
#在python中,yield之前是初始化操作,之后是清除操作
org_api.delete(org['_id'])
def test_tc000001(before_tc000001):
global org
org_api=before_tc000001
#step1
org=org_api.add(name='研发部')
#step2
orgs=org_api.list_all()
assert org in orgs#检查列表中包含刚刚创建的部门信息
组织项目结构
根据功能点:每个功能,如果都需要用到相同的数据环境,那就需要每个功能点里面构造,不能共享数据环境
根据数据环境:相同数据环境下实现不同功能的测试用例,可以做到数据环境共享,不用重复创造数据环境
现在需要创建一个管理员登录的数据环境,然后在这个环境里面新建一个conftest文件,写登录的方法
同时在这里面编写没有分部环境的方法
from conf.env import g_email, g_pwd
from pylib.webapi.common import login
import pytest
from pylib.webapi.bussiness import OrganizAPI
@pytest.fixture(scope='session')
def init_admin():
cookies = login(g_email, g_pwd)
return cookies
@pytest.fixture(scope='session')
def empty_organization(init_admin):
org_api=OrganizAPI(init_admin)
org_api.delete_all()
return org_api
接着优化测试用例
test_organizapi.py
@pytest.fixture()
def before_tc000001(empty_organization):
org_api=empty_organization
yield org_api #yield后面没有代码时类似return,相当于运行中的断点,python中的协程就是用这个关键字,还会用在这个编程中
#在python中,yield之前是初始化操作,之后是清除操作
org_api.delete(org['_id'])
重新执行用例,可以执行成功