Python单元测试未覆盖if语句:如何编写测试用例实现全覆盖?
问题分析
你的测试没覆盖到if分支,主要有三个核心原因:
- 第一个测试完全没传递任何参数,只会走默认逻辑,不会进入
if 'industry' in request.form或if 'industry' in request.args分支 - 第二个测试用了
GET方法传递data,但request.form只在POST/PUT等请求中才会有数据;而且你传的参数名是industry_sele,但函数里判断的是industry,参数名不匹配 - 你没针对每个子分支(比如
open=False、closed=False等)单独写测试用例
解决方案
下面是分场景的测试用例,覆盖所有if分支:
1. 覆盖request.form相关分支(需用POST请求)
request.form的数据需要通过POST请求传递,参数名要和函数里的一致(industry、country、size、open、assign、closed):
def test_get_list_csv_form_full(self): # 测试带所有form参数的POST请求,覆盖外层if分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 # 注意参数名是industry,不是industry_sele,和函数里的request.form['industry']对应 form_data = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', 'open': 'on', # 模拟checkbox选中,对应request.form.get('open')为真 'assign': 'on', 'closed': 'on' } res = self.client.post("/getListCSV", data=form_data, follow_redirects=True) self.assertEqual(res.status_code, 200) def test_get_list_csv_form_open_false(self): # 测试open未选中的情况,覆盖内层if not request.form.get('open')分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 form_data = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', # 不传open,或者传空字符串,request.form.get('open')会返回None,即False 'assign': 'on', 'closed': 'on' } res = self.client.post("/getListCSV", data=form_data, follow_redirects=True) self.assertEqual(res.status_code, 200) def test_get_list_csv_form_closed_false(self): # 测试closed未选中的情况,覆盖移除converted和not converted的分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 form_data = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', 'open': 'on', 'assign': 'on', # 不传closed,触发closed=False的分支 } res = self.client.post("/getListCSV", data=form_data, follow_redirects=True) self.assertEqual(res.status_code, 200)
2. 覆盖request.args相关分支(用GET请求传查询参数)
request.args对应GET请求的查询参数,测试时用params参数传递,注意函数里判断的是request.args.get('open') == 'False',所以要传字符串'False':
def test_get_list_csv_args_full(self): # 测试带所有查询参数的GET请求,覆盖外层if 'industry' in request.args分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 query_params = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', 'open': 'True', 'assign': 'True', 'closed': 'True' } res = self.client.get("/getListCSV", params=query_params, follow_redirects=True) self.assertEqual(res.status_code, 200) def test_get_list_csv_args_open_false(self): # 测试open='False'的情况,覆盖内层if分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 query_params = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', 'open': 'False', # 必须是字符串'False',和函数里的判断条件匹配 'assign': 'True', 'closed': 'True' } res = self.client.get("/getListCSV", params=query_params, follow_redirects=True) self.assertEqual(res.status_code, 200) def test_get_list_csv_args_closed_false(self): # 测试closed='False'的情况,覆盖移除两个状态的分支 with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 query_params = { 'industry': 'Compliance', 'country': 'UK', 'size': '5000', 'open': 'True', 'assign': 'True', 'closed': 'False' } res = self.client.get("/getListCSV", params=query_params, follow_redirects=True) self.assertEqual(res.status_code, 200)
3. 补充:覆盖默认逻辑分支(原测试用例)
保留你原来的测试,覆盖没有任何参数的默认情况:
def test_get_list_csv_default(self): with self.client.session_transaction() as session: session['role'] = 'manager' session['id'] = 2 res = self.client.get("/getListCSV", follow_redirects=True) self.assertEqual(res.status_code, 200)
关键注意点
request.form仅在POST/PUT等请求中有效,GET请求的data参数不会被解析到request.form里- 参数名必须和函数里的一致:比如函数里是
request.form['industry'],你传的参数名就得是industry,不是industry_sele request.args获取的是字符串类型,所以判断request.args.get('open') == 'False'时,测试里要传字符串'False',而不是布尔值False
内容的提问来源于stack exchange,提问作者curious_guy
相关产品推荐
相关产品推荐

