1、测试识别和运行  
文件识别: 
 
在给定的目录中,搜索所有test_.py或者_test.py文件 用例识别: 
 
Test*类包含的所有test_*的方法(测试类不能有__init__方法) 不在类中的所有test_*方法 pytest也能执行unit test写的用例和方法 运行方式 
 
 
2、右键执行python文件
 
 
 4、pycharm代码边界界面,左侧单条用例运行按钮
 
 
5、主函数运行方式
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
   import pytest
   
 class TestClass:
     def test_one(self):
         x = "this"
         assert "h" in x
   
     def test_two(self):
         x = "hello"
         assert hasattr(x, "check")
   
 if __name__ == '__main__':
 #    pytest.main()
     pytest.main("test_study.py")
  
 
pytest.main()会自动读取当前目录下的所有test开头的.py文件,运行test方法或者类
 
可以传入不同的参数,让运行更加定制化
 
 1
 2
 3
 4
 5
 6
 7
 8
   pytest.main(['./'])               # 运行./目录下所有(test_*.py  和 *_test.py)
 pytest.main (['./subpath1'])    # 运行./subpath1 目录下用例
 pytest.main (['./subpath1/test_module1.py'])    # 运行指定模块
 pytest.main (['./subpath1/test_module1.py::test_m1_1'])  # 运行模块中的指定用例
 pytest.main (['./subpath2/test_module2.py::TestM2::test_m2_02'])  # 运行类中的指定用例
 pytest.main (['-k','pp'])         # 匹配包含pp的用例(匹配目录名、模块名、类名、用例名)
 pytest.main(['-k','spec','./subpath1/test_module1.py'])     # 匹配test_module1.py模块下包含spec的用例
 pytest.main(['-k','pp','./subpath2/test_module2.py::TestM2'])   # 匹配TestM2类中包含pp的用例
  
 
 
2、参数化  
@pytest.mark.parametrize(argnames,argvalues)
 
argnames:要参数化的变量,可以是string(用逗号分割),list,tuple argvalues:参数化的值,list[tuple],以列表形式传入元组,每个元组都是一条测试数据 ids,:默认为none,用来重新定义测试用例的名称  1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
   # 使用string分割参数化的变量
 @pytest.mark.parametrize('a,b',[(10,20),(30,40)])
 def test_param(a, b):
     print(a,b)
 
 # 使用list分割参数化的变量
 @pytest.mark.parametrize(['a', 'b'],[(10,20),(30,40)])
 def test_param(a, b):
     print(a,b)
 
 # 使用tuple分割参数化的变量
 @pytest.mark.parametrize(('a', 'b'),[(10,20),(30,40)])
 def test_param(a, b):
     print(a,b)
 
 # 使用ids重新定义用例名称
 @pytest.mark.parametrize('a,b',[(10,20),(30,40)], ids=['case1', 'case2'])
 def test_param(a, b):
     print(a,b)
  
 
yaml参数化 
 
 
yaml实现字典
 
 1
 2
 3
   by: id
 locator: name
 action: click
  
 
yaml二维数组
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
   companies:
   - id: 1
     name: company1
     price: 200w
   - id: 2
     name: company2
     price: 500w
 fruites:
   - name: 苹果
     price: 8.6
   - name: 香蕉
     price: 2.6
  
 
读取yaml文件 
 
 
3、测试报告美化-allure  
1、操作系统内部先安装allure
 
 1
   pip install allure-pytest
  
 
3、运行测试用例
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
   C:\Users\Administrator>pytest --help | findstr allure  <== linux 使用grep过滤
   --allure-severities=SEVERITIES_SET     <==  根据用例级别过滤需要执行的用例
   --allure-epics=EPICS_SET               
   --allure-features=FEATURES_SET         <== 根据用例设置的feature名称过滤需要执行的用例
   --allure-stories=STORIES_SET           <== 根据用例设置的story名称过滤需要执行的用例
   --allure-ids=IDS_SET  Comma-separated list of IDs.
   --allure-link-pattern=LINK_TYPE:LINK_PATTERN
   --alluredir=DIR       <== 指定存放用例执行结果的目录
   --clean-alluredir     清除alluredir文件夹(如果存在)
   --allure-no-capture   Do not attach pytest captured logging/stdout/stderr to
  
 
4、执行测试命令
 
 1
 2
   # --alluredir: 用于指定存储测试结果的路径
 pytest [测试文件] -vs --alluredir=./result/ --clean-alluredir
  
 
5、查看测试报告
 
在线查看报告,直接打开默认浏览器展示当前报告
 
 1
 2
   # 注意这里的serve书写,后面接用例执行结果(./result/:就是存放执行结果的目录路径)
 allure serve ./result/
  
 
从结果生成报告
 
 1
 2
   # 注意:覆盖路径加--clean
 allure generate ./result/ -o ./report/ --clean
  
 
2.打开报告
 
 1
   allure open -h 127.0.0.1 -p 8883 ./report/
  
 
allure常用特性 
 
实现的步骤
 
import allure 功能上加@allure.feature(“功能名称”) 子功能上加@allure.story(“子功能名称”) 用例标题@allure.title(“用例名称”) 用例描述@allure.description(“用例描述”) 步骤上加@allure.step(“步骤细节”) @allure.attach(“具体文本信息”),需要附加的信息,可以是数据、文本、图片、视频和网页 用例级别@allure.severity(级别) 如果只测试登录功能运行的时候,可以加限制过滤  1
 2
 3
   # 注意这里--allure-features中间是-中线, 需要使用双引号
 #  不能过滤--allure-features下的--allure-stories
 pytest 文件名 --allure-features="登录模块"
  
 
