以前在 testerhome 上面看到一篇文章:
2015 年 3 月 新秀群作业-- Appium+Python+PO 设计模式 入门笔记(https://testerhome.com/topics/2226
感觉很棒,所以自己也照着这种 PageObject 的模式来写 app 的自动化用例,使用的是 appium+python。

但是现在遇到一个问题,实在不会处理。
就是那些 test_case,我在单独运行一个 test_case 时,都是可以正常执行完毕的,但是当我把它们都加进 suit=unittest.TestSuite() 中去以后,再运行 runner.run(all_test_cases),只有第一个 case 可以跑成功,后面的都是 app 都没有启动就直接报错了,希望有大神可以帮忙解惑,非常感谢。

代码:
test_case000.py

#:test_case000:老用户登录——》退出
#用户的用户名和密码《————登录方法userlogin()会用到的参数
username='panbishi'
password='123456'   

driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities) 

class test_case000(unittest.TestCase,loginPage.LoginPage):

    def setUp(self):
        self.driver=driver

     #登录+退出
    def test_login(self):
        loginPage.LoginPage(self.driver).userLogin(username,password)
        loginPage.LoginPage(self.driver).userlogout()  

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

test_case001.py

#:test_case001:新用户注册——》关闭手势密码——》退出
driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities) 

class test_case001(unittest.TestCase,loginPage.LoginPage):

    def setUp(self):
        self.driver=driver    

    #注册+关闭手势密码+退出
    def test_Register(self):
        #注册新用户
        loginPage.LoginPage(self.driver).user_Register()
        #关闭手势密码
        accountPage.AccountPage(self.driver).close_Rgesture_after_Register()
        #退出
        loginPage.LoginPage(self.driver).userlogout()     

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

Run_all_testcases.py

casepath = "..\\TestCase\\"
result = "..\\result\\"

def CreatSuite():
    #定义单元测试容器
    suite=unittest.TestSuite()
    #定搜索用例文件的方法
    discover=unittest.defaultTestLoader.discover(casepath, pattern='test_*.py', top_level_dir=None)
    #将discover方法筛选出来的用例,循环添加到测试套件中,打印出的用例信息会递增
    for test_case in discover:
            suite.addTests(test_case)           
    print suite         
    return suite

if __name__ == "__main__":
    #所有的用例集合
    all_test_cases = CreatSuite()

    #获取系统当前时间
    now = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time()))
    day = time.strftime('%Y-%m-%d', time.localtime(time.time()))

    #定义单个测试报告的存放路径,支持相对路径
    tdresult = result + day

    #若已经存在以当天日期为名称的文件夹的情况,则直接将测试报告放到这个文件夹之下
    if os.path.exists(tdresult):
        filename = tdresult + "\\" + now + "_result.html"
        #以写文本文件或写二进制文件的模式打开测试报告文件
        fp = file(filename, 'wb')
        #定义测试报告
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'小牛在线APP2.4.0-UI自动化测试报告', description=u'用例执行情况如下:')
        #运行测试用例
        runner.run(all_test_cases)
        #关闭报告文件
        fp.close()
    else:
        #不存在以当天日期为名称的文件夹的情况,则建立一个以当天日期为名称的文件夹
        os.mkdir(tdresult)
        #以写文本文件或写二进制文件的模式打开测试报告文件
        filename = tdresult + "\\" + now + "_result.html"
        fp = file(filename, 'wb')
        #定义测试报告
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'自动化测试报告', description=u'用例执行情况:')
        #运行测试用例
        runner.run(all_test_cases)
        #关闭报告文件
        fp.close()

下面是报错:
eclipse 里的提示:(就第一个 case 执行成功了,后面的 app 未启动,直接报错 EE……)

.EEEEEEEEEEEEEEEEEEEEEEE
Time Elapsed: 0:00:34.403000

测试报告中的 error 信息:

ft2.1: ImportError: Failed to import test module: test_case001
Traceback (most recent call last):
File "C:\Python27\lib\unittest\loader.py", line 254, in find_tests
module = self.get_module_from_name(name)
File "C:\Python27\lib\unittest\loader.py", line 232, in _getmodule_from_name
__import(name)
File "F:\test-project\appium-xnol-copy\TestCase\test_case001.py", line 29, in <module>
driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities)
File "C:\Python27\lib\site-packages\appium\webdriver\webdriver.py", line 36, in __init_
super(WebDriver, self).init(command_executor, desired_capabilities, browser_profile, proxy, keep_alive)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 87, in init
self.start_session(desired_capabilities, browser_profile)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 141, in start_session
'desiredCapabilities': desired_capabilities,
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: A new session could not be created. (Original error: Requested a new session but one was in progress)

报错信息里面,说的是已经有一个 session 存在,无法创建一个新 session,但是我在每一个 testcasel 里面都加了 tearDown(),前面第一个用例的 session 不是应该已经销毁了的吗?不知道为什么还是报这个错,求助……


↙↙↙阅读原文可查看相关链接,并与作者交流