安装了多个版本的python,使用哪个是根据环境变量PATH决定的
python -V # 查看版本
which python # 查看python的安装路径
多版本python安装管理可以参考5-6PPT中Pyenv
python:是C语言编写的python语法解析器,又为Cpython
Jython:是Java语言编写的python语法解析器
pypy: 是python语言编写的python语法解析器
编译生成平台如:ARM的指令集、X86指令集能执行的二进制文件
如:Java开发的app编译成apk后,可以在Android上运行,不能在IOS上运行,因为Android有dalvik的解释器,iPhone没有
如:微信app可以运行在真机上,因为真机是基于ARM指令集的,不能运行在Android studio自带的模拟器上,因为模拟器是基于X86指令集的。微信是故意不编译适合X86二进制文件,只编译出适合ARM二进制文件,而其他app一般都会既编译X86的二进制文件,也编译出ARM的二进制文件
python库版本的隔离管理:
如selenium2、selenium3同时存在进行隔离
virtual env虚拟环境
python3 -m venv tutorial-env # 创建新的环境
-m 是调用 venv库 tutorial-env是新建的虚拟环境包,这个包包含了python3的文件
然后执行(对window系统):tutorial-env\Scripts\activate.bat
这就进入了虚拟环境中的python了,可以:which python 看看
就可以在里面安装库了,可以:find . -maxdepth 5 | less 查看安装目录
pycharm 自动具备这个功能
.so结尾的为二进制文件
python环境管理与pip依赖管理
python -V 产看python版本
python3.6是最稳定的
编译器、解释器
语言→中间字节码→执行引擎
语言→指令集
引擎是执行编译文件的
python创建虚拟化环境(venv):
管理需要用到不同版本的库
可参考官网官方教程来做
pycharm自带这个功能
可以在pycharm的终端与github连接
self.assertEqual(4, x, f'x={x} expection=4') # 期待值4写前面,真实值x在后
f: # cmd下进入F盘
unittest单元测试准备的,单元测试框架不一定只用来做但单元测试,还可以用来做集成测试
'TestCase':所有测试用例的基本类,给一个测试方法的名字,返回一个测试用例实例
'TestSuite':组织测试用例的实例,支持测试用例的添加和删除,最终将传testRunner进行测试执行
‘TextTestRunner’:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果。
'defaultTestLoader':测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件
python main.py # 执行
pytest是集成测试准备的,也可以单元测试;兼容unittest更强大
类都不需要写,看到test_*py、*_test.py、test函数头、不含__int__有Test的类就是用例;就是test和test_都会识别
pytest main.py # 执行
把pytest继承到IDE, 设置一下,因为系统默认是unittest
如下的测试装置执行步骤:名字是固定的
def setup_module():
def setup_function():
def test_01():
def setup_function():
def test_02():
class():
@classmethod
def setup_class(cls) -> None: -> None说明返回None类型,以后最好带上这样调用的语句会有类型方法提示
def setup(self) -> None:
def test_01(self) -> List:
def setup(self) -> None:
def test_02(self) -> None:
一个test可以放多条断言
测试用例的全面和严谨性完全是根据业务需求确定的
有些就是不需要写那么严谨
TDD模式:是先写测试用例,再写测试代码
跑部分用例设置:
可以在用例函数上一行加上@pytest.mark.passCase #做标志为passCase
pytest main.py -m "passCase" # 只跑标志为passCase的用例
生成junit.xml文件:
pytest --junitxml=unit/junit.xml unit/ # 跑unit/下的文件,在unit文件夹中生成junit.xml文件
参数化:
@pytest.mark.parametrize("num1, num2, expect", {
(10, 2, 5),
(0, 3, 0),
(5, 2, 2.5)
}) # 这里的{}可以改为[]、()都是可以的
还可以用json格式和yaml格式:
@pytest.mark.parametrize("num1, num2, expect", json.load("1.json"))
def test01(num1, num2, expect):
allure2测试框架:支持多语言、牛逼的框架
cmd与powershell是两个不同的终端
cmd是不支持shell和Linux指令的,powershell和git bash才支持可以的
pip install allure-pytest
pytest test.py --alluredir=./unit/allure_results 或者 pytest --alluredir=./unit/allure_results
若报错:syntax error near unexpected token `(' ,则应该指令编译器的位置:#!/bin/python
也可以把测试结果生成文件,然后建一个服务器来打开
allure generate ./unit/allure_results/ -o ./unit/allure_html #生成报告,推荐此方法,然后在pycharm选择chrome打开
allure serve ./unit/allure_results/ # 此方法为临时查看,自动弹出报告。ctrl +c结束或就查看不了报告了
https://www.csdn.net/gather_2f/MtjaggzsNTg2NjQtYmxvZwO0O0OO0O0O.html
或者:下面方法为临时查看。ctrl +c结束或就查看不了报告了
cd /unit/allure_html
python -m http.server # 搭建模拟器
要把ip改为127.0.0.1:8000才可以访问
把pycharm 中terminal配置为git bash
用conftest.py文件可以实现失败截图和重跑功能
有时在pycharm中的页面安装不了的库,可以在pycharm的终端用指令安装
pip list # 查看安装了哪些包
window : \\ = / 所以用\\可以改为/ 或r'\'
# todo:也应该用起来了
隐式等待:implicitly_wait,所有find elenment都会默认0.5s巡查一下元素是否出现,出现就返回,底层设计自动帮你等待
显式等待:指定这个状态下去等待,在客户端本地每0.5s巡查一下条件是否匹配(你设定的条件是:presence或visibility或clickable)这样才返回,webdriverwait
==========================================================
==========================================================
selenium框架:
client(python,java) -> selenium -> driver(chromedriver) -> browser(chrome)
解压:unzip 包名
如果不是在chrome浏览器进行验证
$('css语法') $x('xpath语法') # 在按F12 中的console 下输入
元素出现的过程:
title出现
dom出现 presence
css出现 visibility
json出现 clickable
鼠标键盘模拟:ActionChains
def setup_class(cls):
browser = os.get_env("browser").lower()
if browser == "firefox":
cls.driver = webdriver.Firefox()
if browser == "chrome":
cls.driver = webdriver.Chrome()
执行js脚本:execute_script
def test_01(self):
for code in [
'return document.title',
'return document.querySelector(".active").className',
'return JSON.stringify(performance.timing)' # 获取当前网页的执行时间,性能测试用到
]:
result = self.driver.execute_script(code)
print(result)
参数配置:
option = webdriver.ChromeOptions()
option.add_argument("--headless") # 配置成无界面测试
option.add_argument("--disable-gpu") # 添加gpu
option.add_argument("--window-size=1280, 1696") # 调大窗口
cls.driver = webdriver.Chrome(options=option)
设置每次在都当前浏览器页打开,这样可以跳过验证登陆页
chromeOptions = Options()
chromeOptions.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
cls.driver = webdriver.Chrome(options=chromeOptions)
然后在终端打开浏览器,要保证浏览器的页面只有一个
cd C:\Program Files (x86)\Google\Chrome\Application
chrome --remote-debugging-port=9222 然后打开网站登陆,
page object page的原则:
网页的公共方法由page 提供
page的内部细节没必要暴露; _param # 这样的参数是外部人员看不到的
不要把page 的元素暴露给外部
page层不做断言
返回的应该是其他的PO或者是用于断言的数据
同样的行为不同的结果,可以建模为不同的方法
封装模式:
driver:完成对web、android、IOS,driver接口的封装,也就是base层
page:调用driver的封装,完成对网页的封装
case:调用page的封装,完成case的编写
data:配置文件和数据驱动
优点:架构清晰,减少很多重复的代码,便于维护和分工
绕过验证码:
debugger复用浏览器
使用cookie
使用万能码