python--unittest

# 1.首先认识一下assert断言
'''
断言:就是断定一个条件是成立的,然后才能继续往下走,否则报错
'''
def foo():
    return "古明地觉"

# 这里我们断言foo返回值是str类型,如果不是的话,就会报错,那么程序是不会往下走的
assert isinstance(foo(), str)
print(123)  # 123

# 这里显然会报错
assert 1 == 2

  

# 但是这样的报错不明显,我们可以在后面加上提示
assert 1 + 1 == 9, "1加1怎么会等于9呢?你个baka⑨"

  

错误、异常、断言的区别
错误:一种是语法错误,就是那种非常低级的错误,连编译都通不过。还有一种是逻辑错误,这种错误只有在解释执行的时候才能发现
异常:
异常产生:解释器检测到异常并抛出
异常处理:截获异常,忽略或终止处理异常
断言:拿实际的结果和预期的结果进行比较,说白了就是比的过程
单元测试也是类似,就是比的过程,看看一不一样

'''
测试用例:是为某个特殊目标而编制的一组测试输入,执行条件以及预测结果,
         以便测试某个程序是否满足需求

unittest中的几个重要的概念
1. Test Fixture:就是Setup()和Teardown()对一个测试用例环境的搭建和销毁,是一个fixture
                 Setup类似于打仗,创建战场,Teardown()就是仗打完了清理战场
2. Test case:一个Test case就是一个测试用例
3. Test suite:测试用例集合,里面包含了一系列的测试用例
               把每一个测试用例想象成一根筷子,那么测试用例集合相当于一个圆筒

'''
import unittest  # 导入unittest
class Mytest(unittest.TestCase):
    '''
    定义一个类,这个类必须继承自unittest下的TestCase类
    '''
    # 父类里面写好的方法
    def setUp(self):
        print("环境预测")

    # 自己定义的方法
    def test_something(self):
        print("测试用例")
        # 传入三个参数,前两个是用来比较是否相等的。
        # 第三个是错误信息
        # 几种常用的断言
        '''
        assertEqual(a, b)     a == b      
        assertNotEqual(a, b)     a != b      
        assertTrue(x)     bool(x) is True      
        assertFalse(x)     bool(x) is False      
        assertIsNone(x)     x is None     
        assertIsNotNone(x)     x is not None   
        assertIn(a, b)     a in b    
        assertNotIn(a, b)     a not in b                
        '''
        self.assertEqual(True, True)

    # 父类里面写好的方法
    def tearDown(self):
        print("环境销毁")


# 调用unittest下的main方法,自动执行
if __name__ == '__main__':
    unittest.main()
'''
环境预测
测试用例
环境销毁


Ran 1 test in 0.001s

OK
'''
# 不管什么时候,setUp和tearDown一定是会执行的,setUp最先执行,tearDown最后执行

    

import unittest

class Mytest(unittest.TestCase):
    def setUp(self):
        print("环境预测")

    def test_something(self):
        print("测试用例")
        # 我们将原来的True改成False
        self.assertEqual(True, False, "true和false不一样")

    def tearDown(self):
        print("环境销毁")


if __name__ == '__main__':
    unittest.main()
r'''
环境预测
测试用例
环境销毁

true和false不一样
False != True

Expected :True
Actual   :False
 <Click to see difference>

Traceback (most recent call last):
  File "E:\PyCharm\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals
    old(self, first, second, msg)
  File "C:\python37\lib\unittest\case.py", line 839, in assertEqual
    assertion_func(first, second, msg=msg)
  File "C:\python37\lib\unittest\case.py", line 832, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: True != False : true和false不一样

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\python37\lib\unittest\case.py", line 59, in testPartExecutor
    yield
  File "C:\python37\lib\unittest\case.py", line 615, in run
    testMethod()
  File "D:\~python~\单元测试\3.py", line 10, in test_something
    self.assertEqual(True, False, "true和false不一样")



Ran 1 test in 0.003s

FAILED (failures=1)
'''

  

import unittest

class Mytest(unittest.TestCase):
    def setUp(self):
        print("环境预测")

    def test_something(self):
        print("测试用例")
        # 我们将原来的True改成False
        self.assertEqual(True, True, "true和false不一样")

    def tearDown(self):
        print("环境销毁")

    @classmethod
    def setUpClass(cls):
        # 要使用类装饰器,所有test运行之前执行
        print("我最先执行")

    @classmethod
    def tearDownClass(cls):
        # 要使用类装饰器,所有test运行之后执行
        print("我最后执行")


if __name__ == '__main__':
    unittest.main()

'''
我最先执行环境预测
测试用例
环境销毁
我最后执行

Ran 1 test in 0.000s

OK
'''

  

import unittest

# 也可以一次性验证多个testcase
class Mytest1(unittest.TestCase):

    def test1(self):
        print("this is test1")

    def test2(self):
        print("this is test2")


class Mytest2(unittest.TestCase):

    def test3(self):
        print("this is test3")

    def test4(self):
        print("this is test4")


if __name__ == '__main__':
    suite1 = unittest.TestLoader().loadTestsFromTestCase(Mytest1)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(Mytest2)

    suite = unittest.TestSuite([suite1, suite2])
    # TextTestRunner还有一个stream参数,可以传入一个文件句柄,输出到文件里
    unittest.TextTestRunner(verbosity=2).run(suite) 

'''
this is test1
this is test2
this is test3
this is test4


Ran 4 tests in 0.001s

OK
'''

  

我们可以用来干一些其他的事情

satori.py

def satori(arr):
    return sum(arr)

  

import unittest
import satori

class Test(unittest.TestCase):

    def test(self):
        self.assertEqual(satori.satori([1, 2, 3]), 7)


if __name__ == '__main__':
    unittest.main()
r'''
Ran 1 test in 0.002s

FAILED (failures=1)


7 != 6

Expected :6
Actual   :7
 <Click to see difference>

Traceback (most recent call last):
  File "E:\PyCharm\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals
    old(self, first, second, msg)
  File "C:\python37\lib\unittest\case.py", line 839, in assertEqual
    assertion_func(first, second, msg=msg)
  File "C:\python37\lib\unittest\case.py", line 832, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: 6 != 7
'''

  

 pycharm还是蛮强大的

而且我们有两种方式启动测试,一种是main方法,另一种就是将多个测试用例添加到testsuite中启动

猜你喜欢

转载自www.cnblogs.com/traditional/p/9822617.html