范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python基础之pytest参数化

  pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。在实际
  工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下
  @pytest.mark.parametrize装饰器,可以很好的解决上述问题。  源代码分析def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None):       """ Add new invocations to the underlying test function using the list         of argvalues for the given argnames.  Parametrization is performed       during the collection phase.  If you need to setup expensive resources     see about setting indirect to do it rather at test setup time.  # 使用给定argnames的argValue列表向基础测试函数添加新的调用,在收集阶段执行参数化。      :arg argnames: a comma-separated string denoting one or more argument                    names, or a list/tuple of argument strings.  # 参数名:使用逗号分隔的字符串,列表或元祖,表示一个或多个参数名      :arg argvalues: The list of argvalues determines how often a         test is invoked with different argument values.  If only one         argname was specified argvalues is a list of values.  If N         argnames were specified, argvalues must be a list of N-tuples,         where each tuple-element specifies a value for its respective         argname.  # 参数值:只有一个argnames,argvalues则是值列表。有N个argnames时,每个元祖对应一组argnames,所有元祖组合成一个列表      :arg indirect: The list of argnames or boolean. A list of arguments"         names (self,subset of argnames). If True the list contains all names from         the argnames. Each argvalue corresponding to an argname in this list will         be passed as request.param to its respective argname fixture         function so that it can perform more expensive setups during the         setup phase of a test rather than at collection time.      :arg ids: list of string ids, or a callable.         If strings, each is corresponding to the argvalues so that they are         part of the test id. If None is given as id of specific test, the         automatically generated id for that argument will be used.         If callable, it should take one argument (self,a single argvalue) and return         a string or return None. If None, the automatically generated id for that         argument will be used.         If no ids are provided they will be generated automatically from         the argvalues.  # ids:字符串列表,可以理解成标题,与用例个数保持一致      :arg scope: if specified it denotes the scope of the parameters.         The scope is used for grouping tests by parameter instances.         It will also override any fixture-function defined scope, allowing         to set a dynamic scope using test context or configuration.     # 如果指定,则表示参数的范围。作用域用于按参数实例对测试进行分组。    它还将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围。     """ argnames
  释义:参数名称
  格式:字符串"arg1,arg2,arg3"  aegvalues
  释义:参数值列表
  格式:必须是列表,如[val1,val2,val3]
  单个参数,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])
  多个参数,需要用元祖来存放值,一个元祖对应一组参数的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])  标识
  释义:可以理解为用例的id
  格式:字符串列表,如["case1","case2","case3"]  indirect
  释义:当indirect=True时,若传入的argnames是fixture函数名,此时fixture函数名将成为一个可执行的函数,
  argvalues作为fixture的参数,执行fixture函数,最终结果再存入 request.param;当indirect=False时,fixture
  函数只作为一个参数名给测试收集阶段调用。
  备注:这里可以将the setup phase(测试设置阶段)理解为配置 conftest.py 阶段,将the collection phase(
  测试收集阶段)理解为用例执行阶段。  装饰测试类import pytest   data = [     (2,2,4),     (3,4,12) ]  def add(a,b):     return a * b  @pytest.mark.parametrize("a,b,expect",data) class TestParametrize(object):     def test_parametrize_1(self,a,b,expect):         print(" 测试函数1测试数据为 {}-{}".format(a,b))         assert add(a,b) == expect      def test_parametrize_2(self,a,b,expect):         print(" 测试函数2测试数据为 {}-{}".format(a,b))         assert add(a,b) == expect  if __name__ == "__main__":     pytest.main(["-s","test_07.py"]) ============================= test session starts ============================= platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 rootdir: D:AutoCode plugins: html-3.1.1, metadata-1.11.0 collecting ... collected 4 items  test_07.py::TestParametrize::test_parametrize_1[2-2-4]  测试函数1测试数据为 2-2 PASSED test_07.py::TestParametrize::test_parametrize_1[3-4-12]  测试函数1测试数据为 3-4 PASSED test_07.py::TestParametrize::test_parametrize_2[2-2-4]  测试函数2测试数据为 2-2 PASSED test_07.py::TestParametrize::test_parametrize_2[3-4-12]  测试函数2测试数据为 3-4 PASSED  ============================== 4 passed in 0.12s ==============================  Process finished with exit code 0
  由以上代码可以看到,当装饰器装饰测试类时,定义的数据集合会被传递给类的所有方法。  装饰测试函数单个数据import pytest   data = ["Rose","white"]  @pytest.mark.parametrize("name",data) def test_parametrize(name):     print(" 列表中的名字为 {}".format(name))  if __name__ == "__main__":     pytest.main(["-s","test_07.py"]) ============================= test session starts ============================= platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 rootdir: D:AutoCode plugins: html-3.1.1, metadata-1.11.0 collected 2 items  test_07.py  列表中的名字为 Rose . 列表中的名字为 white .  ============================== 2 passed in 0.09s ==============================  Process finished with exit code 0
  当测试用例只需要一个参数时,我们存放数据的列表无序嵌套序列,@pytest.mark.parametrize("name", data)
  装饰器的第一个参数也只需要一个变量接收列表中的每个元素,第二个参数传递存储数据的列表,那么测试用
  例需要使用同名的字符串接收测试数据(实例中的name)且列表有多少个元素就会生成并执行多少个测试用例。  一组数据import pytest   data = [     [1, 2, 3],     [4, 5, 9] ]  # 列表嵌套列表 # data_tuple = [ #     (1, 2, 3), #     (4, 5, 9) # ]  # 列表嵌套元组   @pytest.mark.parametrize("a, b, expect", data) def test_parametrize_1(a, b, expect):  # 一个参数接收一个数据     print(" 测试数据为 {},{},{}".format(a, b, expect))     actual = a + b     assert actual == expect   @pytest.mark.parametrize("value", data) def test_parametrize_2(value):  # 一个参数接收一组数据     print(" 测试数据为 {}".format(value))     actual = value[0] + value[1]     assert actual == value[2]  if __name__ == "__main__":     pytest.main(["-s","test_07.py"]) ============================= test session starts ============================= platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 rootdir: D:AutoCode plugins: html-3.1.1, metadata-1.11.0 collected 4 items  test_07.py  测试数据为 1,2,3 . 测试数据为 4,5,9 . 测试数据为 [1, 2, 3] . 测试数据为 [4, 5, 9] .  ============================== 4 passed in 0.09s ==============================  Process finished with exit code 0
  当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据。
  装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测
  试用例函数也需要与其保持一致。
  当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需
  要使用索引的方式取得每个数据。
  当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素列表嵌套多少个多
  组小列表或元组,测生成多少条测试用例。  组合数据import pytest   data_1 = [1,2,3] data_2 = ["a","b"]  @pytest.mark.parametrize("a",data_1) @pytest.mark.parametrize("b",data_2) def test_parametrize_1(a,b):     print(f"笛卡尔积测试结果为:{a},{b}")  if __name__ == "__main__":     pytest.main(["-vs","test_06.py"])
  通过测试结果,我们不难分析,一个测试函数还可以同时被多个参数化装饰器装饰,那么多个
  装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n * n个测试用例。  标记用例import pytest   @pytest.mark.parametrize("test_input,expected",[     ("3+5",8),     ("2+4",6),     pytest.param("6 * 9",42,marks=pytest.mark.xfail),     pytest.param("6 * 6",42,marks=pytest.mark.skip) ])  def test_mark(test_input,expected):     assert eval(test_input) == expected   if __name__ == "__main__":     pytest.main(["-vs","test_06.py"])
  输出结果显示收集到4个用例,两个通过,一个被跳过,一个标记失败,当我们不想执行某组测试
  数据时,我们可以标记skip或skipif;当我们预期某组数据会执行失败时,我们可以标记为xfail等。  嵌套字典import pytest   data = (     {         "user": "name1",         "pwd": 123     },     {         "user": "name2",         "pwd": 456     } )  @pytest.mark.parametrize("dic",data) def test_parametrize(dic):     print(" 测试数据为 {}".format(dic))  if __name__ == "__main__":     pytest.main(["-vs","test_06.py"])
  增加测试结果可读性
  参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,
  为了增加可读性,我们可以标记每一个测试用例使用的测试数据是什么,适当的增加一些说明。
  在使用前你需要知道,ids参数应该是一个字符串列表,必须和数据对象列表的长度保持一致。  import pytest   data_1 = [     (1, 2, 3),     (4, 5, 9) ]  ids = ["a:{} + b:{} = expect:{}".format(a, b, expect) for a, b, expect in data_1]  def add(a, b):     return a + b  @pytest.mark.parametrize("a, b, expect", data_1, ids=ids) class TestParametrize(object):      def test_parametrize_1(self, a, b, expect):         print(" 测试函数1测试数据为 {}-{}".format(a, b))         assert add(a, b) == expect      def test_parametrize_2(self, a, b, expect):         print(" 测试函数2数据为 {}-{}".format(a, b))         assert add(a, b) == expect  if __name__ == "__main__":     pytest.main(["-v","test_06.py"])
  不加ids参数的返回结果
  加ids参数的返回结果
  我们可以看到带ids参数的返回结果中的用例都被一个列表明确的标记了,而且通过这种标记
  可以更加直观的看出来,每个测试用例使用的数据名称及测试内容。

