什么是自动化测试?
通过代码的方式,实现测试用例的自动运行,评估运行结果,并对测试结果及异常情况进行记录。
为什么进行自动化测试?
纯手工测试会有好多重复性的操作,浪费时间,而且频繁的回归测试,更是耗费时间和人力成本,不仅效率低,而且容易出错。
自动化、手工测试优缺点
手工测试
优点:
1、不完全按照用例来测试,有时候在不经意间可能发现以前遗漏的点,能及时补充上;
2、有时候一些误操作,也可能发现隐藏的Bug;
3、通过人眼也能发现实际页面跟UI设计图上的微小差异点。
缺点:
1、存在自己主观的因素,可能因为自己的认知错误,导致用例失败,或者Bug未被发现;
2、回归测试和增删改查模块的测试,大多是重复性的操作,长时间进行重复性的工作容易造成厌烦心理,容易造成用例执行效率不高;
3、浪费时间及人力成本。
自动化测试
优点:
1、不存在主观因素,完全按照设定的测试用例执行,测试结果是客观的;
2、执行效率高,完全按照代码执行,不需人工干预,节约人力成本;
3、准确记录测试结果,自动统计测试结果。
缺点:
1、一些UI上微小的Bug不容易测出来;
2、执行用例的过程中,如果页面上报了错误,但是还能执行下去,这种Bug发现不了。
比如说:新增地址的过程中,在某个输入框录入值的过程中,有个错误提示,但是保存能正常保存,这种Bug使用自动化脚本不容易测出来,因为这条自动化用例验证的是能不能保存成功,保存成功了,代码就认为是用例成功了,不管在其过程中有什么异常情况。
适合自动化的模块
操作单一、重复性高
比如:用户注册、用户登录、新增地址等这种增删改查的模块。
这种的模块操作比较单一,结果验证也比较简单,自动化的代码重复利用率高。
举例说明:比如说新增用户模块,我们只需判断哪些数据能新增成功,哪些数据不能新增,提示信息是什么,将其写在自动化测试用例中即可。
首先将新增用户这个操作,通过自动化代码写出来(部分代码仅供讲解):
def new_user_action(self,name,password,email,phone,address):
self.find_Element(*self.name_loc).clear()
self.find_Element(*self.name_loc).send_keys(name)
self.find_Element(*self.password_loc).clear()
self.find_Element(*self.password_loc).send_keys(password)
self.find_Element(*self.email_loc).clear()
self.find_Element(*self.email_loc).send_keys(email_loc)
self.find_Element(*self.phone).clear()
self.find_Element(*self.phone).send_keys(phone)
self.find_Element(*self.address).clear()
self.find_Element(*self.address).send_keys(address)
self.find_Element(*self.save_loc).click()
(左右滑动查看完整代码)
然后将测试用例落实到每个自动化测试用例中(部分代码仅供讲解):
class new_user_test(NewUserUnit.StartEnd):
def test_new_user_pass1(self):
"""所有信息都填写正确"""
po=NewUserPage(self.driver)
po.new_user_action('test1','test1','test1@163.com','151XXXXXXXX','XX省XX市')
self.assertEqual(po.NewUserPass(),'保存成功!')
Function.snap_Shot(self.driver,'addSucess1.jpg')
po.clickConfirm()
sleep(2)
def test_new_user_pass2(self):
"""所有信息都填写正确"""
po=NewUserPage(self.driver)
po.new_user_action('test2','test2','test2@163.com','152XXXXXXXX','XX省XX市')
sleep(4)
self.assertEqual(po.NewUserPass(),'保存成功!')
Function.snap_Shot(self.driver,'addSuccess2.jpg')
po.clickConfirm()
sleep(2)
def test_new_user_fail1(self):
"""用户名重复,不能添加"""
po = NewUserPage(self.driver)
po.new_user_action('test2','test3','test3@163.com','153XXXXXXXX','XX省XX市')
sleep(4)
self.assertEqual(po.duplicationVerify(), '用户名已存在!')
Function.snap_Shot(self.driver, 'addfail1.jpg')
po.clickConfirm()
sleep(2)
def test_new_user_fail1(self):
"""用户名为空,不能添加"""
po = NewUserPage(self.driver)
po.new_user_action('','test3','test3@163.com','153XXXXXXXX','XX省XX市')
sleep(4)
self.assertEqual(po.noneVerify(), '用户名不能为空!')
Function.snap_Shot(self.driver, 'addfail1.jpg')
po.clickConfirm()
sleep(2)
(左右滑动查看完整代码)
因为动作的重复性较高,只要修改测试用例即可,添加功能使用共同的代码即可。
回归测试
回归测试做的基本上是一些相同的操作,每次在版本更新之前,都要进行回归测试。
这种类型的测试,进行自动化之后,每次版本更新都可以使用自动化脚本进行回归测试,代码利用率高,不需要反复和大量的修改,基本上就是一版代码可以多次使用,对提高工作效率很有帮助,又不需要花费大量的时间去维护代码。
页面上元素变化比较少
UI自动化测试代码,定位页面按钮、输入框等的位置时,都是使用的元素定位。如果页面元素很少修改或者基本不改,这样就不必频繁修改页面元素定位,代码的维护成本很小。
如果前台页面元素频繁修改,执行代码时就会找不到页面元素,导致用例失败,这种的要想用自动化测试,必须在修改页面元素时,同时修改自动化测试代码,才能正常执行。
这样的模块,代码修改的频率太高,修改自动化代码也需要花费人力,代码维护成本太大,不建议使用自动化。
不建议使用自动化的模块
业务流程比较复杂
业务流程复杂的模块不适合使用自动化测试。因为业务流程复杂的模块,一般都是一个系统的核心模块,核心模块一般需求变动比较频繁,测试过程中出现的异常情况比较多,使用自动化脚本进行测试的过程中,如果出现的异常情况代码里没有做处理,有可能会影响后续用例的执行,这样还不如手工测试来的方便。
例如:按照订单类型使用优惠券页面,总额满足多少可以使用类型1的优惠券,总额满多少可以使用类型2的优惠券,满足什么条件可以使用组合优惠?
这种需求,基本每个操作对应一个用例,每个用例也有不同的验证点,也就是说写一套使用优惠券的代码,只能用在一条用例上,而不能重复使用,这样写自动化的脚本意义就不大了。
而且像这种涉及订单和价格的核心模块,需求变动可能比较频繁,在修改代码的过程中,一旦页面元素发生改变,就可能导致整个脚本的失败。代码维护成本较高,建议使用手工测试的方式。
而且这种核心模块,如果使用手工测试,可能在测试的过程中,还会发现其他遗漏的测试点,使测试更加完整。如果使用自动化测试,只是按照测试用例来跑脚本,并不会完善测试用例。
与其他系统交互的模块
如果功能模块涉及与其他系统交互,其他系统又不想给你开接口对接这个东西,自动化代码就无法去其他系统验证结果。
即使能,可能也需要耗费很多的人力和时间成本(当然不排除某些大牛能快速解决这些问题),这种的不建议使用自动化测试。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。