Bootstrap

Postman接口测试用例自动转成Python的测试脚本

在使用PosMan做服务端的自动化测试中,我们可以把测试用例加到一个Collection中,但是随着测试用例越来越多,以及工作的需求,我们需要把PostMan中的测试用例需要迁移到脚本的方式实现,平常的迁移思路是我们在脚本里面把之前的接口测试用例重新实现,这样相对而言它的成本是比较高的,特别是涉及的自动化测试用例特别多的时候。我们可以把Collection里面的测试用例导入出来,它是JSON的文件,然后我们解析这些JSON文件,让它自动的转成Python测试代码,从而轻松的完成这样的一个过程。被测试的API代码如下:

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

#!/usr/bin/env python

#!coding:utf-8

from flask import  Flask,jsonify

from flask_restful import  Api,Resource

app=Flask(__name__)

api=Api(app)

class LoginView(Resource):

   def get(self):

      return {'status':0,'msg':'ok','data':'this is a login page'}

   def post(self):

      parser=reqparse.RequestParser()

      parser.add_argument('username', type=str, required=True, help='用户名不能为空')

      parser.add_argument('password',type=str,required=True,help='账户密码不能为空')

      parser.add_argument('age',type=int,help='年龄必须为正正数')

      parser.add_argument('sex',type=str,help='性别只能是男或者女',choices=['女','男'])

      args=parser.parse_args()

      return jsonify(args)

api.add_resource(LoginView,'/login',endpoint='login')

if __name__ == '__main__':

   app.run(debug=True)

在PostMan里面创建Collection名称login,里面的接口测试用例具体如下:

服务端测试之PostMan自动生成测试脚本_接口测试

在PostMan里面导出该Collection,命名为login.json,login.json文件的内容为:

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

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

{

   "info": {

      "_postman_id": "982a3108-6710-4a71-aaf8-e62a00d1813c",

      "name": "login",

      "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"

   },

   "item": [

      {

         "name": "校验用户名不能为空",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response": []

      },

      {

         "name": "校验密码不能为空",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response": []

      },

      {

         "name": "校验性别参数不是男或者女",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"asdf\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response": []

      },

      {

         "name": "校验年龄不是正整数",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":\"rrest\"\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response": []

      },

      {

         "name": "校验登录成功",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":\"18\"\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response": []

      }

   ],

   "protocolProfileBehavior": {}

}

本质上而言,它就是一个JSON文件,使用Python文件对它进行反序列化处理成字典数据类型,然后操作字典,这个过程相对来说不难,具体实现的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#!/usr/bin/env python

#!coding:utf-8

import  requests

import  json

import  pytest

def operationJson():

   '''对login.json文件进行处理'''

   return json.load(open('login.json','r'))['item']

@pytest.mark.parametrize('datas',operationJson())

def test_api_login(datas):

   '''登录API的校验测试'''

   r=requests.request(

      method=datas['request']['method'],

      url=datas['request']['url']['raw'],

      json=json.loads(datas['request']['body']['raw']))

   print(json.dumps(r.json(),ensure_ascii=False))

if __name__ == '__main__':

   pytest.main(["-s","-v","test_login.py"])

使用Pytest框架的参数化几行代码就可以搞定了,当然断言需要单独的加。这个过程的思路其实非常简单,就是对JSON的文件处理成字典,然后利用Pytest框架的参数化来循环处理。当然可以把JSON文件简单的添加下断言,就更加智能化,添加的内容添加到response的里面内容,对login.json都在里面添加下验证点,完善后的文件内容为:

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

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

{

   "info": {

      "_postman_id": "982a3108-6710-4a71-aaf8-e62a00d1813c",

      "name": "login",

      "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"

   },

   "item": [

      {

         "name": "校验用户名不能为空",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response":

         {

            "message": {

               "username": "用户名不能为空"

            }

         }

      },

      {

         "name": "校验密码不能为空",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response":

         {

            "message": {

               "password": "账户密码不能为空"

            }

         }

      },

      {

         "name": "校验性别参数不是男或者女",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"asdf\",\n\t\"age\":18\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response":

         {

            "message": {

               "sex": "性别只能是男或者女"

            }

         }

      },

      {

         "name": "校验年龄不是正整数",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":\"rrest\"\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response":

         {

            "message": {

               "age": "年龄必须为正正数"

            }

         }

      },

      {

         "name": "校验登录成功",

         "request": {

            "method": "POST",

            "header": [

               {

                  "key": "Content-Type",

                  "name": "Content-Type",

                  "value": "application/json",

                  "type": "text"

               }

            ],

            "body": {

               "mode": "raw",

               "raw": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":\"18\"\n}",

               "options": {

                  "raw": {

                     "language": "json"

                  }

               }

            },

            "url": {

               "raw": "http://localhost:5000/login",

               "protocol": "http",

               "host": [

                  "localhost"

               ],

               "port": "5000",

               "path": [

                  "login"

               ]

            }

         },

         "response":

         {

            "age": 18,

            "password": "admin",

            "sex": "男",

            "username": "wuya"

         }

      }

   ],

   "protocolProfileBehavior": {}

}

继续完善测试代码,增加接口的断言,完善后的代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#!/usr/bin/env python

#!coding:utf-8

import  requests

import  json

import  pytest

def operationJson():

   '''对login.json文件进行处理'''

   return json.load(open('login.json','r'))['item']

@pytest.mark.parametrize('datas',operationJson())

def test_api_login(datas):

   '''登录API的校验测试'''

   # print(type(datas['response']))

   r=requests.request(

      method=datas['request']['method'],

      url=datas['request']['url']['raw'],

      json=json.loads(datas['request']['body']['raw']))

   assert r.json()==datas['response']

if __name__ == '__main__':

   pytest.main(["-s","-v","test_login.py"])

执行如上的测试代码,见如下图展示的执行结果信息:

服务端测试之PostMan自动生成测试脚本_自动化测试_02

依据如上,很轻松的实现了PostMan里面的接口测试用例自动的转成了Python的测试脚本,而且带了断言的信息。

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

;