对python自动生成接口测试的示例讲解

在python中Template可以将字符串的格式固定下来,重复利用。 同一套测试框架为了可以复用,所以我们可以将用例部分做参数化,然后运用到各个项目中。

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

coding=utf-8

'''

作者:大石

功能:自动生成pyunit框架下的接口测试用例

环境:python2.7.6

用法:将用户给的参数处理成对应格式,然后调用模块类生成函数,并将参数传入即可

'''

  

from string import Template

#动态生成单个测试用例函数字符串

def singleMethodCreate(MethodList,interfaceNamePara):

  code=Template('''\n  def test_${testcase}(self):

    u"""${testcaseName}"""

    headers = $headers

    data = $data

    re = requests.$method(url='$url',headers=headers,data=data)

    status_code = re.status_code

    s = str(status_code)

    json = re.text

    logging.info('-'*5+'返回状态码是'+s+'-'*5)

    logging.info('-'*5+'返回结果集是'+json+'-'*5)

    assert status_code == 200

    assert json['status'] == 'ok'

''')

  

  string = code.substitute(testcase=MethodList["testcase"],testcaseName=MethodList["TestcaseName"],

               method=MethodList['method'],url=MethodList['url'],headers=MethodList['headers'],data=MethodList['data'],

               )

  return string

  

#拼接单个的测试用例函数字符串为完整字符串并传回主函数

#MethodParaList获取测试用例部分list

def methodCreate(MethodParaList,interfaceNamePara):

  string = ""

  for MethodPara in MethodParaList:

    string2=singleMethodCreate(MethodPara,interfaceNamePara)

    string=string+string2

  return string

  

#构造单个测试集

def singleTestsuitCreate(MethodList,parameters):

  code = Template('''suite.addTest(${className}("test_${testcase}"))''')

  string = code.substitute(testcase = MethodList["testcase"],className = parameters[0])

  return string

  

#添加测试集

def addtestsuit(MethodParaList,interfaceNamePara):

  string = ""

  for MethodPara in MethodParaList:

    string2 = singleTestsuitCreate(MethodPara,interfaceNamePara)

    string=string+string2

  return string

  

#生成测试用例类函数字符串

def modelClassCreate(parameters):

  modelCode = methodCreate(parameters[2],parameters[1])

  adtestsuit = addtestsuit(parameters[2],parameters)

  code = Template('''#coding: utf-8

"""

作者:大石

功能:待执行的接口测试用例

环境:python2.7.6

用法:通过框架自动触发调用

"""

import unittest,requests,datetime,sys,logging,BSTestRunner,time,os

from Log import Log

class ${className}(unittest.TestCase):

  u"""待测试接口:${interfaceName}"""

  def setUp(self):

    logging.info('-'*5+"begin test"+"-"*5)

  def tearDown(self):

    logging.info('-'*5+"end test"+'-'*5)

  ${model}

if __name__ == "__main__":

  #解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 97: ordinal not in range(128)

  reload(sys)

  sys.setdefaultencoding('utf8')

  #构造测试集

  suite = unittest.TestSuite()

  ${testsuite}

  #定义date为日期,time为时间

  date=time.strftime("%Y%m%d")

  time1=time.strftime("%H%M%S")

  now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))

  #创建路径

  path='F:/test/study/yaml/test_log/'+now+"/"

  #解决多次执行时报路径已存在的错误

  try:

    os.makedirs(path)

  except:

    if path!= None:

      logging.error(u'当前路径已经存在')

  filename=path+'Report.html'

  fp=file(filename,'wb')

  #日志记录

  Log.log()

  #执行测试

  runner =BSTestRunner.BSTestRunner(stream=fp,title=u'下单平台接口测试用例',description=u'接口用例列表:')

  runner.run(suite)

  fp.close()

''')

  fileStr = code.substitute(className=parameters[0],interfaceName=parameters[1],testsuite=adtestsuit,model=modelCode)

  f=open(parameters[0]+".py",'w')

  f.write(fileStr)

  f.close()

然后测试用例部分如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

