You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单元测试未覆盖if语句:如何编写测试用例实现全覆盖?

问题分析

你的测试没覆盖到if分支,主要有三个核心原因:

  1. 第一个测试完全没传递任何参数,只会走默认逻辑,不会进入if 'industry' in request.form或if 'industry' in request.args分支
  2. 第二个测试用了GET方法传递data,但request.form只在POST/PUT等请求中才会有数据;而且你传的参数名是industry_sele,但函数里判断的是industry,参数名不匹配
  3. 你没针对每个子分支(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:57:02