新手学习中。。。
Appium + Python + HTMLTestRunner
我的疑问有两个:
对于第一条,主要是为了体现在 HTMLTestRunner 的测试报告中
对于第二条,我用的是 :
try:
self.assertEqual(xxxx)
except:
raise
但是断言抛出错误之后,这一条 case 在测试报告中是 Fail;但是剩余的 case 就无法执行了,测试报告中都是 Error,不太晓得怎么搞了。。。。
希望各位大神可以给些思路和方法,谢谢!
unitest 或者 pytest
这两天搞了一下,之前用的是类对象(@classmethod),一个类里面三条方法都是同一个对象,如果第一个断言抛出异常,则程序结束;
去掉了装饰器,就可以实现预期效果,但是三条方法,每条执行之前都要初始化,初始化太慢了。。。。。。
还有没有好的方法??
把你完整的用例贴上来吧,你这个描述没太完全知道你用例是怎么写的,也不好说应该怎么优化写法。
不过有个点想确认下,你有使用了 unittest 这类测试用例执行管理的框架么?如果没有,可以了解试用下。你说的这些问题只要按照这些框架的写法去写,都不应该会出现。
2.使用测试框架的循环功能,以 Java 的 TestNG 为例,下面贴一小段代码
@Test(invocationCount = 3)
public void test1(){}
test1() 这个方法就会执行 3 次了,如果遇到断言失败,程序终止,那么循环还是会继续执行的,比 for 循环好一些(因为遇到断言失败 for 循环就直接停了,但是 invocationCount 不会)。
先谢谢大家哈
下面是个例子,这个例子比较蠢。。。。只是为了说明一下问题哈
我的想法是,使用类对象,按照 case3、case1、case2 的顺序去执行,这几条其实中间没有什么关系;现在如果 case3 执行失败了,那么后面两条就不会执行了;在 HTMLTestRunner 生成的测试报告中体现的就是,case3 Fail ,case1 & case2 Error
(用 HTMLTestRunner 就是为了可以生成报告)
我想着能不能 case3 Fail 了,但是可以继续执行 case1 和 case2,或者 HTMLTestRunner 有什么方法可以不用 raise 的方式判断失败,不用终止程序??
试了试把@classmethod去掉后,每条方法都执行一次 setUp 倒是可以在 Fail 之后继续执行,但是 setUp 比较慢,耗时也就长了,不晓得有没有什么其他的方式或者思路??
from appium import webdriver
import unittest
import time, os
from selenium.webdriver.support.ui import WebDriverWait
import HTMLTestRunner
class FooAssertTest(unittest.TestCase):
@classmethod
def setUp(self):
os.system("adb shell input keyevent 26")
os.system("adb shell input keyevent 3")
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9' #Pixel 2
desired_caps['deviceName'] = 'FA7971A04040' #Pixel 2
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = 'com.android.settings.Settings'
desired_caps['newCommandTimeout'] = '3600'
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_case_2(self):
self.driver.find_element_by_name("已连接的设备").click()
self.driver.find_element_by_android_uiautomator('new UiSelector().text("连接偏好设置")').click()
self.driver.find_element_by_name("蓝牙").click()
bt = self.driver.find_element_by_id("com.android.settings:id/switch_widget").get_attribute('checked')
print("蓝牙当前状态:" + bt + '\n')
try:
self.assertEqual(bt, 'true', "BT当前处于未开启状态")
except:
raise
finally:
print("test_case_2 ....................")
time.sleep(3)
os.system('adb shell input keyevent 4')
os.system('adb shell input keyevent 4')
os.system('adb shell input keyevent 4')
def test_case_3(self):
self.driver.find_element_by_name("网络和互联网").click()
self.driver.find_element_by_android_uiautomator('new UiSelector().text("WLAN")').click()
wifi = self.driver.find_element_by_id("com.android.settings:id/switch_widget").get_attribute('checked')
print("wifi当前状态: " + wifi + '\n')
try:
self.assertEqual(wifi,'true', "WiFi当前处于未开启状态")
except:
raise
finally:
print("test_case_3 ********************")
time.sleep(3)
os.system('adb shell input keyevent 4 && adb shell input keyevent 4')
def test_case_1(self):
self.driver.find_element_by_name("网络和互联网").click()
textFly = self.driver.find_element_by_id("android:id/switch_widget").get_attribute("text")
print("是否处于飞行模式:" + textFly + '\n')
try:
self.assertEqual(textFly, '关闭', "飞行模式当前处于开启状态")
except:
raise
finally:
print("test_case_1 --------------------")
time.sleep(3)
os.system('adb shell input keyevent 4')
@classmethod
def tearDown(self):
self.driver.keyevent(26)
self.driver.quit()
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(FooAssertTest("test_case_3"))
suite.addTest(FooAssertTest("test_case_1"))
suite.addTest(FooAssertTest("test_case_2"))
timestr = time.strftime('%Y-%m-%d-%H%M%S', time.localtime(time.time()))
filename = timestr+'.html'
fp = open(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream = fp,
title = 'Cody Test Demo',
description = '测试报告'
)
runner.run(suite)
fp.close()