Selenium 2自动化测试实战29(组织单元测试用例和discover更多测试用例)

一、组织单元测试用例

看看unittest单元测试框架是如何扩展和组织新增的测试用例
以之前的calculator.py文件为例,为其扩展sub()方法,用来计算两个数相减的结果。

#coding:utf-8
#计算器类
class Count():
    def __init__(self,a,b):
        self.a=int(a)
        self.b=int(b)

    #计算加法
    def sum(self):
        return self.a+self.b

    #计算减法
    def sub(self):
        return self.a-self.b

因为对计算器类又新增了减法功能(sub),所以需要针对新功能编写测试用例,扩展后的test.py如下

#coding:utf-8
from Demo1 import Count
import unittest

class TestSum(unittest.TestCase):

    def setUp(self):
        a = input("please input the date:")
        self.a = int(a)
        b = input("please input the other date:")
        self.b = int(b)


    def testSum(self):
        self.assertEqual((Count(self.a,self.b).sum()),5,msg="the date is not Equal")

    def testSum2(self):
        self.assertEqual((Count(self.a,self.b).sum()),15,msg="the date is not Equal")

    def tearDown(self):
        print"test sum end"

class TestSub(unittest.TestCase):
    def setUp(self):

        a = input("please input the date:")
        self.a=int(a)
        b = input("please input the other date:")
        self.b = int(b)

    def testSub(self):
        self.assertEqual((Count(self.a,self.b).sub()), 5, msg="the date is not Equal")

    def testSub2(self):
        self.assertEqual((Count(self.a,self.b).sub()), 15, msg="the date is not Equal")

    def tearDown(self):
        print"test sub end"

if __name__=="__main__":
    #构造测试集
    suite=unittest.TestSuite()
    suite.addTest(TestSum("testSum"))
    suite.addTest(TestSum("testSum2"))
    suite.addTest(TestSub("testSub"))
    suite.addTest(TestSub("testSub2"))

    #运行测试集
    runner=unittest.TextTestRunner()
    runner.run(suite)

上例中创建了TestAdd()和TestSub()两个测试类,分别测试calculator.py文件中的add()和sub()两个功能。通过TestSuite类的addTest()方法把不同测试类中的测试方法组装到测试套件中


运行结果如下所示:

D:Python27python.exe F:/study/Demo2/testDemo1/test.py
please input the date:2
please input the other date:3
test sum end
.please input the date:4
please input the other date:5
Ftest sum end
please input the date:6
please input the other date:1
.test sub end
please input the date:20
please input the other date:10
test sub end
F
======================================================================
FAIL: testSum2 (__main__.TestSum)
----------------------------------------------------------------------
Traceback (most recent call last):
File "F:/study/Demo2/testDemo1/test.py", line 18, in testSum2
self.assertEqual((Count(self.a,self.b).sum()),15,msg="the date is not Equal")
AssertionError: the date is not Equal

======================================================================
FAIL: testSub2 (__main__.TestSub)
----------------------------------------------------------------------
Traceback (most recent call last):
File "F:/study/Demo2/testDemo1/test.py", line 35, in testSub2
self.assertEqual((Count(self.a,self.b).sub()), 15, msg="the date is not Equal")
AssertionError: the date is not Equal

----------------------------------------------------------------------
Ran 4 tests in 21.417s

FAILED (failures=2)

Process finished with exit code 0

通过测试结果看到,setUp()和tearDown()方法分别作用于每个测试用例的开始与结束。尝试着封装一个自己的测试类。

#test.py
#coding:utf-8
import unittest
from Demo1 import Count

class Mytest(unittest.TestCase):

    def setUp(self):
        a = input("please input the date:")
        self.a = int(a)
        b = input("please input the other date:")
        self.b = int(b)

    def tearDown(self):
        print"test sum end"

class TestSum(Mytest):

    def testSum(self):
        self.assertEqual((Count(self.a,self.b).sum()),5,msg="the date is not Equal")

    def testSum2(self):
        self.assertEqual((Count(self.a,self.b).sum()),15,msg="the date is not Equal")

