在结束本章之前,还有两个问题需要和读者交代一下,也许你已经产生了这样人疑惑,也许你会在接
下来的实践过程中产生这样人疑惑,不管怎样我先来回答这些问题。
用例执行的顺序
这个顺序分两个部分,首先是同步测试问题,不同测试类测试方法的执行顺序的,同一目录下不同测
试文件的执行顺序。
我们继续以 count.py 的测试文件 test.py 为例子。
test.py
#coding=utf-8
from count import Count
import unittest
class TestBdd(unittest.TestCase):
def setUp(self):
pass
#测试整数相加
def test_ccc(self):
self.j = Count(2,3)
self.add = self.j.add()
self.assertEqual(self.add,5)
print 'test1'
#测试字符串相加
def test_aaa(self):
self.j = Count("hello"," world")
self.add = self.j.add()
self.assertEqual(self.add,"hello world")
print 'test3'
def tearDown(self):
pass
class TestAdd(unittest.TestCase):
def setUp(self):
pass
#测试小数相加
def test_bbb(self):
self.j = Count(2.3,4.2)
self.add = self.j.add()
self.assertEqual(self.add,6.5)
print 'test2'
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()
用例的执行结果如下:
Python Shell
>>> ================================== RESTART =============================
>>>
test2
test3
test1
...
----------------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
首先在 test.py 的例子中修改了用例的名称,并且在每个用例结尾打印当前用例的编号。通过执行结
果发现的了规律。
先执行了 TestAdd 类中的 test_bbb()测试用例,接着执行个 TestBdd 类中的 test_aaa()测试用例,
最后执行了 TestBdd 类中的 test_ccc()测试用例。从上下顺序的来将,应该先执行 test_ccc()才对,显
然 main()的加载不中从上到下的顺序。它的默认加载顺序是根据 ASCII 码的顺序,数字与字母的顺序为:
0~9,A~Z,a~z,main()的加载顺序是从小大的,所以 TestAdd 比 TestBdd 先加载,test_aaa()比 test_ccc()
先执行。
那我就想让 test_ccc()先执行可不可以呢?当然可以,我们可以不用默认的 main()方法,通过测试
套件的 addTest()根据需求来加载。
test.py
……
if __name__ == '__main__':
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(TestBdd("test_ccc"))
suite.addTest(TestAdd("test_bbb"))
suite.addTest(TestBdd("test_aaa"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
执行结果如下:
Python Shell
>>> ======================== RESTART ====================
>>>
test1
test2
test3
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
这一次就按照我们想要的加载顺序来执行测试用例了,但这只限制于单个文件,如果用例多了,最省
力的还是直接使用 main()来加载测试用例。
那么 discover()方法加载用例也是按照 ASCII 码的从小到大的顺序来加载同一目录下测试文件的,这
个就更难控制了,我们唯一能做的就是通过测试文件的命名来为其排列执行顺序。
执行多级目录的用例
有时候测试的业务多了就要对测试用例进行划分目录,例如我们下面的测试目录:
.../test_case/test_aa.py
/test_aaa/test_a.py
/test_aaa/test_ccc/test_c.py
/test_bbb/test_b.py
对于上面的目录结构,如果将 discover()方法中 start_dir 参数定义为“.../test_case/”目录,只
能执行 test_aa.py 文件,对于“/test_aaa/”、“/test_aaa/test_ccc/”和“/test_bbb/”等二级、三
级目录下的用例将不会被执行。如果想被 discover()读取执行非常简单,在目录下添加__init__.py 文件,
对于__init__.py 文件的作用请回到本书第三章学习。
修改后的目录如下:
.../test_case/test_aa.py
/test_aaa/test_a.py
/test_aaa/__init__.py
/test_aaa/test_ccc/test_c.py
/test_aaa/test_ccc/__init__.py
/test_bbb/test_b.py
/test_bbb/__init__.py
执行结果如下:
Python Shell
>>> ======================== RESTART ====================
>>>
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite
tests=[<test_aa.MyTest testMethod=test_baidu>]>]>
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite
tests=[<test_aaa.test_a.MyTest testMethod=test_baidu>]>]>
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite
tests=[<test_aaa.test_ccc.test_c.MyTest testMethod=test_baidu>]>]>
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite
tests=[<test_bbb.test_b.MyTest testMethod=test_baidu>]>]>
....
----------------------------------------------------------------------
Ran 4 tests in 59.757s
OK
通过上面的执行结果也可以很清楚的看出所读取测试用例的目录名、文件名、类名和方法名。
小结:
本章从分析 selenium IDE 所录制导出的 Python/unittest/webdriver 脚本开如学习 unittest 单元测
试框架,接下来详细的学习了 unittest 单元测试的概念,如何编写单元测试用例,以及通过有 discover()
方法来组织运行测试用例。最终又后回到原点,学习如何通过 unittest 编写 web 自动化测试。相信通过
本章的学习,读者对单元测试已经基本掌握了使用技巧。