Python3学习笔记_web自动化基础九_pytest_20200723

Python3学习笔记_web自动化基础九_pytest_20200723

pytest特性
可以用来进行接口,也可以用来web,也可以用来App,可以用来任何的自动化测试
unittest也可以用来做web自动化,只不过pytest更方便
用例标记 Mark
pytest.ini,注册一个标签
@pytest.mark.标签名
pytest -m "标签名"
编辑器
pycharm是可以设置编辑器为pytest或者是unittest的,但是建议是在命令行中,输入命令,执行用例,不管是什么编辑器都是可以运行的
如果想使用右击运行pytest编辑器,需要在default setting里输入unittest,然后将搜到的结果改成pytest
pytest可以标记整个类:这样类里面的所有方法也都打上了这个标签,执行这个类下的所有方法
@pytest.mark.demo
class TestDemo():
    def test_demo_no_class(self):
        pass
标签的组合使用
and: 必须同时具备两个标签
    pytest -m "demo and error"

or: 只需要满足其中的一个标签就会运行,
    同时运行两个标签:demo 或者 error
    pytest -m "demo or error"

not: pytest -m "demo and not error"

注意事项:用例标记的时候,标签如果有逻辑运算,一定要加双引号:pytest -m "demo and not error",不然很有可能会出现问题
    提示file not found:and,这是解析问题,需要注意一下

一个类或者是方法或者是函数,都可以加多个标签,直接在他们的上面打多个标签即可
    @pytest.mark.smoke
    @pytest.mark.error
    def test_demo_no_class(self):
        pass
断言
pytest 直接使用的是Python内置的关键字assert
而之前使用的self.assertEqual, ddt 都是unittest这个框架带的,
因为pytest是可以不继承unittest的,如果不继承,那就要使用assert断言,比unittest断言简单
def test_demo_error():
    pass
    assert True
    assert 1==2
测试报告:比unittest简单
pip3 install pytest-html
然后执行:pytest -m "demo" --html=reports.html

时间戳生成测试报告:使用脚本方式运行:run.py
    ts=datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
    if  __name__=='__main__':
        pytest.main(['--html={}.html'.format(ts)])

    如果是多个参数:
        pytest.main(['--html={}.html'.format(ts),"-m demo"])
用例的执行顺序
从上到下
数据驱动
使用unittest 进行数据驱动
    @ddt.ddt
    class TestLogin(unittest.TestCase):
        '''登录功能的测试类'''

        @pytest.mark.error
        @ddt.data(*data)
        def test_login_error(self,test_info):
            pass

使用pytest 进行数据驱动:ddt是unittest的插件,只能跟unittest一起用的
    class TestLogin:
        '''登录功能的测试类'''

        @pytest.mark.error
        # 实现数据驱动参数化
        @pytest.mark.parametrize('test_info',data)
        def test_login_error(self,test_info):
            pass
数据驱动注意事项
在使用 pytest.mark.paramatrize 做数据驱动的时候,pytest 和 unittest 不兼容
如果你想使用 pytest 的数据驱动,就不要继承 unittest
如果你想使用 unittest 写用例,就要用 unittest 的数据驱动
测试夹具
## 前置条件和后置条件:下面的就相当于是setUp() 和 tearDown()
setUp() tearDown() 是unittest里面的,如果不继承unittest的话,这个是用不了的
在pytest中前置和后置使用:
    @pytest.fixture()
    def driver():
        '''管理浏览器'''

        # 前置条件
        from selenium import webdriver
        driver = webdriver.Chrome()

        driver.implicitly_wait(20)

        yield  driver  # yield 是个生成器,在这个之前的就是前置条件,在这个之后的就是后置条件
                       # 相当于return

        # 后置条件:后置清理
        driver.quit()

普通函数
@pytest.fixture()声明这是一个测试夹具
把return 改成yield 实现前置和后置
    -yield 前就是前置
    -yield 后就是后置
后置清理的语句放在 yield 之后

测试夹具的使用:
    def test_login_error_py(self,test_info,driver):
        pass
setUpClass() 和 tearDownClass()
类级别的:只在这个类里面执行一次
    @pytest.fixture(scope='class')
    def driver():
        pass

函数级别的:哪个函数加了这个函数,哪个函数就执行一次
    @pytest.fixture(scope='function')
    def driver():
        pass

模块级别的:一个模块中只执行一次【也就是一个文件中执行一次】
    @pytest.fixture(scope='module')
    def driver():
        pass

调用:
    def test_demo(driver):
        pass
pytest 有2个功能不能和 unittest 兼容
paramatrize
fixture
hook【不讲】
-s [pytest -m “demo” -s]
捕获所有的输出,print()
如果不加 -s,输出信息不会显示
将driver 封装函数移到 conftest 文件中
将测试夹具driver的封装移到conftest文件中,这里可以直接使用,因为在执行用例的时候
pytest有智能的功能,在这个模块中,如果找不到driver,就会自动去conftest文件中查找
找到就直接调用,找不到就直接报错了
放到conftest 文件中,是因为几乎每个模块都会用到driver这个封装函数,可以做到跨模块,且不用导入
重运行机制: pip3 install pytest-rerunfailures
这次运行成功,不代表下次运行也会成功,因为有网络等因素的影响
多次运行用例
pytest --reruns 2 --reruns-delay 5    # 重运行2次,意思是一共运行3次,每一次的重运行之间相隔5秒
pytest.main(['--reruns','5'])
pytest 的插件库
http://plugincompat.herokuapp.com
逻辑封装
登录的操作放在了一个类当中,初始化了一个 LoginPage() 对象
测试代码 和 页面操作 分开了
前端工程把页面改了,不需要修改  test_login_*
测试一些其他的东西,LoginPage 不需要改
这就是我们说的分层思想 PageObjectModel 页面对象模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值