? 交流讨论:欢迎加入我们一起学习!
? 资源分享:耗时200+小时精选的「软件测试」资料包
? 教程推荐:火遍全网的《软件测试》教程
?欢迎点赞 ? 收藏 ⭐留言 ? 如有错误敬请指正!
一、什么是自动化测试
把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说,自动化测试对比起手工测试除了需要写代码外并没有什么不同,它们的不同在于在各自适合的场景不同,从而使它们能够在它们的场合发挥更大的优势。
二、什么情况不需要自动化测试
①需求变动频繁
②项目周期短
③自动化脚本一次性
等受时间(少)、技术(难度大)和重用性(低)因素影响的情况
三、自动化测试过程
上面说了很多概念性的东西,现在我引入一个实例来说明自动化测试的过程。现在有一个场景,我们需要测试一个网站的登录界面(简书的登录页面)。
首先需要写测试用例(如果有需求文档再写测试用例更好,这里的登录只做最简单的手机或邮箱、密码登录,其他如记住我,注册功能不测试)
组合有两个:
手机+密码,可以拓展成①手机已注册+密码正确,②手机已注册+密码不正确,③手机未注册+密码在数据库内,④手机未注册+密码不在数据库内,⑤手机号密码均为空,⑥手机号为空,⑦密码为空,⑧手机号密码都不空。其中手机号密码全部空的情况前面四种情况都可以验证。
邮箱+密码,可以拓展的几个方面与上面相同。所以写成的手工测试用例如下图(图片中所有数据均为虚拟数据,仅供参考)
然后我们可以把这个手工测试用例转变成自动测试用例,以上的用例都属于登录这个行为的,自动化测试的用例比手工测试的用例要更详细一点。 这里举两个例子
上面的自动化测试用例中有id(编号),feature(功能名称),scenario(场景名称),given(前置条件),when(操作步骤),then(预测结果),result(实际结果)这几个元素其中,given,when,then是所有用例的基本元素,在此基础上还可以扩展更多的元素如测试数据的覆盖率,测试结果的可靠性等等,这里的元素都是用到英文是为了方便使用某些测试框架的时候直接用,可以看到里面填入的内容对比起手工测试用例要更加详细更加脚本化。
经过用例设计评审后开始进行测试,因为这次是自动化测试,所以需要写脚本,验证脚本正确性,提交缺陷。如果把脚本和用例等写在测试框架里面会更有利于我们对这次测试的管理,不过自动化测试框架是一个需要展开的内容,所以留到下下次讲。
现在我们用一个现成的框架unittest
import unittestimport timefrom selenium import webdriverfrom selenium.webdriver import ActionChainsclass testcase(unittest.TestCase): def setUp(self): print("test start") self.browser = webdriver.Chrome(r'D:\webdriver\chromedriver.exe') url = 'https://www.jianshu.com/sign_in' self.browser.get(url) input1 = self.browser.find_element_by_id('session_remember_me') selected = input1.is_selected() if selected:#判断勾选框是否勾选,把“记住我”勾选去掉 input1.click() def test_Login_001(self):#必须要加test在前面不然不执行 print("Login_001") self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888') self.browser.find_element_by_id('session_password').send_keys('ABC111') self.browser.find_element_by_class_name('sign-in-button').click() time.sleep(30) try: hover_element = self.browser.find_element_by_class_name('user') #获取需要鼠标悬停才能显示下拉栏的元素class ActionChains(self.browser).move_to_element(hover_element).perform() #鼠标移动到这个元素并悬停(在头像处悬停) time.sleep(3) self.browser.find_element_by_link_text('我的主页').click() #悬停后下拉栏选择“我的主页” result1 = self.browser.find_element_by_xpath("//a[@class='name']").text self.assertEqual(result1, '昵称') #只能是self.直接不能是self.browser. except Exception as e: print("error reason:s%" % e) raise e time.sleep(1) def test_Login_002(self): print("Login_001") self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888') self.browser.find_element_by_id('session_password').send_keys('') self.browser.find_element_by_class_name('sign-in-button').click() time.sleep(8) try: result1 = self.browser.find_element_by_xpath("//span[@class='noty_text']").text self.assertEqual(result1, '手机号码/邮箱地址或密码不能为空') #只能是self.直接不能是self.browser. except Exception as e: print("error reason:s%" % e) raise e time.sleep(1) ''' 可以继续加入用例 ''' def tearDown(self): self.browser.quit() print('test gone')if __name__=="__main__": unittest.main()
上面的代码只写了两条用例,剩下也是按照这个思路写,很多的代码解释我也写作注释了。因为这一篇章我不考虑验证码的问题,所以这里处理验证码的方法是在按登录后等待手动操作接着获取结果,用断言assertEqual判断结果是否正确。
这里用了setup和teardown两种方法,这两种方法都是每个case运行前或运行后都会执行一次的。这里也可以用setupclass和teardownclass来替代,这两种方法是在所有case执行前或执行后用一次,如果在以上这个例子中用setupclass和teardownclass需要在每个case的结尾加上重置回登录页面的代码,所以setupclass和teardownclass更加适合流程递进的用例。
不过这里需要提一下最后的这里unittest.main(),可以看到在执行程序前,引入了unittest,最后这个入口也指向了unittest的main方法,我们来看一下用例是如何被实现的。
首先,打开python文件夹,如果没有改安装路径应该会在C盘(如C:\Python\Lib\unittest),打开main.py文件可以看到unittest.main()调用的是class TestProgram进入到init初始化testRunner、testLoader并根据用例模块即我们写的case创建测试集和执行它。简单来说就是unittest.main()其实是到了class TestProgram里面我们的case经过init方法初始化case需要进行的所有动作,parseArgs方法传入参数并赋值,createTests方法根据前一个方法的赋值创建测试集,runTests方法执行测试用例这四个步骤。
完成测试需要输出测试结果
import unittestimport HTMLTestRunnerimport timeimport testcasesuite=unittest.TestSuite()#创建测试集,也就是把所有的用例放在一起ts=unittest.TestLoader()#加载测试suite.addTests(ts.loadTestsFromModule(testcase))#寻找模块名testcase的用例,把它加载并加入到测试集now=time.strftime("%Y-%m-%d_%H_%M_%S")path="python_report"+now+".html"with open(path,"wb+") as f: runner=HTMLTestRunner.HTMLTestRunner(stream=f,verbosity=2,title='MathFunc Test Report',description='generated by HTMLTestRunner.') ''' stream表示测试报告写入文件的存储区域,如stream=f表示以文件流的方式输出报告到open(path,"wb+")的路径 verbosity=1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’ =0的时候。不输出信息 =2的时候,需要打印详细的返回信息 title表示测试报告标题 description表示测试报告描述 ''' runner.run(suite)#输出结果html
这里的HTMLTestRunner我是下载HTMLTestRunner.py再进行修改得到的 ,修改方法及下载网上可查,你也可以通过pip install html-testRunner的方法下载最新的HTMLTestRunner,方法同样网上可查展示效果如下:
用户指导手册
用户指导手册每个公司都会有模板按照模板来写就可以了。
四、在这个过程你可能会遇到的问题:
1.下载webdriver与浏览器或者浏览器版本是否匹配
这一章,主要说了不需要验证码的自动化登录是如何执行的,下一章我们聊一下有验证码的情况应该如何做登录功能的自动化测试,下下一章我们再聊自动化测试框架。
最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路
作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!