python_unnitest测试框架

Uniitest是python内置的标准类库,它的API和java的junit很相似。---单元测试(pytest是python第三方的测试框架,更灵活)

unnitest单元测试讲解:

单元测试方法:

1)语句覆盖   设计的用例执行完我们所有的代码语句   比较薄弱(如:and条件语句,如果写成了or,测试的例子该条语句也能通过,测试就发现不了该问题)

2)判断覆盖   关注整个判断语句(true or false),不关心判断语句内是否有多个条件(也会有漏洞)

3)条件覆盖  关注整个判断语句的同时也关注每个语句里面的条件(测试用例庞大)

4)路径覆盖  通过流程图去保证每条路径都覆盖到

#单元测试框架
import unittest

class myunitest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("1111")
    @classmethod
    def tearDownClass(cls) -> None:
        print("22222")
    def setUp(self) -> None:
        print("开始前准备")
    def tearDown(self) -> None:
        print("结束后操作")
    def test_01(self):
        print("这是case1")
        r=2
        self.assertEqual(2,r,"判断相等")
    def test_02(self):
        print("这是case2")
    def main(self):
        unittest.main

setupclass和teardown作用域是整个类,先执行setup,再执行所有用例,最后执行teardown

setup和teardown作用域是单挑case,先执行setup,然后执行case01,再执行teardown。然后重复再执行setup,执行case02,再执行teardown...

 

如何设置跳过某条用例(方法1):在那条用例上面加@unnitest.skip,代码示例:

#单元测试框架
import unittest

class myunitest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第一次开始前准备")
    @classmethod
    def tearDownClass(cls) -> None:
        print("第一次结束后操作")

    @unittest.skipIf(1+1==2,"case0跳过")
    def test_01(self):
        print("这是case1")
        r=2
        self.assertEqual(2,r,"判断相等")

    def test_02(self):
        print("这是case2")
    def main(self):
        unittest.main

如何设置跳过某条用例(方法2):创建测试套件,将要执行的用例放到测试套件中,然后去调用unnitest.TextTestrunner去run测试套件:

#单元测试框架
import unittest

class myunitest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第一次开始前准备")
    @classmethod
    def tearDownClass(cls) -> None:
        print("第一次结束后操作")

    def test_01(self):
        print("这是case1")
        r=2
        self.assertEqual(2,r,"判断相等")

    def test_02(self):
        print("这是case2")

class my2(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第二次开始前准备")

    @classmethod
    def tearDownClass(cls) -> None:
        print("第二次结束后操作")
    def test_03(self):
        print("这是case03")

if __name__ == '__main__':
    suite=unittest.TestSuite()
    suite.addTest(myunitest("test_01"))
    suite.addTest(my2("test_03"))
    unittest.TextTestRunner().run(suite)

如何设置跳过某条用例(方法3):选择指定类中的用例执行(将要执行的类中的用例加载出来,放到测试套件中,再去run这些用例)。代码示例:

#单元测试框架
import unittest
#测试用例(类1)
class myunitest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第一次开始前准备")
    @classmethod
    def tearDownClass(cls) -> None:
        print("第一次结束后操作")

    def test_01(self):
        print("这是case1")
        r=2
        self.assertEqual(2,r,"判断相等")

    def test_02(self):
        print("这是case2")
#测试用例(类2)
class my2(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第二次开始前准备")

    @classmethod
    def tearDownClass(cls) -> None:
        print("第二次结束后操作")
    def test_03(self):
        print("这是case03")
#测试用例(类3)
class my3(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第三次开始前准备")

    @classmethod
    def tearDownClass(cls) -> None:
        print("第三次结束后操作")
    def test_04(self):
        print("这是case4")

if __name__ == '__main__':
    suite1=unittest.TestLoader().loadTestsFromTestCase(myunitest)
    suite2=unittest.TestLoader().loadTestsFromTestCase(my3)
    suiteall=unittest.TestSuite([suite1,suite2])
    unittest.TextTestRunner().run(suiteall)

pytest还可以以加载路径下用例的方式,去执行想要执行的用例(使用unnitest.defaultTestLoader.discover(test_dir,patter="文件关键字")。代码示例如下:

#单元测试框架
import unittest
import os
class myunitest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第一次开始前准备")
    @classmethod
    def tearDownClass(cls) -> None:
        print("第一次结束后操作")

    def test_01(self):
        print("这是case1")
        r=2
        self.assertEqual(2,r,"判断相等")

    def test_02(self):
        print("这是case2")

class my2(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第二次开始前准备")

    @classmethod
    def tearDownClass(cls) -> None:
        print("第二次结束后操作")
    def test_03(self):
        print("这是case03")

class my3(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("第三次开始前准备")

    @classmethod
    def tearDownClass(cls) -> None:
        print("第三次结束后操作")
    def test_04(self):
        print("这是case4")

if __name__ == '__main__':
    print(os.path)
    discover=unittest.defaultTestLoader.discover("./","test_*.py")
    unittest.TextTestRunner().run(discover)

 

上一篇:CodeForces 510E Fox And Dinner


下一篇:Java反射机制总结