0
点赞
收藏
分享

微信扫一扫

用例执行的疑惑

在结束本章之前,还有两个问题需要和读者交代一下,也许你已经产生了这样人疑惑,也许你会在接

下来的实践过程中产生这样人疑惑,不管怎样我先来回答这些问题。

用例执行的顺序

这个顺序分两个部分,首先是同步测试问题,不同测试类测试方法的执行顺序的,同一目录下不同测

试文件的执行顺序。

我们继续以 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 自动化测试。相信通过

本章的学习,读者对单元测试已经基本掌握了使用技巧。


举报

相关推荐

0 条评论