巧用PyUnit中unittest特性解決接口測試產生髒數據問題
一、背景
測試數據創建後需要對其刪除,不然可能產生髒數據,對開發和測試、生產環境造成一定影響。其接口框架是基於Python,API規範基於REST。
二、產生原因
(1)改進前:清除資源的操作放在每個正向測試用例裏,沒有在setUp和tearDown中刪除。
(2)改進後:在setUp中初始化資源id=None,每次創建資源時會生產一個資源id,然後在tearDown中,判斷資源的id是否爲None,if不爲None,then delete 資源並將資源id重新賦值爲None。這樣不管有沒有執行成功,最終都會在tearDown中刪除被創建成功的資源,初始化工作放在setUp中。
三、代碼對比
(1)改進前:清除資源的操作放在每個正向測試用例裏,沒有在setUp和tearDown中刪除。代碼如下:
def test_konwledges_check_by_list_ok(self):
"""
lc知識點API:成功創建2個知識點後,批量查詢知識點詳細信息\
"""
title = 'knowledges'
flag = 0
response = self.knowledge.add_knowledges(title, flag)
message = "創建知識點接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
self.knowledges_id1 = data['identifier']
response = self.knowledge.add_knowledges(title, flag)
message = "創建知識點接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
self.knowledges_id2 = data['identifier']
knowledge_id_str = [self.knowledges_id1, self.knowledges_id2]
response = self.knowledge.check_konwledges_details_by_list(knowledge_id_str)
#print 'response: ' + str(response)
message = "批量查詢知識點詳細信息接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
print data
assert data[self.knowledges_id1]
assert data[self.knowledges_id2]
self.knowledge.delete_konwledges(knowledge_id1)#放在測試用例中刪除
self.knowledge.delete_konwledges(knowledge_id2)#放在測試用例中刪除
a.setUp和tearDown中改進:
def setUp(self):
print 'start run KnowledgeTest(知識點接口)......'
self.knowledge = Knowledge()
self.lessons = Lessons()
self.instructional = Instructional(id)
self.teaching_material = TeachingMaterial()
self.rest_o = CoRestful.Restful()
self.rand_o = CoRand()
self.knowledges_id = None
self.knowledges_id1 = None
self.knowledges_id2 = None
self.knowledge_relation_id = None
def tearDown(self):
#判斷資源的id是否爲None,if不爲None,then delete 資源並將資源id重新賦值爲None<span style="font-family: Arial, Helvetica, sans-serif;">,</span>這樣不管有沒有執行成功,最終都會在tearDown中刪除被創建成功的資源
if self.knowledge_relation_id != None:
self.knowledge.delete_relation(self.knowledge_relation_id)
if self.knowledges_id2 != None:
self.knowledge.delete_konwledges(self.knowledges_id2)
if self.knowledges_id1 != None:
self.knowledge.delete_konwledges(self.knowledges_id1)
if self.knowledges_id != None:
self.knowledge.delete_konwledges(self.knowledges_id)
print '------------------------------------------------------'
def test_konwledges_check_by_list_ok(self):
"""
lc知識點API:成功創建2個知識點後,批量查詢知識點詳細信息\
"""
title = 'knowledges'
flag = 0
response = self.knowledge.add_knowledges(title, flag)
message = "創建知識點接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
self.knowledges_id1 = data['identifier']
response = self.knowledge.add_knowledges(title, flag)
message = "創建知識點接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
self.knowledges_id2 = data['identifier']
knowledge_id_str = [self.knowledges_id1, self.knowledges_id2]
response = self.knowledge.check_konwledges_details_by_list(knowledge_id_str)
#print 'response: ' + str(response)
message = "批量查詢知識點詳細信息接口返回失敗"
code = 200
data = self.rest_o.parse_response(response, code, message)
print data
assert data[self.knowledges_id1]
assert data[self.knowledges_id2]
#註釋原在測試用例中刪除的代碼
#self.knowledge.delete_konwledges(knowledge_id1)
#self.knowledge.delete_konwledges(knowledge_id2)
發現問題要多思考,並努力把其解決。