Allure zip包下载
Central Repository: io/qameta/allure/allure-commandline/2.13.2 (apache.org)
Allure 学习文档
https://docs.qameta.io/allure/#
cmd里执行
一、执行测试用例
pytest test1.py --alluredir=./result/1(路径)
二、生成测试报告
allure serve ./result/1
allure generate ./result/1 –o ./report/1/ --clean
三、打开报告
allure open –h 127.0.0.1 –p 8883 ./report/1
需安装allure-pytest
cmd中输入allure serve allure,会生成一个没有信息的allure报告
@allure.feature(‘功能名称’)
@allure.story(‘子功能名称’)
@allure.step(‘步骤细节’)
@allure.attach(‘具体文本信息’)
测试用例的链接
@allure.link(“http://www.baidu.com”, name=”链接”)
链接地址的测试用例
TEST_CASE_LINK = “某一个测试地址,比如全局配置后台”
@allure.testcase(TEST_CASE_LINK,’用例名称,如登陆用例’)
@allure.issue(‘bug编号’,’bug名称’)
pytest test1.py --allure-link-pattern=issue:https://www.baidu.com/{} --alluredir=./result/2
只测试登录功能可以加限制过滤
Pytest 文件名 --allure-features’购物车功能’--allure-stories’加入购物车’
重要性级别
@allure.severity(allure.severity_level.TRIVIAL)
TRIVIAL轻微
MINOR次级
NOMAL普通
CRITICAL临界
BLOCKER中断
执行部分重要性案例
pytest -s -v 文件名 --allure-severities normal,critical
前端自动化截图
Allure.attach.file()
Jmeter测试报告生成
jmeter -n -t F:\jmeter\znkfnew.jmx -l result.jtl -e -o F:\jmeter\report
adb和monkey测试相关
Monkey是一款app的自动化测试工具,monkey是猴子的意思,所以从原理上说,它的自动化测试就类似猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、滑动Trackball、手势输入等操作),来对设备上的程序进行测试,检测程序长时间的稳定性,多久的时间会发生异常。
首先手机要打开开发者选项
Ps:小米手机更多设置,打开开发者选项,关闭miui优化,允许USB调试
adb安装apk
adb shell 查看设备是否在线
adb install –r +apk包 安装
adb devices查看设备是否连接正常
adb shell pm list packages 列出所有包名
adb shell monkey -p
adb shell pm list packages –f查看应用对应的apk文件在手机上的安装位置
aapt dump badging [yourapp.apk] 查看一个apk文件的相关信息/aapt命令在sdk文件的build tools目录下面,需添加系统变量
adb shell monkey -v -p com.xx.xx 100 简单输出测试信息
adb shell monkey –p com.android.berlin –v 300对此包进行300 次无规律点击测试
adb shell monkey -p com.android.berlin -v 1000>F:\monkey.txt对此包进行1000次无规律点击后将日志导出到电脑的某一位置
adb shell monkey -p com.android.berlin --ignore-crashes --ignore-timeouts -v 100000>F:\dfcf_log.txt出现carash或者timeout时,Monkey测试会终止。这里是防止Monkey测试终止
无响应问题(ANR问题):在日志中搜索“ANR ”(此处有空格)
崩溃问题:在日志中搜索“Exception”,快速定位到关键事件信息
参数说明:
-p指定包,不指定包:adb shell monkey 100随机启动APP并发送100个随机事件
-v 日志详细程度 提供三个级别-v越多日志越详细
-s用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。adb shell monkey -p com.htc.Weather –s 10 100
--throttle <毫秒>指定用户操作(即事件)间的时延adb shell monkey -p com.htc.Weather –throttle 3000 100
模拟事件比例:
0:触摸事件百分比,即参数--pct-touch
1:滑动事件百分比,即参数--pct-motion
2:缩放事件百分比,即参数--pct-pinchzoom
3:轨迹球事件百分比,即参数--pct-trackball
4:屏幕旋转事件百分比,
5:基本导航事件百分比,即参数--pct-nav
6:主要导航事件百分比,即参数--pct-majornav
7:系统事件百分比,即参数--pct-syskeys
8:Activity启动事件百分比,即参数--pct-appswitch
9:键盘翻转事件百分比,即参数--pct-flip
10:其他事件百分比,即参数--pct-anyevent
Linux相关
文件
ls列出目录
cd切换目录
pwd显示目前的目录
mkdir创建一个新的目录
rmdir删除一个空的目录
cp复制文件或目录
rm移除文件或目录
mv移动文件或目录,或修改文件与目录的名称
:wq保存
chmod 777 test 修改test文件属性
Windows不支持chmod这种权限修改
网络
Netstat打印linux网络系统的状态信息
-t 列出所有tcp
-u 列出所有udp
-l 只显示监听端口
-n 以数字形式显示地址和端口号
-p 显示今次的pid和名字
性能
top 持续监视系统性能
ps 查看进程信息
-aux 显示所有进程,包括用户,分组情况
Windows
Dir查看当前目录下有哪些文件
国内的Pip源,镜像源
阿里云、清华、豆瓣
Python前闭后开原则
扁平化比嵌套好,因为嵌套多了,可读性差
Ctrl+d 复制一行代码
Ctrl+/ 注释一段代码
默认参数和关键字参数,
默认参数是在定义函数的时候使用K=V,
关键字参数是在调用函数的时候使用
Pip list 查看当前安装了哪些第三方库
匿名函数lambda
打印Sys.path可以查看当前系统查找模块的路径顺序
字面量是以变量或者常量给出的原始数据
字面量插值
列表解包,用一个星号
字典解包,用两个星号
name = "Miley"
print(f"My name is {name}")
With open不需要再close,用完文件会自动关闭
读取图片要使用“rb”模式
Json使用方法:
json由字典和列表组成
Json.dumps()将数据类型转换成字符串
Json.loads()将字符串转成json
class Person:
name = "default"
age = 0
gender = "male"
weight = 0
def __index__(self,name,age,gender,weight):
self.name = name
self.age = age
self.gender = gender
self.weight = weight
def eat(self):
print(f"{self.name} eating!")
def play(self):
print(f"{self.name} playing!")
def jump(self):
print(f"{self.name} jumping!")
类变量与实例变量的区别:
Person.name 类变量
Zs.name 实例变量
Self代表的是实例
类方法不能访问实例方法
类方法需要添加加装饰器@classmethod(一般在类不需要实例化的情况下使用)
第三方库:
Os
os.mkdir创建文件夹
os.listdir("./")列出当前目录下所有文件
os.removedirs("testdir")删除文件夹
os.getcwd()获取当前路径地址
os.path.exists("b")判断当前路径下是否存在该文件夹
Time
print(time.asctime())国外的时间格式
print(time.time())时间戳
print(time.localtime())时间戳转成时间元组
Wed Mar 16 11:16:22 2022
1647400582.8257265
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=16, tm_hour=11, tm_min=16, tm_sec=22, tm_wday=2, tm_yday=75, tm_isdst=0)
time.strftime("%Y年%m月%d日 %H:%M:%S", time.localtime())
2022年03月16日 11:21:41
#获取两天前的时间
now_second = time.time()
two_day_before = now_second - 60*60*24*2
print(time.strftime("%Y年%m月%d日 %H:%M:%S",time.localtime(two_day_before)))
Urllib
Requests
Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 (python-requests.org)
Python 进程和线程
进程是执行中的程序,拥有独立的地址空间、内存、数据栈,由操作系统统一管理,一个进程可以派生新进程,进程间通信需要用IPC方式共享信息,进程是并行的
线程是在同一个进程下执行,共享相同的上下文,线程间的信息共享和通信更加容易,多线程并发执行,需要同步原语。线程是并发的
并行和并发的区别:
并行是多进程,比如10个应用可以同时进行
并发不是同一个时刻同时进行,比如并发10个线程,在同一时刻只会有一个线程进行,时刻1进行线程1,时刻2进行线程2……交互的进行执行
同步原语,就是说进程A和进程B不能在同一时刻对一个文件进行写和读的操作,会发生混乱。加锁。
Python如何保证同一时间只有一个.py文件在执行?
运用全局解释器锁GIL(属于同步原语的一个技术),有一个进程在执行时锁上,执行完再解锁,一个进程上锁后其他进程无法执行。
Python提供两种线程管理
_thread 没有守护线程的概念,当主线程退出时,所有的子线程会被强行杀掉,所以要让主线程等待。
Threading可以避免使用锁这个复杂的方法
Python 打印日志logging.basicConfig(level=logging.INFO)
Python外部数据源文件处理
Yaml https://pyyaml.org/wiki/PyYAMLDocumentation
Jsonjson — JSON encoder and decoder — Python 3.10.2 documentation
Excel Python Resources for working with Excel - Working with Excel Files in Python (python-excel.org)
Yamlhttps://pyyaml.org
Yaml.dump 将其他数据格式转成yaml
Yaml.load 将yaml格式文件转成适应python的列表/字典格式
Yaml对于空格的要求很高
import yaml
print(yaml.load("""
a: 1
""",Loader=yaml.FullLoader))
with open('demo2.yml','w') as f:
yaml.dump(data={'a':[1,2]},stream=f)
编码能力:设计模式、算法、工程实现
构造函数:在类实例化的时候传入的参数
类有没有init取决于需不需要在类实例化的时候传入参数
单元测试
语句覆盖:漏洞and写成or
判断覆盖:漏洞如果有多个逻辑条件组成,仅判断最终结果,忽略每个条件的取值情况
条件覆盖:测试用例指数级增加
路径覆盖:用的最多
Unittest
unittest --- 单元测试框架 — Python 3.10.3 文档
编写规范:
测试模块必须首先import unittest
测试类必须继承unittest.TestCase
测试方法必须以test_开
Setup和teardown 是在每条测试用例的前后分别调用的方法
Setupclass和teardownclass 是在整个类的前后分别调用的方法
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self) -> None:
print("setup")
def tearDown(self) -> None:
print("teardown")
@classmethod
def setUpClass(cls) -> None:
print("setUpClass")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass")
def test_upper(self):
print("test upper 111")
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print("test_isupper 222")
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
print("test_split 333")
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()#这段可以自动收集所有的测试,调用并执行
灵活地使用setup和teardown可以辅助我们完成测试的准备工作和测试之后清理环境的工作
断言
self.assertEqual(1, 1)
self.assertTrue(1==1)
self.assertNotEqual(1, 2)
执行指定的测试用例,将要执行的测试用例添加到测试套件里面,批量执行
suite = unittest.TestSuite()
suite.addTest(TestStringMethods("test_equal"))#类和方法
unittest.TextTestRunner().run(suite)
执行某个测试类里的所有测试用例
if __name__ == "__main__":
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)#括号里是类名
suite = unittest.TestSuite([suite1])#要执行的类列表
unittest.TextTestRunner(verbosity=2).run(suite)
Pytest
pytest: helps you write better programs — pytest documentation
测试文件
Test_*.py
*_test.py
用例识别
Test*类包含的所有test_*的方法(测试类不能带__init__方法)
Pip install -U pytest升级
Pytest -v可以查看详细的信息
Pytest -k test_b指定测试用例执行
import pytest
def inc(x):
return x + 1
@pytest.mark.parametrize("a,b", [(1, 2), (10, 11), (2, 3),(2,1)])参数化
def test_answer(a, b):
assert inc(a) == b
@pytest.fixture()前置条件装饰器
def login():
username = "Jerry"
return username
class TestDemo:
def test_a(self,login):
print(f"a username = {login}")
def test_b(self):
print("b")
def test_c(self,login):
print(f"c username = {login}")
参数化加载yaml文件
class TestData:
@pytest.mark.parametrize(["a", "b", "c"], yaml.safe_load(open("./data.yaml")))
def test_data(self, a, b, c):
print(a + b + c)
查看当前浏览器版本chrome://version/
chromedriver下载地址https://registry.npmmirror.com/binary.html?path=chromedriver/
解决webdriver和浏览器版本不对应导致打开浏览器即闪退的问题:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.baidu.com")
python装饰器是对函数闭包的语法糖
一个函数的主要功能和辅助功能耦合在一起,不方便修改,容易出bug,所以需要将辅助功能从主要功能中抽离出来
闭包本质是一个函数,其参数和返回值都是函数,输入是一个函数,输出是一个增强函数
闭包函数的返回值是对传入函数进行增强后的结果
通过装饰器进行函数增强,只是一种语法糖,本质上还是闭包,装饰器在第一次被装饰函数时进行增强,装饰器是闭包更简单的写法
装饰器在函数第一次被调用前进行增强,并且只需要增强一次
一个函数可以有多个装饰器
对于含有返回值的函数,调用闭包增强后,不能成功返回,但是成功增强了辅助函数
对于含有参数的函数,调用闭包增强后,不能成功接收参数
解决办法是增强函数应该把接收到的所有参数传给原函数
语法糖对语法的功能没有影响,但是更方便程序员使用,没有增加新功能