def

pytest失败重跑插件: pytest-rerunfailures使用与坑(全网独家精华)

泪湿孤枕 提交于 2021-01-29 15:42:09
背景 在编写接口case的时候,我们常遇到一个这样的问题: 测试环境不稳定偶发接口超时(和服务无关,纯粹是环境问题),然后执行接口case也因此偶发失败。比如同一个接口case跑五次,其中有两次失败,另外三次都是成功的,这种偶发性的环境问题就需要我们手动重跑(还不一定能够通过)。有没有一个比较好的机制,保证case能够尽最大努力通过测试呢? 这里我们介绍pytest的一个失败重跑插件: pytest-rerunfailures 介绍 pytest-rerunfailures 是一个通过重跑机制来消除不稳定失败的pytest插件。 项目地址:https://github.com/pytest-dev/pytest-rerunfailures 安装 安装&运行要求: Python 3.6~3.9, or PyPy3 pytest 5.0+ 安装插件 sudo pip(pip3) install pytest-rerunfailures 使用pytest-rerunfailures 使用方式有两种: 命令行参数 装饰器方式 命令行参数模式 示例case:test_demo.py #!/usr/bin/env python3#!coding:utf-8import pytestimport randomdef test_simple_assume(): #每次case运行的值为1或者2

Python迭代器和生成器

