入参为:字典模板及字典是否必填
出参为:字典必填为空列表

class Data:
    
    # 字典模板    -可以为列表 也可以是字典
    order_data_model = [{"oreder": "123", "oreder2": "123", "oreder3": "123",
                         "items": [{"item1": "123", "item2": "123", "item3": "123"}], "oreder4": "123","dd": [{"ddd": [{"dddd": "123", }]}]}]
    # 字典值是否必填
    order_data_define = [
        {"oreder": True, "oreder2": False, "oreder3": True, "items": [{"item1": True, "item2": False, "item3": True}],
         "oreder4": True,"dd": [{"ddd": [{"dddd": True}]}]}]
from data import Data
import copy


class CheckData:
    def __init__(self, data_model, data_define):
        # 最初全数据
        self.data_model = data_model
        self.data_define = data_define
        # 目前层级数据
        self.item_model = {}
        self.item_define = {}
        # 必填为空的数据列表
        self.data_list = []

    # 数据最外层为list时,进入下一层
    def deeper(self):
        self.data_model = self.data_model[0]
        self.data_define = self.data_define[0]

    # 数据字典值为list时,进入下一层
    def deeper_key(self, key):
        self.item_model = self.data_model[key][0]
        self.item_define = self.data_define[key][0]

    # 返回必填字段为空的列表
    def get_null_data_list(self):
        # 如果数据为列表-下一层-并返回列表集合[[{}],[{}]]-再给[{},{}]加一层[]:[[{}],[{}]]
        if type(self.data_define) == list:
            self.deeper()
            self.__get_null_data_list()
            list_all = []
            for data in self.data_list:
                list_all.append([data])
            self.data_list = list_all
            return self.data_list
        else:
            # 如果数据模板最外层为字典-直接返回字典列表[{},{}]
            self.__get_null_data_list()
            return self.data_list

    def __get_null_data_list(self):
        # 用于返回必填字段为空的列表
        # 存储目前置空数据
        data = copy.deepcopy(self.data_model)
        # 循环模板字典 拿到键值对-模板保持不变
        for key, value in self.data_model.items():
            # 如果字典值不是列表
            if type(self.data_define[key]) != list:
                # 如果定义数据不是非必填-才置空
                if self.data_define[key] != False:
                    data[key] = ""
                    # 加入到返回列表
                    self.data_list.append(copy.deepcopy(data))
                    # 重置数据
                    data[key] = value
            else:
                # 继续读列表
                data[key] = ""
                # 加入到返回列表
                self.data_list.append(copy.deepcopy(data))
                # 重置数据
                data[key] = value
                # 下一层
                self.deeper_key(key)
                # 循环字典 拿到键值对
                for key2, value2 in self.item_model.items():
                    # 如果字典值不是列表
                    if type(self.item_define) != list:
                        if self.item_define[key2] != False:
                            data[key][0][key2] = ""
                            self.data_list.append(copy.deepcopy(data))
                            data[key][0][key2] = value2
                    else:
                        # 不读第四层
                        pass


if __name__ == '__main__':
    cd = CheckData(Data.order_data_model, Data.order_data_define).get_null_data_list()
    print(cd)
    for a in cd:
        print(a)

打印结果

[[{'oreder': '', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': '', 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': ''}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '', 'dd': [{'ddd': [{'dddd': '123'}]}]}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': ''}], [{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': ''}]}]]
[{'oreder': '', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': '', 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': ''}], 'oreder4': '123', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '', 'dd': [{'ddd': [{'dddd': '123'}]}]}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': ''}]
[{'oreder': '123', 'oreder2': '123', 'oreder3': '123', 'items': [{'item1': '123', 'item2': '123', 'item3': '123'}], 'oreder4': '123', 'dd': [{'ddd': ''}]}]

结合数据驱动、对每个数据都进行一次验证

import pytest
from data import Data
from checkdata import CheckData


class TestCase:

    @pytest.mark.parametrize('data',CheckData(Data.order_data_model, Data.order_data_define).get_null_data_list())
    def test_case(self,data):
        # res = create_order(data)
        # assert res.text['success'] == False 
        assert data is None


if __name__ == '__main__':
    pytest.main()