测开学习文档_那些年踩过的坑……

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

adbmonkey测试相关

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 <pakage.name>对特定APP包进行测试

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

8Activity启动事件百分比,即参数--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,所以需要将辅助功能从主要功能中抽离出来
闭包本质是一个函数,其参数和返回值都是函数,输入是一个函数,输出是一个增强函数
闭包函数的返回值是对传入函数进行增强后的结果

通过装饰器进行函数增强,只是一种语法糖,本质上还是闭包,装饰器在第一次被装饰函数时进行增强,装饰器是闭包更简单的写法
装饰器在函数第一次被调用前进行增强,并且只需要增强一次

一个函数可以有多个装饰器

对于含有返回值的函数,调用闭包增强后,不能成功返回,但是成功增强了辅助函数
对于含有参数的函数,调用闭包增强后,不能成功接收参数
解决办法是增强函数应该把接收到的所有参数传给原函数
语法糖对语法的功能没有影响,但是更方便程序员使用,没有增加新功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值