青春壹個敷衍的年華 提交于 2021-01-29 07:14:09
一、 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 二、迭代器 2.1 python中的for循环 要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4 ]: print (i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print (i) 结果: Traceback (most recent call last): File " test.py " , line 4, in <module> for i in 1234 : TypeError: ' int ' object is not iterable 看,报错了!报了什么错呢?

Python爬虫学习—爬取微信朋友圈

两盒软妹~` 提交于 2021-01-27 04:20:57
这篇文章主要介绍了Python爬虫爬取微信朋友圈的方法,文中讲解非常细致,帮助大家更好的理解和学习Python爬虫,感兴趣的朋友可以了解下 接下来,我们将实现微信朋友圈的爬取。 如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为数据都是被加密的。而 Appium 不同,Appium 作为一个自动化测试工具可以直接模拟 App 的操作并可以获取当前所见的内容。所以只要 App 显示了内容,我们就可以用 Appium 抓取下来。 1. 本节目标 本节我们以 Android 平台为例,实现抓取微信朋友圈的动态信息。动态信息包括好友昵称、正文、发布日期。其中发布日期还需要进行转换,如日期显示为 1 小时前,则时间转换为今天,最后动态信息保存到 MongoDB。 2. 准备工作 请确保 PC 已经安装好 Appium、Android 开发环境和 Python 版本的 Appium API。Android 手机安装好微信 App、PyMongo 库,安装 MongoDB 并运行其服务,安装方法可以参考第 1 章。 3. 初始化 首先新建一个 Moments 类,进行一些初始化配置,如下所示: PLATFORM = 'Android' DEVICE_NAME = 'MI_NOTE_Pro' APP_PACKAGE = 'com.tencent

python数据类型常规用法

泄露秘密 提交于 2021-01-26 23:29:44
一、数字类型 1. 整型 num = -1000000000000000000000000000000000000000000000000 print(num, type(num)) 2. 小数   num = 3.14   print(num, type(num)) 3. 布尔   res = True   print(res, type(res), isinstance(res, int))   print(3.14 + True) 4. 复数   num = complex(5, 4) # 5 + 4j   print(num + (4 + 5j)) # 重点:数字类型直接的相互转化   a = 10   b = 3.74   c = True   print(int(a), int(b), int(c))   print(float(a), float(b), float(c))   print(bool(a), bool(b), bool(c)) 二、 字符串类型 1. 定义 : 可以有多种引号嵌套 # 需求:你是 " 好学生 " s1 = " 你是 \" 好学生 \"" print(s1) # 可以通过引号的嵌套,使内部不同的引号在不转义的情况下直接输出 s2 = ' 你是 " 好学生 "' print(s2) # 需求:你是 " 好学生 " ,是 ' 我的 ' s3

基于机智云物联网平台MCU模式基础教程及远程OTA

对着背影说爱祢 提交于 2021-01-26 19:42:31
编写背景: 用户如果将开发了的产品发布上线销售,后期需要更新固件和程序,就需要用到远程OTA固件升级,就能对已发布的产品进行远程升级。 材料准备: 1. 机智云 4G模组GC211,此模组采用中移模组ML302,需烧录机智云 GAgent 固件,可在机智云淘宝店铺购买或者联系商务获取,此模组支持网络,移动,联通,电信4G网络,可前往机智云官方和淘宝店铺购买。 https://shop159680395.taobao.com/ 2.秉火【F103开发板-指南者】 正文: 云端部署 创建新产品,可根据自己需求选择。 添加如下数据点,可根据自己需求 生成 STM32 F103代码下载备用 简述STM32 启动 ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址0x000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC =0x000000)同时中断向量表的位置并不是固定的。然而,Cortex-M3 内核启动有3 种情况: 1、通过boot 引脚设置可以将中断向量表定位于SRAM 区,即起始地址为0x2000000,同时复位后PC 指针位于0x2000000 处; 2、通过boot 引脚设置可以将中断向量表定位于FLASH 区,即起始地址为0x8000000,同时复位后PC 指针位于0x8000000 处; 3

LeetCode | 0590. N叉树的后序遍历【Python】

馋奶兔 提交于 2021-01-26 02:38:33
Problem LeetCode Given an n-ary tree, return the postorder traversal of its nodes' values. Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples). Follow up: Recursive solution is trivial, could you do it iteratively? Example 1: Input: root = [1,null,3,2,4,null,5,6] Output: [5,6,3,2,4,1] Example 2: Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] Output: [2,6,14,11,7,3,12,8,4,13,9,10,5,1] Constraints: The height of the n-ary tree is less than or

Scrapy实战:爬取http://quotes.toscrape.com网站数据

微笑、不失礼 提交于 2021-01-25 08:38:15
需要学习的地方: 1.Scrapy框架流程梳理,各文件的用途等 2.在Scrapy框架中使用MongoDB数据库存储数据 3.提取下一页链接,回调自身函数再次获取数据 重点:从当前页获取下一页的链接,传给函数自身继续发起请求 next = response.css('.pager .next a::attr(href)').extract_first() # 获取下一页的相对链接 url = response.urljoin(next) # 生成完整的下一页链接 yield scrapy.Request(url=url, callback=self.parse) # 把下一页的链接回调给自身再次请求 站点:http://quotes.toscrape.com 该站点网页结构比较简单,需要的数据都在div标签中 操作步骤: 1.创建项目 # scrapy startproject quotetutorial 此时目录结构如下: 2.生成爬虫文件 # cd quotetutorial # scrapy genspider quotes quotes.toscrape.com # 若是有多个爬虫多次操作该命令即可 3.编辑items.py文件,获取需要输出的数据 import scrapy class QuoteItem(scrapy.Item): # define the fields

<scrapy爬虫>爬取quotes.toscrape.com

风格不统一 提交于 2021-01-25 07:35:16
1.创建scrapy项目 dos窗口输入: scrapy startproject quote cd quote 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) import scrapy class QuoteItem(scrapy.Item): # define the fields for your item here like: text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field()    3.创建爬虫文件 dos窗口输入: scrapy genspider myspider quotes.toscrape.com 4.编写myspider.py文件(接收响应,处理数据) # -*- coding: utf-8 -*- import scrapy from quote.items import QuoteItem class MyspiderSpider(scrapy.Spider): name = 'myspider' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): for each in

$Django Rest Framework-序列化组件

亡梦爱人 提交于 2021-01-25 03:50:56
1 序列化组件 e= serializers. SerializerMethodField() # 方法名:叫get_字段名, 参数,返回字典   def get_e( self,obj ): #obj为book对象 from app01 import models from rest_framework import serializers from rest_framework.serializers import Serializer,ModelSerializer from django.http import JsonResponse class auth(Serializer): name = serializers.CharField() age = serializers.CharField() # 方式1 class ser(Serializer): # *****如果不指定source,字段必须对应起来,如果指定了source,字段可以任意命名 a=serializers.CharField(source= ' name ' ) # source 可以指定字段,也可也指定方法 b=serializers.CharField(source= ' authors ' ) c =serializers.CharField(source= ' publish.name

selenium之京东商品爬虫

橙三吉。 提交于 2021-01-24 14:51:14
# 今日目标 **selenium之京东商品爬虫** 自动打开京东首页,并输入你要搜索的东西,进入界面进行爬取信息 ``` from selenium import webdriver import time class JdSpider(object): def __init__ (self): self.browser = webdriver.Chrome() self.url = ' http://www.jd.com/ ' self.i = 0 # 获取商品 def get_page(self): # 打开京东 self.browser.get(self.url) # 找两个节点 self.browser.find_element_by_xpath( ' //*[@id="key"] ' ).send_keys( ' Python书籍 ' ) self.browser.find_element_by_xpath( ' //*[@id="search"]/div/div[2]/button ' ).click() # 留出时间给页面加载 time.sleep(2 ) # 解析页面 def parse_page(self): # 把下拉菜单拉到底部,执行JS脚本 self.browser.execute_script( ' window.scrollTo(0,document