UnitTest测试框架

一、UnitTest简介

Unittest是Python自带的单元测试框架,在自动化测试框架中被用来组织测试用例的执行、断言和日志记录。需要导入unittest单元测试框架,unittest单元测试框架下的测试类都默认继承unittest.TestCase子类。测试类下的测试方法都必须以test开头,否则不被执行。

一般在测试执行结果中会有三种状态:

1、.(success):表示测试用例运行通过;
2、F(failed):表示测试用例运行失败;
3、E(error):表示测试脚本中存在错误;

由四部分组成:TestFixture、TestCase、TestSuit、TestRunner

TestFixture:测试用例的准备和销毁;
TestCase:一个TestCase的实例就是一个测试用例;
TestSuit:测试套件,将多个测试用例集合在一起就是一个TestSuit;
TestRunner:使用TextTestRunner提供的run()方法执行测试用例;

工作原理图:
在这里插入图片描述

1、TestCase:获得测试用例
2、TestLoader:将测试用例TestCase加载进TestSuit
3、TextTestRunner:执行run()方法
4、TestResult:生成测试报告

前置和后置:

setUp():Web自动化测试过程中经常会把实例化浏览器、获取URL、设置等待等操作;
tearDown():测试完成后的清除工作:浏览器、数据库的还原;
setUp()、tearDown()属于非必要条件,如果什么都无,可以使用pass来表示;

二、TestFixture

TestFixture用于测试用例执行前做准备和测试用例执行后做清理工作。

setUp():测试用例执行前的准备工作,是执行每个测试用例的前置条件。
tearDown():测试用例执行完的善后工作,是执行每个测试用例的后置条件。
setUpClass():结合@classmethod装饰器一起使用,是所有测试用例执行的前置条件。
tearDownClass():结合@classmethod装饰器一起使用,是所有测试用例执行的后置条件。
    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")

三、TestCase

如果一个类继承unittest.TestCase,那么这个类就是一个测试用例。在这个方法要被当做测试用例执行则这个方法的名称就必须以test开头。在Unittest框架中,只会讲test开头的方法当做测试用例执行。

class TestLoginCases(unittest.TestCase):
    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")
    def test_001(self):
        log = Login()
        #正确账号用户密码登录
        log.login('1806670xxxx','xxxxxxxxxx')
        log.click('xpath', "//*[@id='csdn-toolbar']/div/div/div[3]/div/div[1]/a/img")
        time.sleep(1)
        #获取用于断言判断登录后的情况
        data = log.get_text('xpath', "/html/body/header/div/div/div[1]/h1/a")
        #进行断言判断
        self.assertEqual("yutian8233的博客",data,msg = "成功登录CSDN系统")
if __name__ == '__main__':
    unittest.main()

四、断言Assert

Python + UnitTest结构中,有两种断言可供使用。一种是Python语言中提供的断言Assert;另外一种是UnitTest中提供的断言方法。

三种类型:

1、布尔类型断言:即真或假,如果判断为真,则返回True,反之返回False;
2、比较类型断言:例如比较两个变量值的大小,如果判断为真,则返回True,反之返回False;
3、复杂类型的断言:例如判断两个列表是否相等,如果相等,则返回True,反之返回False;

UnitTest提供的常用断言方法

方法说明示例
assertEqual(a,b)判断a等于bassertEqual(2,2)
assertNotEqual(a,b)判断a不等于bassertNotEqual(2,3)
assertIs(a,b)判断a是bassertIs(“hello”,‘hello’)
assertIsNot(a,b)判断a不是bassertIsNot(‘hello’,‘Ahello’)
assertIsNone(a)判断a 是NoneassertIsNone(None)
assertIsNotNone(a)判断a不是NoneassertIsNotNone(123)
assertIn(a,b)判断a在b中,包含相等assertIn(‘hello’,‘Ahello’)
assertNotIn(a,b)判断a不在b中assertNotIn(‘Ahello’,‘hello’)
assertGreater(a,b)判断a大于bassertGreater(2,1)
assertGreaterEqual(a,b)判断a大于等于bassertGreaterEqual(2,2,)
assertLess(a,b)判断a小于bassertLess(1,2)
assertLessEqual(a,b)判断a小于等于bassertLessEqual(2,2)
assertListEqual(list1,list2)判断list1等于list2assertListEqual(list1,list2)
assertTupleEqual(tuple1,tuple2)判断tuple1等于tuple2assertTupleEqual(tuple1,tuple2)
assertDictEqual(dict1,dict2)判断dict1等于dict2assertDictEqual(dict1,dict2)