class TestSub(Mytest):
    def testSub(self):
        self.assertEqual((Count(self.a,self.b).sub()), 5, msg="the date is not Equal")

    def testSub2(self):
        self.assertEqual((Count(self.a,self.b).sub()), 15, msg="the date is not Equal")


if __name__=="__main__":
    # 构造测试集
    suite = unittest.TestSuite()
    suite.addTest(TestSum("testSum"))
    suite.addTest(TestSum("testSum2"))
    suite.addTest(TestSub("testSub"))
    suite.addTest(TestSub("testSub2"))

    # 运行测试集
    runner = unittest.TextTestRunner()
    runner.run(suite)

创建MyTest()类的好处显而易见,对于测试类和测试方法来说,应将注意力放在具体用例的编写上,不需要关心setUp()和tearDown()所做的事情,不过,前提条件是setUp()和tearDown()所做的事情是每个用例都需要的。

 二、discover更多测试用例

 对上例中test.py文件的测试用例进行拆分,拆分后的目录结果如下:

Testpro/
--count.py
--testsum.py
--testsub.py
--runtest.py
文件拆分后的代码如下:

#count.py

#coding:utf-8 #计算器类 class Count(): def __init__(self,a,b): self.a=int(a) self.b=int(b) #计算加法 def sum(self): return self.a+self.b #计算减法 def sub(self): return self.a-self.b
#testsum.py

#coding:utf-8 from Demo1 import Count import unittest class TestSum(unittest.TestCase): def setUp(self): a = input("please input the date:") self.a = int(a) b = input("please input the other date:") self.b = int(b) def tearDown(self): print"test sum end" def testSum(self): self.assertEqual((Count(self.a,self.b).sum()),5,msg="the date is not Equal") def testSum2(self): self.assertEqual((Count(self.a, self.b).sum()),15, msg="the date is not Equal") if __name__=="__main__": unittest.main()

 

#testsub.py

#coding:utf-8 from Demo1 import Count import unittest class TestSub(unittest.TestCase): def setUp(self): a = input("please input the date:") self.a = int(a) b = input("please input the other date:") self.b = int(b) def tearDown(self): print"test sum end" def testSub(self): self.assertEqual((Count(self.a,self.b).sub()),5,msg="the date is not Equal") def testSub2(self): self.assertEqual((Count(self.a, self.b).sub()),15, msg="the date is not Equal") if __name__=="__main__": unittest.main()

  

#runtest.py

#coding:utf-8 import unittest #加载测试文件 import testsum import testsub #构造测试集 suite=unittest.TestSuite() suite.addTest(testsum.TestSum("testSum")) suite.addTest(testsum.TestSum("testSum2")) suite.addTest(testsub.TestSub("testSub")) suite.addTest(testsub.TestSub("testSub2")) #执行测试 if __name__=="__main__": runner=unittest.TextTestRunner() runner.run(suite)

  

运行结果如下:

这样的拆分带来了好处,可以根据不同的功能创建不同的测试用例,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,整体结构更清晰。

但是这样还是没有解决添加用例的问题,此时使用TestLoader类中提供的discover()方法可以解决这个问题。

TestLoader
该类负责根据各种标准加载测试用例,并将它们返回给测试套件,正常情况下,不需要创建这个类的实例。unittest提供了可以共享的defaultTestLoader类,可以使用其子类和方法创建实例,discover()方法就是其中之一。

discover(start_dir,pattern=‘test*.py’,top_level_dir=None)
找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。

start_dir:要测试的模块名或测试用例目录。

pattern=‘test*.py’:表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py"类型的文件,星号“*”表示任意多个字符。

top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None。
现在通过discover()方法重新实现runtest.py文件的功能。  
#runtest.py

#coding:utf-8 import unittest #定义测试用例的目录为当前目录 test_dir='./' discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') if __name__=="__main__": runner=unittest.TextTestRunner() runner.run(discover)

Discover()方法会自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中,因此,可以直接通过run()方法执行discover,大大简化了测试用例的查找与执行。

原文地址:https://www.cnblogs.com/Rita-LJ/p/11778066.html