问题一:反复重启
每次执行测试.py手机都会重启APP,然后需要重复授予权限,所以可以添加两句设定,让它在第一次启动后,再次执行测试不会再重启。
# 以下两句话可以实现每次测试时不用重复重启手机
desired_caps['noReset'] = 'true'
desired_caps['fullReset'] = 'false'
把这个话加到setup里面就可以了。
问题二:创建unittest框架
unittest单元测试框架不仅可以适用于单元测试,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
一开始需要先设置编码,然后注释本测试代码的各类信息,养成良好的习惯,然后导入测试框架包。
① 创建测试类——父类为unittest.TestCase。继承unittest.TestCase的方法,如setUp和tearDown方法和各种断言方法。
② 定义测试用例,以“test_”开头命名的方法。方法的入参统一为self,可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断。可定义多个测试用例
定义setUp()方法用于测试用例执行前的初始化工作。后面的就是关于权限授予,登录等其他测试用例方法
③ **tearDown()**方法用于测试用例执行之后的善后工作。
④ 执行测试用例。
**unittest.main()**使用可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
关于断言:
以登录方法为例——
def test_2_signin(self):
#登录
print("准备登录!", flush=True)
time.sleep(1)
self.driver.find_element_by_id("audiorec.android:id/username").send_keys("15530350778")
time.sleep(1)
self.driver.find_element_by_id("audiorec.android:id/passward").send_keys("lrs123456")
time.sleep(1)
self.driver.find_element_by_xpath("//*[@text='登录']").click()
print("成功登录!", flush=True)
#断言是否登录成功,driver.page_source方法获取当前页面所有元素,看“请输入项目号”是否在页面当中
self.assertIn("请输入项目号",driver.page_source,msg='登录失败,请查看截图'+str(screenshot_path))
这里用到的是
assertNotIn(self, member, container, msg=None)
–判断是字符串是否不包含:member not in container
其他方法:
1.assertEqual(self, first, second, msg=None)
–判断两个参数相等:first == second
2.assertNotEqual(self, first, second, msg=None)
–判断两个参数不相等:first != second
3.assertIn(self, member, container, msg=None)
–判断是字符串是否包含:member in container
4.assertNotIn(self, member, container, msg=None)
–判断是字符串是否不包含:member not in container
5.assertTrue(self, expr, msg=None)
–判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
–判断是否为假:expr is False
7.assertIsNone(self, obj, msg=None)
–判断是否为None:obj is None
8.assertIsNotNone(self, obj, msg=None)
–判断是否不为None:obj is not None