嗨喽,我是blank,今天我又来为大家继续讲自动化测试咯,请搬好小板凳。那么在上篇文章中我们学到了自动化测试的运行开发环境、写测试用例类,以及生成测试报告,今天blank给大家介绍一下如何结合实际项目来让我们的项目层次规范化和代码规范化。下面重点来咯。
01
层次规范化
按照我个人的理解,层次规范化,就是各自的职责规范化,即把履行相似的职责类统一到一个目录下。结合编写自动化测试的例子来说,如果要想生成一份测试报告,这时就需要写一个单元测试,然后再生成测试报告。那么问题来了,如何去拆分职责呢?
在讲述拆分职责之前,我由衷的希望小伙伴可以去看看面向对象的设计思想,这对于你们规范化代码以及目录层次化有很重要的作用,这里就不多赘述有关于面向对象的核心思想。那对于这个问题,我们起码可以get到两个点,严格上来说是三个。其实就是单元测试、生成报告以及报告文件。展示如下图:
其中case目录下存放测试用例类,report目录下存放生成测试报告,resource目录下存放资源文件,resource目录下的report子目录用来存放测试报告文件,也许很多同学们会问,为什么测试报告摆放的位置跟其他两个不一样?blank认为截图和测试报告文件都属于资源文件,所以把他们放在同一个目录底下,这是为了方便之后的设计规则而定的。如果同学们有更多的想法也可以底下留言哈。
02
代码规范化
可能很多同学们对于代码规范化没有什么概念,blank在这里跟大家再复习一下。
所谓的代码规范化,在我理解可分为两个点:代码格式规范化、代码高效化。
代码格式规范化指开发者要注重编写代码的格式,代码风格要跟主流的格式一样,以及变量的命名规范,函数之间要有落错感,不要把代码糅合在一块,这样的话,代码可读性才会高,维护的人看着也舒服。
代码高效化:以我本人的理解,就是不要写过多冗余的代码,尽量使用封装的思想来包装代码。
下面就拿一个简单的登录模块的测试用例来举例说明,下图是测试用例图:
那测试用例写完了,思路也清晰了,就可以开始实战编写我们测试脚本咯。
首先在编写单元测试类:
1)case目录下的login.py;废话少说,下面直接上代码,同学们感兴趣的可以直接复制过去运行,就是这么任性
fromseleniumimportwebdriver
fromtimeimportsleep
#从配置文件拿出domain信息
fromconfig.indeximportdomain
importunittest
classLogin(unittest.TestCase):
u'''登录模块'''
@classmethod
defsetUpClass(cls):
cls.driver = webdriver.Chrome()
#窗口最大化
cls.driver.maximize_window()
url = domain +'/#/login'
#打开登录页面
cls.driver.get(url)
#智能等待10秒
cls.driver.implicitly_wait(10)
def__login(self, account, password):
sleep(1)
#获取inputEmail输入框元素
inputEmail =self.driver.find_element_by_id('inputEmail')
#将输入框inputEmail内容清空
inputEmail.clear()
#在输入框inputEmail输入账号信息
inputEmail.send_keys(account)
sleep(1)
#获取inputPassword输入框元素
inputPassword =self.driver.find_element_by_id('inputPassword')
#将输入框inputPassword内容清空
inputPassword.clear()
#在输入框inputPassword输入密码
inputPassword.send_keys(password)
sleep(1)
#获取submit登陆按钮框元素
submit =self.driver.find_element_by_id('submit')
#点击登录
submit.click()
sleep(1)
# case:请输入用户名
definputUserName(self):
u'''请输入用户名测试用例'''
sleep(1)
self.__login('','')
#获取登陆失败提示信息
errMsg =self.driver.find_element_by_id('bot_err').text
self.assertEquals(u'请输入用户名!', errMsg)
# case:用户不存在
defuserNotExist(self):
u'''用户不存在测试用例'''
sleep(1)
self.__login('*******','*******')
#获取登陆失败提示信息
errMsg =self.driver.find_element_by_id('bot_err').text
self.assertEquals(u'用户名不存在!', errMsg)
# case:用户名或密码输入有误!
definCorrectUser(self):
u'''账号密码错误测试用例'''
sleep(1)
self.__login('*******','*******')
#获取登陆失败提示信息
errMsg =self.driver.find_element_by_id('bot_err').text
self.assertEquals(u'用户名或密码输入有误!', errMsg)
# case:登录成功
defloginSuccess(self):
u'''账号密码错误测试用例'''
sleep(1)
self.__login('*******','*******')
# modal元素
modal =self.driver.execute_script('return document.querySelector(".ant-modal")')
ifmodal:
#点击确定登陆
self.driver.execute_script('document.querySelectorAll(".ant-modal .ant-modal- footer button")[1].click()')
sleep(5)
#获取页面地址
url =self.driver.current_url
self.assertEquals(domain +'/#/', url)
@classmethod
deftearDownClass(cls):
sleep(2)
cls.driver.close()
2)编写在report目录下login.py,也是直接上代码,复制粘贴即可使用。
importunittest
fromcase.loginimportLogin
importHTMLTestRunner
defloginCase(testUnit):
#添加测试用例
testUnit.addTest(Login('inputUserName'))
testUnit.addTest(Login('userNotExist'))
testUnit.addTest(Login('inCorrectUser'))
testUnit.addTest(Login('loginSuccess'))
if__name__ =="__main__":
testUnit = unittest.TestSuite()
loginCase(testUnit)
#报告生成路径
filename ='D:\\example\\resource\\report\\login.html'
fp =open(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream= fp,
title=u'微信管理系统测试报告',
description=u'用例执行情况:'
)
#运行测试用例
runner.run(testUnit)
fp.close()
如果有config目录的话,可以用来存放一些配置信息变量等。在登陆测试类当中,笔者封装__login方法,方法前面加上__下划线代表这个函数是私有的,只能类内部使用;因登陆逻辑会在各个测试用例中被使用,故而将其封装成方法,减少代码冗余。
项目代码地址:https://github.com/HeKunTong/autoTest,其中账号密码被我屏蔽了,有兴趣的小伙伴可以进去看看的,觉得好的话记得给我小星星哦,哈哈。
End,以上是blank第二篇文章啦,这是实战的开始,感兴趣的可以多练习下哦,同时也欢迎留言和交流,这里是一个软件测试交流的基地。
扫码二维码关注我们
有问题,欢迎留言
飞软学院今后发布的文章,只在此公众号更新
领取专属 10元无门槛券
私享最新 技术干货