# !/usr/bin/env python
# -*- coding:utf-8 -*-

import pytest


def add(a, b):
    return a + b


def test_add_001():
    assert add(1, 2) == 2


def test_add_002():
    assert add('h', 'i') == 'hi'


def test_add_003():
    assert 2 == 3


def add_004():
    assert 2 == 2


class TestLogin(object):
    def test_login_001(self):
        pass

    def test_login_002(self):
        pass


if __name__ == '__main__':
    pytest.main(["-v", "-s", "test_add.py::TestLogin::test_login_002"])
'''
测试类必须以test开头

模块级别的
python -m pytest -v tests/

文件级别
python -m pytest -v tests/文件名

执行具体的测试函数
python -m pytest -v tests/文件名::函数名

执行测试类
python -m pytest -v tests/文件名::类名

执行测试方法
python -m pytest -v tests/文件名::类名::方法

失败立刻停止多用于调试:-x
pytest -v -x -m 分组名

指定失败次数:--maxfail
pytest -v -x --maxfail=2 -m 分组名

--tb=no:关闭信息
pytest -v -x -m 分组名 --tb=no

--tb=short:只输出assert的错误信息
pytest -v -x -m 分组名 --tb=short

--tb=line:一行展示所有的信息,具体分别看如下的信息
pytest -v -x -m 分组名 --tb=line

定位错误:--lf
pytest --lf -m 分组名

遇到错误继续执⾏:--ff
pytest --ff -m 分组名

忽略执⾏: -rs
对代码前加入@pytest.mark.skip(reason='忽略执⾏该测试点')

分组执⾏:-m -k
k主要是应⽤测试搜索的⽅式,⽽m的⽅式是使⽤mark分组的⽅式。

-s:输出

-k允许你指定希望执行的测试用例

python3 -m pytest -v -k "指定测试用例包含字符" tests/文件名

python3 -m pytest -v -k "指定测试用例包含字符A or 指定测试用例包含字符B" tests/文件名
或者关系,执行A或者B也可均执行

python3 -m pytest -v -k "指定测试用例包含字符A and  指定测试用例包含字符B" tests/文件名
and的关系,两者均执行

'''
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import pytest


@pytest.mark.login
def test_001():
    pass


@pytest.mark.logout
def test_exit_001():
    pass


@pytest.mark.login
@pytest.mark.logout
def test_002():
    pass


@pytest.mark.register
def test_001():
    pass


'''
-m允许你指定希望执行的测试用例,以装饰器的形式分组

python3 -m pytest -v -m "指定装饰器包含字符" tests/文件名

python3 -m pytest -v -m "指定装饰器包含字符A or 指定装饰器包含字符B" tests/文件名
或者关系,执行A或者B也可均执行

python3 -m pytest -v -m "指定装饰器包含字符A and 指定装饰器包含字符B" tests/文件名
and的关系,两者均执行

安装pip3 install requests库
测试执行速度:--durations=N
只统计测试过程中那个阶段执行速度是最慢的,如果是--duration=0,它就会按所有阶段耗时从长到短进行排序

直接在文件中执行使用主函数
if __name__ == '__main__':
    pytest.main(["-v","-s","文件名"])
'''
# 参数化
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import pytest
import time as t


def add(a, b):
    return a + b


@pytest.mark.parametrize('a, b, result', [
    (1, 2, 3),
    (2, 3, 5),
    (3, 4, 7),
    ('hi ', 'admin', 'hi admin'),
    (1.2, 3.4, 4.6)
])
def test_add_many(a, b, result):
    assert add(a=a, b=b) == result


@pytest.mark.parametrize('data', [
    (1, 2, 3),
    (2, 3, 5),
    (3, 4, 7),
    ('hi ', 'admin', 'hi admin'),
    (1.2, 3.4, 4.6)
])
def test_add_many(data):
    print(data)
    assert add(a=data[0], b=data[1]) == data[2]


@pytest.mark.parametrize('username,password,divText', [
    ('', '', '请输入邮箱名'),
    ('wuya1303@sina.com', '', '请输入密码'),
    ('wuya1303@sina.com', 'admin', '登录名或密码错误')
])
def test_sina_login(selenium, username, password, divText):
    selenium.maximize_window()
    selenium.get('https://mail.sina.com.cn/')
    selenium.implicitly_wait(30)
    t.sleep(3)
    selenium.find_element_by_id('freename').send_keys(username)
    selenium.find_element_by_id('freepassword').send_keys(password)
    selenium.find_element_by_link_text('登录').click()
    t.sleep(3)
    errorText = selenium.find_element_by_xpath(
        '/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')
    assert errorText.text == divText


if __name__ == '__main__':
    pytest.main(["-v", "-s", "--driver", "Chrome", "test_params.py"])
# !/usr/bin/env python
# -*- coding:utf-8 -*-

import time as t
import pytest


def test_baidu_title(selenium):
    selenium.get('https://www.baidu.com/')
    selenium.implicitly_wait(30)
    assert selenium.title == '百度一下,你就知道'


def test_baidu_so(selenium):
    selenium.get('https://www.baidu.com')
    selenium.implicitly_wait(30)
    t.sleep(3)
    so = selenium.find_element_by_id('kw')
    so.send_keys('admin')
    t.sleep(3)
    assert so.get_attribute('value') == 'admin'


if __name__ == '__main__':
    pytest.main(["-v", "-s", "--driver", "Chrome", "test_ui.py"])