parameters=["Testcase_Orders",

        "/login",

        [

          {"TestcaseName":"测试登录","method":"post","url":"http://www.senbaba.cn/login","headers":{'content-type': 'application/json',

          'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',

          'Accept':'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*',

          'Accept-Language':'zh-CN'},"data":{"uname":"187071484771","pwd":"123456"},

            "testcase":"login"},

  

          {"TestcaseName":"测试登录","method":"post","url":"http://www.senbaba.cn/login1","headers":{'content-type': 'application/json',

          'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',

          'Accept':'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*',

          'Accept-Language':'zh-CN'},"data":{"uname":"187071484771","pwd":"123457"},

            "testcase":"login_failed"}

        ]

      ]

自动生成的测试用例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

#coding: utf-8

"""

作者:大石

功能:待执行的接口测试用例

环境:python2.7.6

用法:通过框架自动触发调用

"""

import unittest,requests,datetime,sys,logging,BSTestRunner,time,os

from Log import Log

class Testcase_Orders(unittest.TestCase):

  u"""待测试接口:/login"""

  def setUp(self):

    logging.info('-'*5+"begin test"+"-"*5)

  

  def tearDown(self):

    logging.info('-'*5+"end test"+'-'*5)

  

   

  def test_login(self):

    u"""测试登录"""

    headers = {'Accept-Language': 'zh-CN', 'content-type': 'application/json', 'Accept': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}

    data = {'uname': '187071484771', 'pwd': '123456'}

    re = requests.post(url='http://www.senbaba.cn/login',headers=headers,data=data)

    status_code = re.status_code

    s = str(status_code)

    json = re.text

    logging.info('-'*5+'返回状态码是'+s+'-'*5)

    logging.info('-'*5+'返回结果集是'+json+'-'*5)

    assert status_code == 200

    assert json['status'] == 'ok'

  

  def test_login_failed(self):

    u"""测试登录"""

    headers = {'Accept-Language': 'zh-CN', 'content-type': 'application/json', 'Accept': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}

    data = {'uname': '187071484771', 'pwd': '123457'}

    re = requests.post(url='http://www.senbaba.cn/login1',headers=headers,data=data)

    status_code = re.status_code

    s = str(status_code)

    json = re.text

    logging.info('-'*5+'返回状态码是'+s+'-'*5)

    logging.info('-'*5+'返回结果集是'+json+'-'*5)

    assert status_code == 200

    assert json['status'] == 'ok'

  

  

if __name__ == "__main__":

  #解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 97: ordinal not in range(128)

  reload(sys)

  sys.setdefaultencoding('utf8')

  #构造测试集

  suite = unittest.TestSuite()

   

  suite.addTest(Testcase_Orders("test_login"))

  

  suite.addTest(Testcase_Orders("test_login_failed"))

  

  #定义date为日期,time为时间

  date=time.strftime("%Y%m%d")

  time1=time.strftime("%H%M%S")

  now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))

  #创建路径

  path='F:/test/study/yaml/test_log/'+now+"/"

  #解决多次执行时报路径已存在的错误

  try:

    os.makedirs(path)

  except:

    if path!= None:

      logging.error(u'当前路径已经存在')

  filename=path+'Report.html'

  fp=file(filename,'wb')

  #日志记录

  Log.log()

  #执行测试

  runner =BSTestRunner.BSTestRunner(stream=fp,title=u'下单平台接口测试用例',description=u'接口用例列表:')

  runner.run(suite)

  fp.close()

20171019添加测试集的一个简单方法:

1

2

3

4

5

6

7

8

9

10

11

12

#添加测试集

def addtestsuit(parameters):

  string = ""

  temp = Template('''\n  suite.addTest(${className}("test_${testcase}"))

''')

  l = len(parameters[2])

  for i in range(0,l):

    testcase1 = parameters[2][i]['testcase']

    string2 = temp.substitute(className = parameters[0],testcase = testcase1)

    string=string+string2

    print string

  return string

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
qq群号:485187702【暗号:csdn11】
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
视频+文档+PDF+面试题可以关注公众号:【软件测试小dao】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值