测试基础 如果一个脚本中有多条用例,用什么方式判定某条用例 Fail,判定失败后,怎么样才能继续执行其余用例?

tancaidexiaoming · 2020年08月14日 · 最后由 tancaidexiaoming 回复于 2020年08月19日 · 2101 次阅读

新手学习中。。。

Appium + Python + HTMLTestRunner

我的疑问有两个:

  1. 一个脚本中有多条用例,有什么方式可以判定 Fail?
  2. 如果其中一条 Fail,怎么才可以继续执行其余的用例?

对于第一条,主要是为了体现在 HTMLTestRunner 的测试报告中
对于第二条,我用的是 :

try:
    self.assertEqual(xxxx)
except:
    raise

但是断言抛出错误之后,这一条 case 在测试报告中是 Fail;但是剩余的 case 就无法执行了,测试报告中都是 Error,不太晓得怎么搞了。。。。

希望各位大神可以给些思路和方法,谢谢!

共收到 6 条回复 时间 点赞
tancaidexiaoming 关闭了讨论 08月14日 17:14
tancaidexiaoming 重新开启了讨论 08月14日 17:14

unitest 或者 pytest

这两天搞了一下,之前用的是类对象(@classmethod),一个类里面三条方法都是同一个对象,如果第一个断言抛出异常,则程序结束;
去掉了装饰器,就可以实现预期效果,但是三条方法,每条执行之前都要初始化,初始化太慢了。。。。。。

还有没有好的方法??

把你完整的用例贴上来吧,你这个描述没太完全知道你用例是怎么写的,也不好说应该怎么优化写法。

不过有个点想确认下,你有使用了 unittest 这类测试用例执行管理的框架么?如果没有,可以了解试用下。你说的这些问题只要按照这些框架的写法去写,都不应该会出现。

  • 测试中断言失败后,程序直接终止是合理的。
  • 因为自动化测试不是用来发现 Bug 的,而是用来验证从前正确的项目,现在是否依然可以通过测试。
  • 所以断言一旦失败,可以直接认为该项目没有通过测试,给开发人员提 Bug 就行了。
  • 如果想要验证错误的测试用例,比如说故意输入一些不符合规则的数据,那可以专门写一个失败类的测试用例,专门用于校验这些非法数据。
  • 自动化测试没有开发那么灵活,可以走分支(if else),不然会造成代码可读性和性能都比较差。
  • 一般来说 App 的自动化测试最好可以和接口测试结合,比如说登录、注册要输入的数据比较多,搭配接口测试可以减轻 UI 测试的工作量。同时也能减少你会遇到的问题。
  • 如果你担心前一条数据失败导致后面若干条数据都没办法执行,可以考虑:
    1. 一条数据配一个测试用例(这个办法比较蠢,不建议使用)

2.使用测试框架的循环功能,以 Java 的 TestNG 为例,下面贴一小段代码

@Test(invocationCount = 3)
public void test1(){}

test1() 这个方法就会执行 3 次了,如果遇到断言失败,程序终止,那么循环还是会继续执行的,比 for 循环好一些(因为遇到断言失败 for 循环就直接停了,但是 invocationCount 不会)。

  • 但是大量的数据输入最好还是推荐接口测试,UI 测试操作相对简单,而且不会输入过多的数据,自然也不存在一条数据失败导致后面若干条都无法输入的情况了。

先谢谢大家哈

下面是个例子,这个例子比较蠢。。。。只是为了说明一下问题哈

我的想法是,使用类对象,按照 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()
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册