*Python 的unittest框架
TestCase
import unittest

class TestDemo(unittest.TestCase):
    def test_method1(self):
        print('测试方法1')
        
    def test_method2(self):
        print('测试方法2')

TestSuite
TestRunner
import unittest

#实例化套件对象
suite = unittest.TestSuite()
#添加用例方法(两种写法)
suite.addTest(测试类名('方法名'))
或
suite.addTest(unittest.makeSuite(测试类名))
#实例化运行对象
runner = unittest.TextTestRunner()
#执行
runner.run(suite)
TestLoader
#使用TestLoader不使用TestSuite的情况:用例TestCase很多
import unittest
#实例化测试加载对象&添加用例(得到的是suite对象) 路径,文件名
suite = unittest.TestLoader().discover('./case','hm*.py')
#实例化运行对象
runner = unittest.TextTestRunner()
#执行
runner.run(suite)
Fixture 测试夹具
#方法级别 每个方法执行前后都调用
def setup(self):
    print('111')
    pass

def teardown(self):
    print('222')
    pass
#类级别 在每个测试类中所有方法执行前后自动调用 (最多各一次)

@classmethod
def setupClass(cls):
    pass
    
@classmethod
def teardownClass(cls):
    pass
Fixture使用 例子:测试登录
class Testlogin(unittest.TestCase):
    #方法级别 每个方法执行前后都调用
    def setup(self):
        print('输入网址')
        
    def teardown(self) -> None:
        print('关闭当前页面') 
        
    @classmethod
    def setupClass(cls) -> None:
        print('       打开浏览器')
        
    @classmethod
    def teardownClass(cls) -> None:
        print('       关闭浏览器')
       
    
    def test_1(self):
        print('输入正确的用户名密码')
        
    def test_2(self):
        print('输入错误的用户名密码')
    
    
理想的输出:(最重要的是顺序)
        打开浏览器
 输入网址          
 输入正确的用户名密码          
 关闭当前页面          
 输入网址
 输入错误的用户名密码          
 关闭当前页面          
        关闭浏览器          


*UnitTest断言
结果只有 TRUE FALSE 两种
最重要:
self.assertEquals()
self.assertIn()
断言 例子:测试登录
class Testlogin(unittest.TestCase):
    #方法级别 每个方法执行前后都调用
    def setup(self):
        print('输入网址')
        
    def teardown(self) -> None:
        print('关闭当前页面') 
        
    @classmethod
    def setupClass(cls) -> None:
        print('       打开浏览器')
        
    @classmethod
    def teardownClass(cls) -> None:
        print('       关闭浏览器')

    def test_1(self):
        print('输入正确的用户名密码')
        
    def test_2(self):
        print('输入错误的用户名密码')
        
    def test_user_ok(self):
        if login('admin','123456') == '登录成功':
            print('pass')
        else:
            print('fail')
        
    def test_user_ok_new(self):
        self.assertEqual('登录成功',login('admin','123456'))
                
    def test_user_error(self):
        self.assertEqual('登录失败',login('root','123456')) 
        
       
 
 
*参数化
即用变量代替测试数据,再通过传参来测试
测试数据一般是json,代码读取json即可
unittest需要安装插件 pip install parameterized
import unittest
from parameterized import parameterized 
from tools import login

#组织测试数据 必须是 [(),(),()] 或 [[],[],[]] 顺序要和参数一致
data = [
    ('admin','123456','登录成功'),
    ('root','123456','登录失败'),
    ('admin','123123','登录失败')
]

#方法2
def build_data():
    with open('data.json', encoding = 'utf-8') as f:
        result = json.load(f)
        for i in result:
            data.append((i.get('username'),i.get('password'),i.get('expect')))
    return data

#用装饰器传参
class Testlogin(unittest.TestCase):
    @parameterized.expand(build_data())
    def test_login(self,username,password,expect):
        self.assertEqual(expect,login(username,password))


 
*跳过
未完成/不满足条件,暂时跳过执行
装饰器方式,写在TestCase里
@unittest.skip('跳过的原因')@unittest.skipIf(条件,'跳过的原因')
例如
import unittest

version = 30

class TestDemo(unittest.TestCase):
    @unittest.skip('跳过的原因')
    def test_method1(self):
        print('测试方法1')
    
    @unittest.skipIf(version < 30,'跳过的原因')
    def test_method2(self):
        print('测试方法2')
  
 
*导出测试报告
--> "Export Test Result" 在pycharm导出为html、再去浏览器打开 导出测似报告
--> 使用第三方测试报告 HTMLTestRunner
由于HTMLTestRunner是一个第三方的unittest HTML报告库,用pip是死活安装不了的,得去网上下载HTMLTestRunner.py放到存放python源代码的Lib目录下
import unittest

from HTMLTestRunner import HTMLTestReport
from HTMLTestRunnerCN import HTMLTestReportCN #中文

#使用套件对象 加载对象 来添加用例方法
suite = unittest.defaultTestLoader.discover('.','hm_05_pal.py')

#实例化 运行对象是f
file = 'report.html'
with open(file,'wb') as f:
    runner = HTMLTestReport(f)
    #执行
    runner.run(suite)