zoukankan      html  css  js  c++  java
  • 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,大大简化了测试用例的查找与执行。

  • 相关阅读:
    浅析七种经典排序算法
    一个可编辑与新增博客园文章的 Python 脚本
    快速排序的几种实现方式
    如何查找某个网站的(如:有道云笔记)的接口
    一键导出「有道云笔记」所有笔记
    2020年启蒙及小学识字练字APP或小程序测评榜
    2020年部编版小学二年级语文上册知识点(完整版)
    2020年部编人教版小学语文一年级下册知识点汇总
    换个角度,程序员爸爸应该关注一下
    计算机基础知识-I/O篇
  • 原文地址:https://www.cnblogs.com/Rita-LJ/p/11778066.html
Copyright © 2011-2022 走看看