凡科网站免费版,简述网站建设,frontpage网站建设论文,网站维护源码自适应前言
前面总结了一篇关于接口测试的常规面试题#xff0c;现在接口自动化测试用的比较多#xff0c;也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢#xff1f; 也就是面试的过程中#xff0c;面试官会考哪些问题#xff0c;知道你是不是真的做过接口自动…前言
前面总结了一篇关于接口测试的常规面试题现在接口自动化测试用的比较多也是被很多公司看好。那么想做接口自动化测试需要具备哪些能力呢 也就是面试的过程中面试官会考哪些问题知道你是不是真的做过接口自动化测试总的来说问的比较多的就是以下几个问题
1.json和字典的区别 -对基础数据类型的考察 2.测试的数据你放在哪 -数据与脚本分离 3.参数化 - 数据驱动模式 4.下个接口请求参数依赖上个接口的返回数据 - 参数关联 5.依赖于登录的接口如何处理 -token和session的管理 6.依赖第三方的接口如何处理 -mock模拟数据返回 7.不可逆的操作如何处理比如删除一个订单这种接口如何测试 -造数据 8.接口产生的垃圾数据如何清理 - 数据清理 9.一个订单的几种状态如何全部测到如未处理处理中处理失败处理成功 - 造数据改数据库订单状态 10.python如何连接数据库操作 11.其它的就是运行出报告、代码管理git、运行策略和持续集成jenkins相关了
1.json和字典dict的区别
现在自动化培训烂大街是个人都能说的上几个框架面试如果问框架相关问题求职者只需一瓶82年的雪碧会吹的让你怀疑人生 所以面试官为了更清楚的知道你是停留在表面上的花拳绣腿还是有扎实的基础就不会问框架这种东西了。基本上问几个数据类型的基础就知道有没货了。
那么json和字典到底有什么区别呢?初学者连python的基础数据类型都没搞清楚直接撸框架有的人学了几个月可能都迷迷糊糊的以为json就是字典。这个是肯定不对的。
首先python里面的基础数据类型有int、str、 float、list、bool、tuple、dict、set这几种类型里面没json这种数据类型。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写同时也易于机器解析和生成并有效地提升网络传输效率。
由于你的代码是python写的也有可能是php,java,cruby等语言,但是后端接口是java写的也有可能是其它语言不同的语言数据类型是不一样的就好比中国的语言和美国的语言数据类型也不一样中国的一般说一只羊一头牛美国都是 a /an这种单位所以就导致你提交的数据别的开发语言无法识别这就需要规范传输的数据传输的数据都是一个字符串大家都遵循一个规范按一个标准的格式去传输于是就有就json这种国际化规范的数据类型。
json本质上还是字符串只是按keyvalue这种键值对的格式来的字符串
import json# a是字典dict
a {a: 1, b: 2, c: True}# b是json
b {a: 1, b: 2, c: true}print(type(a))
print(json.dumps(a)) # a转json运行结果
class dict
{a: 1, b: 2, c: true}
class str
{a: 1, b: 2, c: True}2.测试的数据你放在哪?
测试数据到底该怎么放这个是面试官最喜欢问的一个题了似乎仁者见仁智者见智没有标准的答案有的人说放excel也有的说放.py脚本也有的说放ini配置文件 还有放到jsonyaml文件txt文件甚至有的放数据库五花八门一百个做自动化的小伙伴有100个放的地方。
这里总结下测试的数据到底该怎么放
首先测试的数据是分很多种的有登录的账户数据也有注册的账户数据还有接口的参数还有邮箱配置的数据等等等等所以这个题不能一概而论给答死了。要不然就是给自己挖坑。
以下两个大忌不能回答
测试的数据是不能写死到代码里面的这个是原则问题也是写代码的大忌你要是回答写在代码里面估计就是回去等通知了测试数据放到.py的开头这种其实很方便对于少量的固定不变的数据其实是可以放的但是面试时候千万不能这样说面试官喜欢装逼的方法
测试数据存放总结
1.对于账号密码这种管全局的参数可以用命令行参数单独抽出来写的配置文件里如ini 2.对于一些一次性消耗的数据比如注册每次注册不一样的数可以用随机函数生成 3.对于一个接口有多组测试的参数可以参数化数据放yaml,text,json,excel都可以 4.对于可以反复使用的数据比如订单的各种状态需要造数据的情况可以放到数据库每次数据初始化用完后再清理 5.对于邮箱配置的一些参数可以用ini配置文件 6.对于全部是独立的接口项目可以用数据驱动方式用excel/csv管理测试的接口数据 7.对于少量的静态数据比如一个接口的测试数据也就2-3组可以写到py脚本的开头十年八年都不会变更的
总之不同的测试数据可以用不同的文件管理
3.什么是数据驱动如何参数化
参数化和数据驱动的概念这个肯定要知道的参数化的思想是代码用例写好了后不需要改代码只需维护测试数据就可以了并且根据不同的测试数据生成多个用例 python里面用unittest框架
import unittest
import ddt# 测试数据
datas [ {user: admin, psw: 123, result: true},{user: admin1, psw: 1234, result: true},{user: admin2, psw: 1234, result: true},{user: admin3, psw: 1234, result: true},{user: admin4, psw: 1234, result: true},{user: admin5, psw: 1234, result: true},{user: admin6, psw: 1234, result: true},{user: admin7, psw: 1234, result: true},{user: admin8, psw: 1234, result: true},{user: admin9, psw: 1234, result: true},{user: admin10, psw: 1234, result: true},{user: admin11, psw: 1234, result: true}]ddt.ddt
class Test(unittest.TestCase):ddt.data(*datas)def test_(self, d):上海-悠悠{0}print(测试数据%s % d)if __name__ __main__:unittest.main()unittest框架还有一个paramunittest也可以实现
import unittest
import paramunittest
import time
# python3.6
# 作者上海-鱼鱼paramunittest.parametrized({user: admin, psw: 123, result: true},{user: admin1, psw: 1234, result: true},{user: admin2, psw: 1234, result: true},{user: admin3, psw: 1234, result: true},{user: admin4, psw: 1234, result: true},{user: admin5, psw: 1234, result: true},{user: admin6, psw: 1234, result: true},{user: admin7, psw: 1234, result: true},{user: admin8, psw: 1234, result: true},{user: admin9, psw: 1234, result: true},{user: admin10, psw: 1234, result: true},{user: admin11, psw: 1234, result: true},
)class TestDemo(unittest.TestCase):def setParameters(self, user, psw, result):这里注意了user, psw, result三个参数和前面定义的字典一一对应self.user userself.user pswself.result resultdef testcase(self):print(开始执行用例--------------)time.sleep(0.5)print(输入用户名%s % self.user)print(输入密码%s % self.user)print(期望结果%s % self.result)time.sleep(0.5)self.assertTrue(self.result true)if __name__ __main__:unittest.main(verbosity2)如果用的是pytest框架也能实现参数化
# content of test_canshu1.py# coding:utf-8import pytest
pytest.mark.parametrize(test_input,expected,[ (35, 8),(24, 6),(6 * 9, 42),])
def test_eval(test_input, expected):assert eval(test_input) expectedif __name__ __main__:pytest.main([-s, test_canshu1.py])pytest里面还有一个更加强大的功能获得多个参数化参数的所有组合可以堆叠参数化装饰器
import pytest
pytest.mark.parametrize(x, [0, 1])
pytest.mark.parametrize(y, [2, 3])
def test_foo(x, y):print(测试数据组合x-%s, y-%s % (x, y))if __name__ __main__:pytest.main([-s, test_canshu1.py])4.下个接口请求参数依赖上个接口的返回数据
这个很容易不同的接口封装成不同的函数或方法需要的数据return出来用一个中间变量a去接受后面的接口传a就可以了
5.依赖于登录的接口如何处理
登录接口依赖token的可以先登录后token存到一个yaml或者json或者ini的配置文件里面后面所有的请求去拿这个数据就可以全局使用了
如果是cookies的参数可以用session自动关联 srequests.session() 后面请求用s.get()和s.post()就可以自动关联cookies了
6.依赖第三方的接口如何处理
这个需要自己去搭建一个mock服务模拟接口返回数据
moco是一个开源的框架在github上可以下载到https://github.com/dreamhead/moco
moco服务搭建需要自己能够熟练掌握面试会问你具体如何搭建 如何模拟返回的数据是用的什么格式如何请求的
7.不可逆的操作如何处理比如删除一个订单这种接口如何测试
此题考的是造数据的能力接口的请求数据很多都是需要依赖前面一个状态的 比如工作流这种流向不同的人状态不一样操作权限不一样测试的时候每种状态都要测到,就需要自己会造数据了。 平常手工测试造数据直接在数据库改字段状态。那么自动化也是一样造数据可以用python连数据库了做增删改查的操作 测试用例前置操作setUp做数据准备 后置操作tearDown做数据清理
8.接口产生的垃圾数据如何清理
跟上面一样造数据和数据清理需用python连数据库了做增删改查的操作 测试用例前置操作setUp做数据准备 后置操作tearDown做数据清理
9.一个订单的几种状态如何全部测到如未处理处理中处理失败处理成功
跟上面一样也是考察造数据修改数据的状态
10.python如何连接数据库操作
这个就是详细的考察你是如何用python连数据库的并且最好能现场写代码那种有的笔试题就是python连数据库 具体问你用到哪个模块查询的数据是什么类型如何删除数据如何新增数据如何修改数据 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库Python2中则使用mysqldb。 详情参考教程http://www.runoob.com/python3/python3-mysql.html
#!/usr/bin/python3
# 查询EMPLOYEE表中salary工资字段大于1000的所有数据
import pymysql# 打开数据库连接
db pymysql.connect(localhost,testuser,test123,TESTDB )# 使用cursor()方法获取操作游标
cursor db.cursor()# SQL 查询语句
sql SELECT * FROM EMPLOYEE \WHERE INCOME %s % (1000)
try:# 执行SQL语句cursor.execute(sql)# 获取所有记录列表results cursor.fetchall()for row in results:fname row[0]lname row[1]age row[2]sex row[3]income row[4]# 打印结果print (fname%s,lname%s,age%s,sex%s,income%s % \(fname, lname, age, sex, income ))
except:print (Error: unable to fetch data)# 关闭数据库连接
db.close()其它的就是运行出报告、代码管理git、运行策略和持续集成jenkins相关了这个所以的自动化但是一样的后面会单独讲一篇jenkins持续集成相关