python及测试框架简明

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

你可能感兴趣的:(python,unittest,selenium,单元测试)