1. case
· 放自动化测试用例
1.1 app(APP与web可以使用同一套测试框架,后续会详细说明)
1.2 web
web下有具体的模块用例,一个模块的case对应一个py文件,如首页模块、购物车模块各自对应一个py文件(如果模块较大,可继续细分为多个小模块,尽量不要让1个py文件行数过多)
TestCase里面的方法主要有3部分
· setUp:初始化
· test方法:具体业务实现
· tearDown:清理/释放(截图、退出)
Unittest框架执行顺序:setUp->test->tearDown
· 每执行1条测试用例之前,都要先执行setUp方法
· 每执行1条测试用例之后,都要再执行tearDown方法
· test里面报错了也会继续走tearDown
· 这三个函数名是unittest框架固定的,不能修改(大小写也不能改)
1). setUp:初始化
def setUp(self): # 初始化
# self关键字是类的一个实例化对象(只能用self表示),self.driver就是类的一个变量,这个变量就能被其他方法所认识 # 平常在一个方法中,定义的变量是局部变量,只能被这个方法认识 self.driver = webdriver.Chrome() # 初始化driver self.driver.get("http://101.133.169.100/yuns/index.php") # 打开项目地址 self.driver.maximize_window() # 窗口最大化 time.sleep(5) print("starttime:" + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))) # 打印开始时间 # strftime:格式化时间的一个方法 time.localtime(time.time()):拿到了当前的时间,并将其格式化 |
2). test方法:具体业务实现
· 一个test方法对应一个测试用例
· 包含的使用场景:搜索框中输入搜索内容后,判断返回结果是否包含了搜索的内容,如搜索女装,出现包含“女装”的商品
· 每一条自动化用例都要有一个断言结果
断言方式:
def testShouye01_01(self): '''测试首页导航文案显示是否正常''' Mylogin(self.driver).login() firstPageNavi = self.driver.find_element_by_xpath("//div[@class='top']/span") #定位控件 loginText = self.driver.find_element_by_css_selector("div.login>a:nth-child(1)") regisText = self.driver.find_element_by_css_selector("div.login>a:nth-child(3)") #断言结果,使用assertEqual判断实际结果与预期结果是否一致 #如果一致,用例pass,如果不一致,直接报错,代码不会再往下继续执行 self.assertEqual("亲,欢迎您来到云商系统商城!",firstPageNavi.text) #判断逗号前后内容是否相等,前后顺序可调换 self.assertEqual("17731990979", loginText.text) self.assertEqual("退出", regisText.text) self.assertNotEqual("dd", regisText.text) #assertNotEqual:断言不相等 #assertIn:包含 assertNotIn:不包含 self.assertIn("云商系统商城",firstPageNavi.text) #断言逗号后是否包含逗号前的内容 #如果返回的是true,则assertTrue断言通过,如果返回的是false,则失败 self.assertTrue(self.driver.find_element_by_xpath("//div[@class='top']/span").is_displayed()) #判断控件是否显示出来 self.assertFalse(firstPageNavi.is_displayed()) #判断不存在 #自创断言方式 if loginText.text == "177****0979": print("等于") else: print("不等于") self.driver.find_element_by_xpath("王麻子") #故意写一个错误语句,不相等时就会报错 |
3). tearDown:清理/释放(截图、退出)
def tearDown(self): #释放/清理 filedir = "D:/test/screenshot/" #如果电脑没有上面的路径,就创建 if not os.path.exists(filedir):os.makedirs(os.path.join('D:/', 'test', 'screenshot')) #打印结束时间 print("endTime:" + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))) screen_name = filedir + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())) + ".png" self.driver.get_screenshot_as_file(screen_name) #截图,截图名称(唯一化):截图保存路径+截图时间+.png self.driver.quit() #退出浏览器 |
截图的意义:一条用例执行结果不论是通过还是失败,都需要通过teardown,如果这条用例执行失败、报错,此时截的图就是报错时的页面。截图之前先打印了结束时间,可以通过这个时间找到对应的截图。
2. public
放常用的封装的公用的业务模块,比如登录模块,使用时直接调用
如封装登录模块,代码如下:
import time class Mylogin(object): def __init__(self, driver): #封装了一个init方法 self.driver = driver #将driver赋值给self.driver def login(self): #封装登录方法 self.driver.find_element_by_name("username").send_keys("156********") self.driver.find_element_by_name("password").send_keys("123456") self.driver.find_element_by_xpath("//div[@class='el-form-item']/div[1]").click() time.sleep(5) |
调用方法:
Mylogin(self.driver).login() |
3. report
放自动化测试报告(执行结果通过/失败),运行testrunner.py后自动生成HTML报告
4. testrunner
批量运行所有case,部分截图如下:
5. 运行
运行所有py文件:运行时不能以unittests in形式去运行,要以py形式运行。运行后会生成一个html报告。
报告截图如下:
运行后在pycharm里也可看到运行结果:
代表成功 F代表断言失败 E代表定位不到控件
· 运行单个py文件:以unittests in形式运行,运行结果会呈现在pycharm里面
· 如果运行方式不对,可到运行编辑器中设置
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。