自动化测试有两种驱动: 1、数据驱动 ,数据从excel/txt中来
2、代码驱动,有业务流程
atp只能实现数据驱动
utp能实现数据驱动和代码驱动
注册---登录---抽奖 接口测试(代码驱动)
test_cj.py
import unittest from conf.setting import default_host from core.my_requests import MyRequest from core.tools import mysql,get_real_value from core.tools import r as redis class Cj(unittest.TestCase): password = 'aA123456' username = 'testhhh' def reg(self): '''注册接口''' url = '/api/user/user_reg' new_url = default_host + url data = {'username':self.username,'pwd':self.password, 'cpwd':self.password} r = MyRequest(new_url,data) result = r.post() self.assertEqual(1,result.get('status'),msg='注册接口不通,%s'%result.get('data')) #校验接口是不是通的 error_code = result.get('data').get('error_code') self.assertEqual(0,error_code,msg='注册失败,%s'%result.get('data')) sql ='select * from app_myuser where username = "%s";'%self.username sql_res = mysql.execute_one(sql)#执行sql self.assertIsNotNone(sql_res) #判断数据库返回的是否为空 def login(self): '''登录接口''' url = default_host + '/api/user/login' data = {'username':self.username,'passwd':self.password} r = MyRequest(url,data)#发请求 result = r.post() self.assertEqual(1,result.get('status'),msg='登录接口不通,%s'%result.get('data')) sign = get_real_value('sign',result)#从返回值里面取到sign的值 self.assertIsNotNone(sign,msg='登录失败:%s'%result)#校验sign 校验的msg都是在失败的时候才会打印 userid = get_real_value('userId',result)#从返回值里面取到userid的值 return userid,sign def choujiang(self): '''抽奖接口''' url = default_host+'/api/product/choice' userid,sign = self.login() data = {'userid':userid,'sign':sign} r = MyRequest(url,data) result = r.get() self.assertEqual(1, result.get('status'), msg='抽奖接口不通,%s' % result.get('data')) redis_key ='choujiang:%s'%self.username count = redis.get(redis_key) #操作redis,取key self.assertEqual('1',count,'抽奖次数错误%s'%result) #redis中取出的count值是一个字符串 sql='select count(*) as cishu from app_record where user_id = %s ;'%userid cishu = mysql.execute_one(sql).get('cishu') #执行sql execute_one(sql)返回的是一个字典,再从字典中取出cishu # {'cishu':1} self.assertEqual(1,cishu,'抽奖记录没有落到数据库里面!') #校验抽奖次数和数据库中是否对的上 def test_choujiang(self): '''抽奖流程测试''' self.reg() self.choujiang() @classmethod def tearDownClass(cls): ##数据清除的工作 保证回归测试时 username能重复使用 sql='delete from app_myuser where username="%s" ;'%cls.username mysql.execute_one(sql) key='choujiang:%s'%cls.username redis.delete(key) print('测试数据清理完成。。') # 有很多表要清除时 #1、先把以前的数据库备份 # mysqldump -uroot -p123456 -h192.168.1.13 db>/xxx/xx/a.sql # 2、执行自动化case # 3、把数据库恢复回来 # sql.excute('RENAME database main TO main_20181204;') # sql.excute('create database main;') # os.system('mysql -uroot -p123456 -h192.168.1.13 db>/xxx/xx/a.sql')