熟悉 java 的应该都清楚常见的单元测试框架 Junit 和 TestNG,这个招聘的需求上也是经常见到的。python 里面也有单元测试框架-unittest,相当于是一个python 版的 junit。
python 里面的单元测试框架除了 unittest,还有一个 pytest 框架,这个用的比较少,后面有空再继续分享。
用法:
我们来看一下unittest帮助下的一个简单例子,将这段举例代码复制并运行一下,看看结果
import unittest
class IntegerArithmeticTestCase(unittest.TestCase):
def testAdd(self): ## test method names begin 'test*'
self.assertEqual((1 + 2), 3)
self.assertEqual(0 + 1, 1)
def testMultiply(self):
self.assertEqual((0 * 10), 0)
self.assertEqual((5 * 8), 40)
if __name__ == '__main__':
unittest.main()
1).第一行是导入 unittest 这个模块
2).class 这一行是定义一个测试的类,并继承 unittest.TestCase 这个类
3).接下来是定义了两个测试 case 名称:testAdd 和 testMultiply
4).注释里面有句话很重要,这个要敲下黑板记笔记了: ## test method names begi n ‘test*’
– 翻译:测试用例的名称要以 test 开头
5).然后是断言 assert,这里的断言方法是 assertEqual-判断两个是否相等,
这个断言可以是一个也可以是多个
7 ).if 下面的这个 unittest.main()是运行主函数,运行后会看到测试结果(跑
了两个用例耗时 0.000 秒,两个用例都通过):
Ran 2 tests in 0.000s
OK
1 )上面的两个案例是加法和乘法,我们可以写个 case 试下减法和除法。
2).有很多小伙伴不知道断言怎么写,断言其实就是拿实际结果和期望结果去对比,对比的方法很多,这里只是举的最简单的一个判断相等的方法。
#-*- coding:utf-8 -*-
import unittest
class IntegerArithmeticTestCase(unittest.TestCase):
def testcheng(self):
u'''乘法'''
test1 = 8*5 #实际结果
hope1 = 40 #期望结果
self.assertEqual(test1,hope1)
def testchu(self):
u'''除法'''
test2 = 78/9 #实际结果
hope2 = 3.5 #期望结果
self.assertEqual(test2,hope2)
if __name__ == '__main__':
unittest.main()
3)最后运行结果,第二个是失败的,失败原因:AssertionError: 8 != 3.5
C:\Python27\python.exe F:/pycharm-workspace/Django_Test/test2.py
.F
======================================================================
FAIL: testchu (__main__.IntegerArithmeticTestCase)
除法
----------------------------------------------------------------------
Traceback (most recent call last):
File "F:/pycharm-workspace/Django_Test/test2.py", line 18, in testchu
self.assertEqual(test2,hope2)
AssertionError: 8 != 3.5
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
Process finished with exit code 1
1).setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件。
2).tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。
3).很多人执行完用例,都不去做数据还原,以致于下一个用例执行失败,这就是不喜欢擦屁股的事情,习惯不好。
4).前置和后置都是非必要的条件,如果没有也可以写 pass.
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def testMinus(self):
result = 6-5
hope = 1
self.assertEqual(result,hope)
if __name__ == '__main__':
unittest.main()
1).打开博客首页为例,写一个简单的 case
2).判断 title 完全等于期望结果
参考代码
#-*- coding:utf-8 -*-
import unittest
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
import time
class blog(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get('http://blog.csdn.net/mtbaby')
def test_blog(self):
time.sleep(2)
result = EC.title_is(u'MTbaby的博客 - CSDN博客')(self.driver)
print result
self.assertTrue(result)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
执行结果:
C:\Python27\python.exe F:/pycharm-workspace/Django_Test/test2.py
True
.
----------------------------------------------------------------------
Ran 1 test in 14.564s
OK
Process finished with exit code 0