unittest 是python 的单元测试框架。作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。
JUnit4 是一个Java语言的单元测试框架。JUnit是一套框架,继承TestCase类,就可以用JUnit进行自动测试了。JUnit测试是程序员测试,即白盒测试。
1.Unittest 测试固件
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "http://www.baidu.com"
def tearDown(self):
self.driver.quit()
setUp(): 初始化 tearDown(): 清理工作
2.TestCase
tset_ 运行这个类的时候会默认执行
测试用例,必须以test_ 开头
def test_baidu1(self):
def test_baidu2(self):
3.测试套件
一个测试容器( 测试套件) ,把测试用例放在该容器中进行执行
unittest 模块中提供了TestSuite 类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中
#手工添加案例到套件
def createSuite():
suite = unittest.TestSuite()
#将测试用例加入到测试容器(套件)中
# addTest
# suite.addTest(demo.test("test_baidu1"))
# suite.addTest(demo.test("test_baidu2"))
# suite.addTest(demo1.test1("test_baidu1"))
# suite.addTest(demo1.test1("test_baidu2"))
# makeSuite
# suite.addTest(unittest.makeSuite(demo.test))
# suite.addTest(unittest.makeSuite(demo1.test1))
# TestLoader
suite1 = unittest.TestLoader().loadTestsFromTestCase(demo.test)
suite2 = unittest.TestLoader().loadTestsFromTestCase(demo1.test1)
suite = unittest.TestSuite([suite1,suite2])
return suite
# discover
# discover = unittest.defaultTestLoader.discover('../ly0516',pattern='demo*.py',top_level_dir=None)
# return discover
addTest() 可以一次存放一个测试用例脚本里一个类的一个方法,提供方法名
makeSuite() 可以实现把测试用例类内所有的测试case组成的测试套件,调用makeSuite的时候,只需要把测试类名称传入即可。可以一次存放一个测试用例脚本里一个类的所有方法。
TestLoader()用于创建类和模块的测试套件,和makeSuite一样。区别在于TestLoader会先放在一个个小套件,在整合起来。
discover() 可以把指定文件夹下所有特定格式命名的测试脚本中类的所有以test_开头的方法都放入套件中。discover 参数分别为
discover(dir,pattern,top_level_dir=None)
4.执行测试
if __name__=="__main__": #执行用例
suite = createSuite()
runner = unittest.TextTestRunner(verbosity=1)
runner.run(suite)
5.用例的执行顺序
unittest 框架默认加载测试用例的顺序是根据ASCII 码的顺序,数字与字母的顺序为: 0-9;A-Z;a-z
忽略用例执行,加一个标签@unittest.skip(“skipping”)
6.Unittest断言
自动化的测试中,对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结果, 来判断该case是通过还是失败。unittest 的单元测试库提供了标准的xUnit 断言方法。
7.HTML报告的生成
脚本执行完毕之后,还需要看到HTML报告
# 获取当前脚本所在的路径
curpath = sys.path[0]
print(curpath)
if not os.path.exists(curpath+"/resultReport"):
os.mkdirs(curpath+"/resultReport")
now = time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
filename = curpath+"/resultReport/"+now+"-"+"resultReport.html"
with open(filename,'wb') as fp:
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"测试报告",
description=u"用例执行",verbosity=2)
suite = createSuite()
runner.run(suite)
8.异常捕捉与错误截图
用例不可能每一次运行都成功,肯定运行时候有不成功的时候。如果可以捕捉到错误,并且把错误截图保存,这将会给我们错误定位带来方便。
# 错误截图
self.driver.get_screenshot_as_file('./errorImage/'+now+"-"+name)
9.数据驱动
假设需要多次执行一个案例,比如baidu搜索,分别输入中文、英文、数字等进行搜索,这时候需要编写3个案例吗?有没有一次运行?
答:python 的unittest 没有自带数据驱动功能。所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT(数据驱动测试)来完成。
参考文档:https://ddt.readthedocs.io/en/latest/
@ddt #增加ddt数据
# @data("杨紫", "王一博", "腾讯新闻", "阿里巴巴")
# @file_data('test_baidu_data.json')
@unpack