安装了多个版本的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 使用万能码