常见的测试标识:

.:表示测试通过;
F:failure,表示测试失败,未通过;
s:skip,表示测试跳过,不执行该条测试用例;
x:预期结果为失败的测试用例;

五、TestSuit

1、直接构件测试集

class SuiteTest(unittest.TestCase):
    def test_1(self):
        print("test1")
    def test_2(self):
        print("test2")
if __name__ == '__main__':
    #构造测试集
    suit = unittest.TestSuite(map(SuiteTest,['test_1','test_2']))
    #执行测试用例
    unittest.TextTestRunner().run(suit)

2、addTest()构建测试集

addTest()可以实现将测试用例添加到测试集中,但是一次只能添加一条测试用例。

SuiteTest.addTest(TestSuite('test_2'))

3、addTests()构建测试集

addTests()可以实现将测试用例添加到测试集中,允许添加多条测试用例。

SuiteTest.addTests(map(TestSuite,['test_2','test_3']))

4、skip装饰器

使用skip装饰器可以跳过某个测试用例。(“@unittest.skip()”)如果某条测试用例被添加了skip()装饰器,则该条测试用例涉及的测试准备setUp()和测试销毁testDown()不会被执行。
主要的四种使用方法:

1、@unittest.skip(reason):无条件跳过。reason描述跳过的原因;
2、@unittest.skipIf(condition,reason):有条件跳过。当condition条件满足时跳过该条测试用例;
3、@unittest.skipUnless(condition,reason):有条件跳过。当condition条件不满足时跳过该条测试用例;
4、@unittest.expectedFailure:用于标记期望执行失败的测试方法。如果该测试方法执行失败,则被认为是成功;如果执行成功,则被认为是失败;
 @unittest.skip("跳过该条用例")
 @unittest.skipIf(1 == 1,"如果1==1跳过该条用例")
 @unittest.skipUnless(1 == 1, "如果1==1执行该条用例")
 @unittest.expectedFailure
 def test_001(self): 

六、TestLoader

TestLoader将测试用例(TestCase)添加到测试套件(TestSuit)中,主要有以下方法:

1、Test_A = unittest.TestLoader().loadTestsFromTestCase(testCaseClass)
返回testCaseClass中包含的所有测试用例的套件;
2、Test_A = unittest.TestLoader().loadTestsFromModule(module)
返回包含在给定模块中的所有测试用例的套件;
3、Test_A = unittest.TestLoader().loadTestsFromName(name,module=None)
返回一组给定字符串说明符的所有测试用例。名称可以为模块、测试用例类、测试用例类中的测试方法,或者其中的可调用对象,返回一个TestCase或者TestSuit实例;
4、Test_A = unittest.TestLoader().loadTestsFromNames(names,module=None)
返回使用给定序列找到的所有测试用例的套件说明符的字符串;
5、Test_A = unittest.TestLoader().getTestCaseNames(testCaseClass)
返回在testCaseClass中找到的方法名的排序序列;
6、Tests = unittest.defaultTestLoader.discover(r"E:\Users\PycharmProjects\TimeSheet\TestCase", pattern="TestCase*.py")
discover()有三个参数:
star_dir:测试用例的地址;
pattern:是一种匹配测试用例脚本名称规则,默认是“test*.py”;
top_level_dir:顶层目录的名称,默认为None;

七、TestRunner

unittest.TextTestRunner().run(suit)
TextTestRunner(verbosity)
verbosity参数用来控制输出错误报告的详细程度,有三个等级:
0(quiet):只显示全局执行结果和结果中用例的总数;
1(default):默认值:显示全局执行结果和执行结果中用例的总数,并且对每一条用例的执行结果都有标注(T/F);
2(verbose):显示全局执行结果和执行结果中用例的总数,并输出每一条用例的详细结果;

八、生成HTML报告

使用HTMLTestRunner生成测试报告的详细步骤

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值