一、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等于b | assertEqual(2,2) |
assertNotEqual(a,b) | 判断a不等于b | assertNotEqual(2,3) |
assertIs(a,b) | 判断a是b | assertIs(“hello”,‘hello’) |
assertIsNot(a,b) | 判断a不是b | assertIsNot(‘hello’,‘Ahello’) |
assertIsNone(a) | 判断a 是None | assertIsNone(None) |
assertIsNotNone(a) | 判断a不是None | assertIsNotNone(123) |
assertIn(a,b) | 判断a在b中,包含相等 | assertIn(‘hello’,‘Ahello’) |
assertNotIn(a,b) | 判断a不在b中 | assertNotIn(‘Ahello’,‘hello’) |
assertGreater(a,b) | 判断a大于b | assertGreater(2,1) |
assertGreaterEqual(a,b) | 判断a大于等于b | assertGreaterEqual(2,2,) |
assertLess(a,b) | 判断a小于b | assertLess(1,2) |
assertLessEqual(a,b) | 判断a小于等于b | assertLessEqual(2,2) |
assertListEqual(list1,list2) | 判断list1等于list2 | assertListEqual(list1,list2) |
assertTupleEqual(tuple1,tuple2) | 判断tuple1等于tuple2 | assertTupleEqual(tuple1,tuple2) |
assertDictEqual(dict1,dict2) | 判断dict1等于dict2 | assertDictEqual(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):显示全局执行结果和执行结果中用例的总数,并输出每一条用例的详细结果;