feature相当于一个功能,一个大模块,将case分类到某个feature中,报告中Behaviors(功能中展示),相当于testsuite story相当于这个功能或者模块下的不能场景,分支功能,属于feature之下的结构,报告中features中展示,详单与tescase feature与story类似于父子关系 2、allure特性-step 测试过程中每个步骤,一般放在具体逻辑方法中 可以放在关步骤中,在报告中显示 在app、web自动化测试中,建议每切换到一个新页面就做一个step 用法: @allure.step():只能以装饰器的形式放在类或者方法上面 with allure.step():可以放在测试用例方法里面,但是测试步骤代码需要被该语句包含 3、allure特性-testcase
 
关联测试用例,可以直接给测试用例的地址链接,一般用于关联手工测试用例
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
   import pytest
 import allure
 
 @allure.feature('用户登录')
 class TestLogin:
 
     @allure.story('登录成功')
     def test_login_success(self):
         with allure.step('步骤1:打开应用'):
             print('打开应用')
         with allure.step('步骤2:进入登录页面'):
             print('进入登录页面')
         with allure.step('步骤3:输入用户名和密码'):
             print('输入用户名和密码')
         print('这是登录成功测试用例')
 
     @allure.story('登录失败')
     def test_login_fail(self):
         print('这是登录失败测试用例')
 
     @allure.story('登录失败')
     @allure.title('用户名缺失')
     def test_login_fail_a(self):
         print('这是登录失败测试用例')
 
     @allure.story('登录失败')
     @allure.testcase('https://www.baidu.com/', '关联测试用例地址')
     @allure.title('密码缺失')
     @allure.description('这是一个用例描述信息')
     def test_login_fail_b(self):
         with allure.step('点击用户名'):
             print('输入用户名')
         with allure.step('点击密码'):
             print('输入密码')
         print('点击登录')
         with allure.step('点击登录之后登录失败'):
             assert '1' == 1
  
 
按重要性级别 进行一定范围测试 
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
   1. Blocker级别——中断缺陷
     客户端程序无响应,无法执行下一步操作。
 2. Critical级别――临界缺陷,包括:
     功能点缺失,客户端爆页。
 3. Major级别——较严重缺陷,包括:
     功能点没有满足需求。
 4. Normal级别――普通缺陷,包括:
     1. 数值计算错误
     2. JavaScript错误。
 5. Minor级别———次要缺陷,包括:
     1. 界面错误与UI需求不符。
     2. 打印内容、格式错误
     3. 程序不健壮,操作未给出明确提示。
 6. Trivial级别——轻微缺陷,包括:
     1. 辅助说明描述不清楚
     2. 显示格式不规范,数字,日期等格式。 
     3. 长时间操作未给用户进度提示
     4. 提示窗口文字未采用行业术语
     5. 可输入区域和只读区域没有明显的区分标志
     6. 必输项无提示,或者提示不规范。
 7. Enhancement级别——测试建议、其他(非缺陷)
    1. 以客户角度的易用性测试建议。
    2. 通过测试挖掘出来的潜在需求。
  
 
解决方法:
 
通过附加pytest.mark标记 通过allure.feature,allure.story 也可以通过allure.servity来附加标记 步骤:@allure.severity(allure.severity_level.TRIVIAL)pytest -vs [文件名] --allure-severities normal, critical
 
前端自动化测试-截图
 
 
 1
 2
   allure.attach(body(内容), name, attachment_type, extension)
 allure.attach('<body>这是一段html</body>', 'html测试', attachment_type=allure.attachment_type.HTML)
  
 
在测试报告附加图片
 
 1
 2
   allure.attach.file(source, name, attachment_type, extension)
 allure.attach.file('./123.jpg', name='这是一个图片', attachment_type=allure.attachment_type.JPG)
  
 
示例代码:
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
   import allure
 
 def test_attach_text():
     allure.attach('这是一个纯文本', attachment_type=allure.attachment_type.TEXT)
 
 def test_attach_html():
     allure.attach('<body>这是一段html</body>', 'html测试', attachment_type=allure.attachment_type.HTML)
 
 def test_attach_phote():
     allure.attach.file('./123.jpg', name='这是一个图片', attachment_type=allure.attachment_type.JPG)
 
 def test_attach_video():
     allure.attach.file('./123.mp4',name='这是一个视频',attachment_type=allure.attachment_type.MP4)
  
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
   import allure
 from selenium import webdriver
 import time
 import pytest
 
 
 @allure.testcase('https://www.baidu.com/', '百度搜索功能')
 @pytest.mark.parametrize('data',
                          ['allure', 'pytest', 'unittest'],
                          ids=['search allure', 'search pytest', 'search unittest']
                          )
 def test_search(data):
     with allure.step('步骤1:打开浏览器输入百度地址'):
         driver = webdriver.Chrome()
         driver.implicitly_wait(5)
         driver.get('https://www.baidu.com/')
 
     with allure.step(f'步骤2:在搜索框中输入{data}, 并点击百度一下'):
         driver.find_element_by_id('kw').send_keys(data)
         driver.find_element_by_id('su').click()
         time.sleep(2)
 
     with allure.step('步骤3: 截图保存到项目中'):
         driver.save_screenshot(f'./result/{data}.jpg')
         allure.attach.file(f'./result/{data}.jpg', name=f'搜索{data}的截图', attachment_type=allure.attachment_type.JPG)
         allure.attach(driver.page_source, f'搜索{data}的网页内容', allure.attachment_type.HTML)
 
     with allure.step('步骤4:关闭浏览器,退出'):
         driver.quit()
  
 
 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!  希望能帮助到你!【100%无套路免费领取】