又是李楠!CBA仅用2天出调查结果,4人受处罚,姚明面色沉重实际上,自从退役后,李楠一直从事教练员工作,然而为人所熟知的,主要集中在两段,分别是挂帅中国男篮,以及下课后,开始执教苏州队。或是由于出自同一人之手的缘故,19年的男篮,和23年的追苹果赶华为,小米13Ultra靠友商联盟打赢高端局?2023年,消费者对智能手机的期待与热情早已退却,但此时的行业内却是一番紧锣密鼓。库克突然闪现三里屯,瞬间为iPhone带来不小流量,华为OPPO相继发布新品,弹药依旧很足,沉寂许国乒女神白杨与马琳谈恋爱被开除,38岁嫁富商,如今怎么样了?在阅读此文前,麻烦您点击一下关注,方便您进行讨论和分享,给您带来不一样的参与感,感谢您的支持,小编将每日为您带来精彩内容,希望您不要错过哦文史作咏者编辑史作咏者前言2004年雅典奥日本濑户内海旅游锦囊(二)SETONAIKAI濑户内海高松Takamatsu高松是香川县的首府,四国地区最大的城市。城市面朝濑户内海,隔岸就是本州的冈山,占据着重要的地理地位。日本自古以本州为尊,很多战败的北部湾航空执行43条国内国际航线保障三月三旅客出行中新网广西新闻4月16日电(黎莉娜张言坚)再过几天,广西即将迎来壮族三月三传统节日。不少市民准备在壮族三月三小长假(2023年4月21日23日)期间外出旅游。为了保障壮族三月三期间小米13Ultra手机预热配2K超清屏C7,发光效率高于三星E6IT之家4月17日消息,根据此前消息,小米13Ultra将亮相4月18日晚7点的小米携光同行新品发布会,官方宣称其将开启移动影像光学时代。今日,小米官方发文为小米13Ultra预热五一游南京攻略及费用,第一次去南京旅游要看!也许你从未到过江南,然而这并不妨碍它早已在你脑海中形成鲜明的印象。如果你错过了江南的春,绝对不能再错过江南的秋,是时候坠入这片无法抵御的温柔乡了,南京超全五日游攻略送上!开始的时候兴趣消费引领潮流多元化产业形态释放更多消费活力央视网消息随着年轻人逐渐成为消费群体的主力军,以兴趣为主导的各式新型消费开始引领潮流。个性化体验感是兴趣消费主打的卖点,而兴趣消费更是消费和产业升级的重要风向标。随着年轻人对于个性吉水先贤故里少年研学来源江西日报江西新闻客户端4月12日,吉水县黄桥镇湴塘古村杨万里诗画小镇景区,黄桥镇中心小学的学生正在这里吟诵杨万里诗句,感受先贤的爱国情怀。黄桥镇湴塘古村是南宋著名爱国诗人杨万里上海市委及家属旅游团是真是假?揭开谣言背后的真相最近,有一张照片在网上引起了轩然大波。照片中,一辆皖牌旅游大巴前侧挂着一条横幅,上面写着中共上海市委及家属旅游团。这个旅游团的名字,让很多人感到震惊和愤怒。他们质疑,这是不是上海市人老了,逐渐斩断了这几种缘分,预示他将走到尽头人这一生,就是一次旅行。我们都是旅行车上的观览者,只有单程车票,而没有返程车票。到点了,终究是要下站的。下站,不一定是归去,还有远离红尘,超脱俗世的意思。要知道,人有两次超脱的机会
治疗耳鸣康复案例清肝泻火开郁健脾案例纪先生,从去年9月份有耳鸣情况,一开始为短暂的,早睡觉一段时间耳鸣情况有没有了,但是工作有时需要连续加班,外加精神紧张压力大出现了双耳耳鸣如蝉鸣,持续一个月左右到当地医院检查听白开水放凉好似慢性毒药?经常喝65以上的水会致癌?水是维持我们正常生理功能的一种营养素,人体中水的质量大约占健康成年人体重的6070。日常生活中,我们每天会在不同场景中摄入水,比如喝水喝茶喝饮料吃水果等等。网上有一些说法白开水放凉什么是肠化生,得了肠化生应该如何医治?肠化生是指胃粘膜上皮细胞被肠上皮细胞替代,一般就是胃粘膜细胞变成类似小肠或结肠上皮的粘膜细胞。肠化生症状是上腹疼痛不适烧心返酸恶心腹胀嗳气发热消瘦乏力贫血等症状。很多患者经常食用辛气虚或导致经常出汗,或与这5个问题有关,需及时调理大家都很清楚,到了炎热的夏天之后,温度升高,出汗是在所难免的事情,但一般情况下,如果没有做太多体力的活动,出汗量并不会很多。可是调查数据显示,生活中很多人明明没怎么活动,但是身体上为何云南地区大多爱喝自烤酒,这种酒口感到底如何?中国是酿酒大国,尤其盛产白酒,我们的酿酒史上下5000年有余,发展到如今,几乎每个省份都有自己的代表酒,如贵州茅台四川五粮液北京二锅头山西汾酒等等。但提到云南省却一个特别的存在,发四川唯一!宜宾蜀南竹海旅游度假区被确定为新一批国家级旅游度假区封面新闻记者伍雪梅1月11日,文化和旅游部发布消息,根据中华人民共和国国家标准旅游度假区等级划分与国家级旅游度假区管理办法,经有关省(区市)文化和旅游行政部门推荐,文化和旅游部按程年夜饭,有钱没钱,餐桌上都少不了这菜,好吃好做寓意团团圆圆2023年春节的脚步越来越近了,不少外乡的游子们都踏上了返乡的归途,有钱没钱,回家过年,回家过年是所有人一年中最大的期盼,与家人团聚,吃上母亲做的妈妈菜,与亲朋好友共叙家常在这个象天选做饭人看过来,为你量身定做的快手菜都说新冠还是很有眼力见的,每家每户都留下了一个做饭人。但是很多朋友都在反馈,太久没进厨房了,总平衡不了大米的量杯数,煮的饭总剩下来。也有小伙伴在苦恼着做什么,小羊人喊着嘴苦无味,看红薯和鸡蛋的这种做法,简单又好吃,无油无糖,实在是太解馋了天气渐渐变冷,烤红薯成了我家常吃的主食之一,现在红薯也便宜,一块多钱一斤的红薯也很甜,洗干净以后放到空气炸锅里烤一烤,香着呢。外面卖得贵,我家都是自己烤的,经济实惠。今天要分享一个璐比玛斯NOBEEMAS新年新气象过年怎么穿才好看?才能遇见更美的自己!迎来了新年,大家都对未来充满着期待,这个时候大家也都希望能够由一个好的面貌,来展现出个人的魅力,来迎接新的一年。其实过年回家过年少不了见亲戚朋31岁的邓紫棋从矮胖丑变高瘦美,只脱掉了一条皮裤你是否会因自己的容貌外形而感到焦虑?我想多少都会有点吧,毕竟人无完人,而大多数人都是完美主义,不愿意正视自己的缺点。穿搭是容貌外形的加分项,但是如果没有选对适合的衣服,找准适合的风