目录
1.自动化断言
1.1断言概念
基于selenium+python的自动化测试,断言是assert(unittest 框架的 TestCase 类提供)。断言执行失败则会抛出一个异常,此时没有达到我们预期结果,则测试用例失败;执行成功即达到我们的预期结果。简言之断言就是比较我们的期望结果与实际结果,相等则测试用例通过。
1.2断言介绍
- assertEqual(a,b,[msg=‘测试失败时打印的信息’]): 断言a和b是否相等。
- assertNotEqual(a,b,[msg=‘测试失败时打印的信息’]): 断言a和b是否相等,不相等则通过。
- assertTrue(x,[msg=‘测试失败时打印的信息’]): 断言x是否True,是则测试用例通过。
- assertFalse(x,[msg=‘测试失败时打印的信息’]):断言x是否False,是则测试用例通过。
- assertIs(a,b,[msg=‘测试失败时打印的信息’]): 断言a是否是b,是则测试用例通过。
- assertNotIs(a,b,[msg=‘测试失败时打印的信息’]):断言a是否是b,不是则测试用例通过。
- assertIsNone(x,[msg=‘测试失败时打印的信息’]):断言x是否None,是None则通过。
- assertIsNotNone(x,[msg=‘测试失败时打印的信息’]):断言x是否None,不是None则通过。
- assertIn(a,b,[msg=‘测试失败时打印的信息’]): 断言a是否在b中,在b中则测试用例通过。
- assertNotIn(a,b,[msg=‘测试失败时打印的信息’]): 断言a是否在b中,不在b中则通过。
- assertIsInstance(a,b,[msg=‘测试失败时打印的信息’]):断言a是否是b的一个实例,是则测试用例通过。
- assertNotIsInstance(a,b,[msg=‘测试失败时打印的信息’]):断言a是否是b的一个实例,不是则测试用例通过。
1.3代码案例
import unittest
class Test(unittest.TestCase):
def setUp(self):
pass
def test_case(self):
self.a = "hello"
self.b = "hello world"
self.assertIn(self.a,self.b,msg="a is in b")
def tearDown(self):
pass
if __name__ == "__main__":
unittest.main()
2.自动化报告
2.1HTMLTestRunner
2.1.1HTMLTestRunner 的下载和安装
下载地址:HTMLTestRunner下载
安装:HTMLTestRunner 是一个独立的 HTMLTestRunner.py 文件,既可以当作 Python 的第三方库来使用,也可以当作项目的一部分来使用。只需要把HTMLTestRunner.py 文件放在python的安装目录下即可,如:D:\install\python\Lib\site-packages
2.1.2HTMLTestRunner使用
HTMLTestRunner 类的部分实现,__init__()初始化方法的参数:
- stream:指定生成 HTML 测试报告的文件,必填。
- verbosity:指定日志的级别,默认为 1。如果想得到更详细的日志,则可以将参数修改为 2。
- title:指定测试用例的标题,默认为 None。
- description:指定测试用例的描述,默认为 None
2.1.3代码案例
创建一个简易计算器程序中的加、减、乘、除并编写单元测试代码,生成测试报告。项目层次结构如下:
Caculator.py代码
# 简易计算器程序中的加、减、乘、除代码。
class Caculator:
def add(self, a, b):
return a + b
def substract(self, a, b):
return a - b
def multi(self, a, b):
return a * b
def divide(self, a, b):
return a / b
test_Caculator.py代码
import unittest
from com.test_sanmu.caculator import Caculator
class CaculatorTest(unittest.TestCase):
@classmethod
def setUp(self) -> None:
self.cacylator = Caculator
def test_caculator1(self):
self.assertEqual(5,self.cacylator.substract(self,6,1))
self.assertEqual(3,self.cacylator.multi(self,1,3))
self.assertEqual(5,self.cacylator.divide(self,10,2))
self.assertEqual(6,self.cacylator.add(self,3,3))
@classmethod
def tearDown(self) -> None:
print("断言结束")
if __name__ == '__main__':
unittest.main()
reporter.py
'''
执行多个测试文件
discover(start_dir,pattern='test*.py',top_level_dir=None)
start_dir :待测试的模块名或测试用例目录。
pattern='test*.py' :测试用例文件名的匹配原则。此处匹配文件名以“test”开头
的“.py”类型的文件,星号“*”表示任意多个字符。
top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为 None。
'''
import os
import unittest
import HTMLTestRunner
import time
# 用例路径
case_path = os.path.join( os.getcwd(), 'test_sanmu' )
# 报告存放路径
report_path = os.path.join( os.getcwd(), 'reports' )
if not os.path.exists( report_path ):
os.mkdir( report_path )
def all_case():
suits = unittest.defaultTestLoader.discover( case_path, pattern="test*.py", top_level_dir=None )
return (suits)
if __name__ == '__main__':
# 1、获取当前时间,便于生成报告,不易被覆盖。
now_time = time.strftime( "%Y-%m-%d-%H_%M_%S", time.localtime( time.time() ) )
# 2、html报告文件路径
report_abspath = os.path.join( report_path, "result_" + now_time + ".html" )
# 3、打开一个文件,将result写入此file中
fp = open( report_abspath, "wb" )
runner = HTMLTestRunner.HTMLTestRunner( stream=fp, title='测试报告', description="运行环境:Sanmu Windows 10, Chrome 浏览器",verbosity=2 )
# 4、调用add_case函数返回值
runner.run( all_case() )
fp.close()
生成结果报告
2.2BeautifulReport
BeautifulReport是基于Unittest测试框架生成HTML格式的自动化测试报告的报告框架,既简洁又美观的HTML模板,将生成的结果添加到模板中,在指定目录下生成HTML格式报告。
2.2.1BeautifulReport的下载和安装
下载地址:BeautifunReport下载
安装:下载zip格式之后解压,把整个文件加载到python的安装目录下即可,如:D:\install\python\Lib\site-packages
2.2.2BeautifulReport使用步骤
1、组装测试套件: 把要执行的测试用例放入到测试套件中
2、准备测试报告文件(路径+报告文件名.html)
3、批量执行测试用例,把结果写入到测试报告文件中。
报告参数说明:
- 1、filename 报告的文件名
- 2、description: 生成文件的注释
- 3、report_dir: 生成report的文件存储路径
- 4、theme: 报告主题
2.2.3代码案例
测试用例同上,Caculator.py实现和test_Caculator.py单元测试,生成报告代码如下:
import time
import unittest
import os
from BeautifulReport import BeautifulReport
# 用例路径
case_path = os.path.join( os.getcwd(), 'test_sanmu' )
# 报告存放路径
report_path = os.path.join( os.getcwd(), 'reports' )
if not os.path.exists( report_path ):
os.mkdir( report_path )
suits = unittest.defaultTestLoader.discover(case_path, 'test*.py', None)
now_time = time.strftime( "%Y-%m-%d-%H_%M_%S", time.localtime( time.time() ) )
filename = 'Sanmu测试报告' + str(now_time)
BeautifulReport(suits).report(filename=filename,description='beautifual报告',log_path=report_path)
生成结果报告
2.3pytest-Allure
Allure是强大的报告框架,他结合Pytest单元测试框架使用能够详细的展示测试用例的执行情况,以及展示各种独特的分析结果,同时还支持多种语种的切换,目前为止功能最强大,但操作相对较为复杂。
2.3.1Allure下载和安装
下载地址:Allure下载
安装:因为,Allure是java语言开发,所以确保自己环境有jdk1.8版本及以上,然后解压文件 -> 进入bin目录 -> 运行allure.bat-> 把bin目录加入PATH环境变量-> cmd输入allure --version验证是否配置成功 -> 安装插件:pip install allure-pytest
2.3.2Allure查看和生成报告
(1)生成:pytest [测试文件] --alluredir=./result #--alluredir用于指定存储测试结果的路径
(2)查看:a.直接打开默认浏览器展示报告:allure serve ./result/
b.从结果生成报告:生成报告,allure generate ./result/ -o ./report/ --clean
(覆盖路径加--clean) -> 打开报告allure open -h [生成文件的IP] -p [生成文件的端口] ./report/,例如我的是:10.7.129.39:42035
2.3.3代码案例
import allure
import pytest
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
@allure.feature( "百度搜索" )
@pytest.mark.parametrize( 'test_data', ['allure', 'pytest', 'Sanmu'] )#参数化
def test_steps_demo(test_data):
with allure.step( "打开百度网页" ):
driver = webdriver.Chrome()
driver.get( "http://www.baidu.com" )
with allure.step( "搜索" ):
driver.find_element( By.ID, "kw" ).send_keys( test_data )
time.sleep( 2 )
driver.find_element( By.ID, "su" ).click()
time.sleep( 2 )
with allure.step( "保存图片" ):
driver.save_screenshot( "./result/result.png" )
allure.attach.file( "./result/result.png", attachment_type=allure.attachment_type.PNG )
allure.attach( '<head></head><body>首页</body>', 'Attach with HTML type', allure.attachment_type.HTML )
with allure.step( "退出浏览器" ):
driver.quit()
运行:
生成报告如下:
2.3.4 allure特性
- @allure.feature(‘功能名称’):相当于 testsuite
- @allure.story(’子功能名称‘):对应这个功能或者模块下的不同场景,相当于 testcase
- @allure.step('步骤'):测试过程中的每个步骤,放在具体逻辑方法中
- allure.step('步骤') :只能以装饰器的形式放在类或者方法上面
- with allure.step:可以放在测试用例方法里面
- @allure.attach('具体文本信息'):数据,文本,图片,视频,网页
- @link, @issue, @testcase:可以在测试报告中添加链接、bug地址、测试用例地址。
- @ allure.severity按重要性级别来标记,有5种级别:
- Blocker级别:阻塞
- Critical级别:严重
- Normal级别:正常
- Minor级别:不太重要
- Trivial级别:不重要