前言
前面總結了一篇關於接口測試的常規面試題,如今接口自動化測試用的比較多,也是被不少公司看好。那麼想作接口自動化測試須要具有哪些能力呢?
也就是面試的過程當中,面試官會考哪些問題,知道你是否是真的作過接口自動化測試?總的來講問的比較多的就是如下幾個問題:php
1.json和字典的區別? -對基礎數據類型的考察
2.測試的數據你放在哪? -數據與腳本分離
3.參數化 - 數據驅動模式
4.下個接口請求參數依賴上個接口的返回數據 - 參數關聯
5.依賴於登陸的接口如何處理 -token和session的管理
6.依賴第三方的接口如何處理 -mock模擬數據返回
7.不可逆的操做,如何處理,好比刪除一個訂單這種接口如何測試 -造數據
8.接口產生的垃圾數據如何清理 - 數據清理
9.一個訂單的幾種狀態如何所有測到,如:未處理,處理中,處理失敗,處理成功 - 造數據,改數據庫訂單狀態
10.python如何鏈接數據庫操做?
11.其它的就是運行出報告、代碼管理(git)、運行策略和持續集成jenkins相關了html
1.json和字典dict的區別?
如今自動化培訓爛大街,是我的都能說的上幾個框架,面試若是問框架相關問題,求職者只需一瓶82年的雪碧,會吹的讓你懷疑人生!
因此面試官爲了更清楚的知道你是停留在表面上的花拳繡腿仍是有紮實的基礎,就不會問框架這種東西了。基本上問幾個數據類型的基礎就知道有沒貨了。java
那麼json和字典到底有什麼區別呢?初學者連python的基礎數據類型都沒搞清楚,直接擼框架,有的人學了幾個月可能都迷迷糊糊的,覺得json就是字典。這個是確定不對的。python
首先python裏面的基礎數據類型有:int、str、 float、list、bool、tuple、dict、set這幾種類型,裏面沒json這種數據類型。mysql
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用徹底獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提高網絡傳輸效率。git
因爲你的代碼是python寫的(也有多是php,java,c,ruby等語言),可是後端接口是java寫的(也有多是其它語言),不一樣的語言數據類型是不同的(就比如中國的語言和美國的語言數據類型也不同,中國的通常說一隻羊,一頭牛,美國都是 a /an這種單位),因此就致使你提交的數據,別的開發語言沒法識別,這就須要規範傳輸的數據(傳輸的數據都是一個字符串),你們都遵循一個規範,按一個標準的格式去傳輸,因而就有就json這種國際化規範的數據類型。github
json本質上仍是字符串,只是按key:value這種鍵值對的格式來的字符串面試
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
運行結果sql
<class 'dict'> {"a": 1, "b": 2, "c": true} <class 'str'> {'a': 1, 'b': 2, 'c': True}
2.測試的數據你放在哪?
測試數據到底該怎麼放,這個是面試官最喜歡問的一個題了,彷佛仁者見仁智者見智,沒有標準的答案,有的人說放excel,也有的說放.py腳本,也有的說放ini配置文件,
還有放到json,yaml文件,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 = user self.user = psw self.result = result def 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(verbosity=2)
若是用的是pytest框架,也能實現參數化
# content of test_canshu1.py # coding:utf-8 import pytest @pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6 * 9", 42), ]) def test_eval(test_input, expected): assert eval(test_input) == expected if __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就能夠了
參考這篇【python接口自動化26-參數關聯和JSESSIONID(上個接口返回數據做爲下個接口請求參數)】
5.依賴於登陸的接口如何處理
登陸接口依賴token的,能夠先登陸後,token存到一個yaml或者json,或者ini的配置文件裏面,後面全部的請求去拿這個數據就能夠全局使用了
參考以前分享的一篇python接口自動化24-有token的接口項目使用unittest框架設計
若是是cookies的參數,能夠用session自動關聯
s=requests.session()
後面請求用s.get()和s.post()就能夠自動關聯cookies了
6.依賴第三方的接口如何處理
這個須要本身去搭建一個mock服務,模擬接口返回數據,參考【python筆記25-mock-server之moco】(https://www.cnblogs.com/yoyoketang/p/9348552.html)
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持續集成相關