# -*- coding: utf-8 -*-
#测试报告
import os
import unittest,sys,time,re,datetime,HTMLTestRunner
from appium import webdriver
from time import sleep
import sys
#reload(sys)
#sys.setdefaultencoding('utf-8')
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
)
class ContactsAndroidTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
print 'setUpClass'
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.dialer'
desired_caps['appActivity'] = '.DialtactsActivity'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
@classmethod
def tearDownClass(cls):
cls.driver.close_app()
cls.driver.quit()
print 'tearDownClass'
def setUp(self):
print "setup"
def tearDown(self):
print 'teardown'
def test_add_contacts(self):
print 1
#def test_B(self):
self.driver.find_element_by_id('com.android.dialer:id/call_history_button').click()
def test_A(self):
print 2
self.driver.find_element_by_class_name("android.app.ActionBar$Tab").click()
if __name__ == '__main__':
#unittest.main(exit=False)
suite = unittest.TestSuite()
suite.addTest(ContactsAndroidTests("test_add_contacts"))
suite.addTest(ContactsAndroidTests("test_A"))
#suite.addTest(IposCase("testmaters"))
timestr = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
filename = "D:\\appium\\appiumresult\\result_" + timestr + ".html"
print (filename)
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='测试结果',
description='测试报告'
)
#suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)
#unittest.TextTestRunner(verbosity=2).run(suite)
runner.run(suite)
#g_browser.quit()
fp.close() #测试报告关闭
请问这个报告是用 HTMLTestRunner 吗?
额, unittest 的官方文档里是有提到 setUpClass() 这些的,而且 unittest 可以用到的方法远不止 setUp,tearDown 这些。
学习 unittest 最快的路还是去把官方文档都看一遍,不求都会用,但至少需要知道有哪些方法可以用,直接实战 +google 的方法是流沙上建房子,埋的坑只会越来越多。
之前不是跟你说了,用 java 可以秒杀吗? 还有你这测试报告给你们主管看,主管看了不会影响他的审美观吗?
#9 楼 @yangxiangfu 呵呵
#9 楼 @yangxiangfu 呵呵 我干嘛。。。
我执行了不行呢,提示没有定义 drvier
#12 楼 @test882012 哎,你先把基础打好吧
楼主,问下你用的 IDE 是啥
#14 楼 @tasidingge pycharm 啊
写的非常好
把 set_up 的方法里面的内容拿到上面类的外面去,作为一个全局变量。不封装在函数和类内
#17 楼 @julian1610 。。。。
我的测试报告,python 的,应该美观点
#19 楼 @strayeagle 牛逼,怎么做的
Traceback (most recent call last):
File "test_1.py", line 66, in <module>
fp = open(filename, 'wb')
FileNotFoundError: [Errno 2] No such file or directory: 'E:\\testspace\\appiumresult\\result_2015102
求解....
cls.driver 和 self.driver 不是一个对象,可以这么用么?
#21 楼 @turinblueice 哦,可以,instance 如果自己不对属性赋值的话,继承类的同名属性。
#24 楼 @turinblueice 。。。。。自言自语?
#24 楼 @turinblueice 你 qq 号多少啊
#26 楼 @mads 确实是要创建一个文件夹 但又开始报 py3 引入 HTMLTestTunner 的错了
Traceback (most recent call last):
File "test_1.py", line 74, in <module>
runner.run(suite)
File "E:\python\lib\HTMLTestRunner.py", line 628, in run
test(result)
File "E:\python\lib\unittest\suite.py", line 84, in __call__
return self.run(*args, **kwds)
File "E:\python\lib\unittest\suite.py", line 114, in run
self._handleClassSetUp(test, result)
File "E:\python\lib\unittest\suite.py", line 170, in _handleClassSetUp
self._addClassOrModuleLevelException(result, e, errorName)
File "E:\python\lib\unittest\suite.py", line 216, in _addClassOrModuleLevelException
result.addError(error, sys.exc_info())
File "E:\python\lib\HTMLTestRunner.py", line 584, in addError
output = self.complete_output()
File "E:\python\lib\HTMLTestRunner.py", line 558, in complete_output
return self.outputBuffer.getvalue()
AttributeError: '_TestResult' object has no attribute 'outputBuffer'
#32 楼 @turinblueice 怎么私信。。。
我也刚刚接触。。看你的 DEMO 感觉好深奥哦。。我朋友说这个框架相对于简单好用,是真的么?
@mads
我是 python 2.7 。但是执行测试时,也报了这个错误:
AttributeError: '_TestResult' object has no attribute 'outputBuffer'
请问,是什么原因呢,怎么解决呢。排错了很久,也无解
谢谢
#37 楼 @xiaoxu790 我扔那了 还没管····你 py2 可以找楼主 哈哈 @mads
python3-----修改下 HTMLTestRunner 源码-http://www.bubuko.com/infodetail-529431.html
你好,我是这么做的,但是只运行了 setUpClass 和 tearDownClass,用例都没执行
不知道是什么原因啊
AttributeError: '_TestResult' object has no attribute 'outputBuffer' 的错有人解了吗。。。
#51楼 @kesha0 class AppKeyWord(unittest.TestCase, AppExecuteKeyword.Key,Driver.MyDriver,AppiumServer.AppiumServer):
@classmethod
def setUpClass(cls):
print 'setUpClass'
cls.driver =cls.get_driver()
@classmethod
def tearDownClass(cls):
cls.driver.close_app()
cls.driver.quit()
print 'tearDownClass'
def setUp(self):
# 在测试过程中打开任意活动
# driver.start_activity(app_package, app_activity)
self.verificationErrors = []
def action(self,case_id, case_name):
self.AppExecute(case_id, case_name)
print "finish case"
@staticmethod
def getTestFunc(case_id, case_name):
def func(self):
self.action(case_id, case_name)
return func
def tearDown(self):
print "-"*70
print u"用例运行成功"
time.sleep(5)
self.assertEqual([], self.verificationErrors)
没懂你的意思,这个是我的初始化代码,要怎么改
#52 楼 @mymgbaby
亲测不用 setUpClass 就没问题,原因是什么我也不清楚
# -*- coding: utf-8 -*-
#测试报告
import os
import unittest,sys,time,re,datetime,HTMLTestRunner
from appium import webdriver
from time import sleep
import sys
#reload(sys)
#sys.setdefaultencoding('utf-8')
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
)
class ContactsAndroidTests(unittest.TestCase):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.dialer'
desired_caps['appActivity'] = '.DialtactsActivity'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
def setUp(cls):
cls.driver.start_avtivity('com.android.dialer','.DialtactsActivity')
def tearDown(cls):
print 'teardown'
def test_add_contacts(cls):
print 1
#def test_B(cls):
cls.driver.find_element_by_id('com.android.dialer:id/call_history_button').click()
def test_A(cls):
print 2
cls.driver.find_element_by_class_name("android.app.ActionBar$Tab").click()
if __name__ == '__main__':
#unittest.main(exit=False)
suite = unittest.TestSuite()
suite.addTest(ContactsAndroidTests("test_add_contacts"))
suite.addTest(ContactsAndroidTests("test_A"))
#suite.addTest(IposCase("testmaters"))
timestr = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
filename = "D:\\appium\\appiumresult\\result_" + timestr + ".html"
print (filename)
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='测试结果',
description='测试报告'
)
#suite = unittest.TestLoader().loadTestsFromTestCase(ContactsAndroidTests)
#unittest.TextTestRunner(verbosity=2).run(suite)
runner.run(suite)
#g_browser.quit()
fp.close() #测试报告关闭
ContactsAndroidTests.driver.quit()
#19 楼 @strayeagle 报告模版自己写的么?
#54 楼 @silentteamo import HTMLTestRunner。。。
请问我按你的来了但是 出现这样的错误
#56 楼 @y693055797 哎,你是不是用 selenium 的包了
#59 楼 @y693055797 不会啊,错误是啥错误哦
#61 楼 @y693055797 你是啥意思。单个函数的 assert 就是这么设计的,失败接下来的步骤也不能运行了。但是不影响接下来的其他函数
#63 楼 @y693055797 接下来的用例不运行,就是你自己脚本的问题了。我是可以继续运行的
#63 楼 @y693055797 因为是继续上一次失败的 UI 的操作,所以你得考虑上一次失败后如何跟下一个用例进行衔接
#66 楼 @y693055797 啥意思。。。重启电脑重新跑
#64 楼 @y693055797 就显示这 不往下点击
#69 楼 @y693055797 。。我咋知道。。你应该把代码贴出来,报错贴出来有啥用。。
#70 楼 @mads #-- coding: UTF-8 --
# 从这里开始 这是我敲的
import os
import unittest,time,re,datetime,HTMLTestRunner
from appium import webdriver
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
PATH=lambda p:os.path.abspath(
os.path.join(os.path.dirname(file),p)
)
class LoginAndroidTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
print 'setUpClass'
desired_caps={}
desired_caps['device'] = 'android'
desired_caps['platformName']='Android'
desired_caps['browserName']=''
desired_caps['version']='5.1.1'
desired_caps['deviceName']='061f49d4e302964a'
desired_caps['appPackage']='xxxxx'
desired_caps['appActivity']='xxxx.ui.screen.HomeActivity'
desired_caps['noSign'] = 'true'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
@classmethod
def tearDownClass(cls):
cls.driver.close_app()
cls.driver.quit()
print 'tearDownClass'
def setUp(self):
print "setup"
def tearDown(self):
print 'teardown'
def test_1login(self):
print 1
time.sleep(5)
name= self.driver.find_element_by_id('Id')
name.click()
name.send_keys('admin')
time.sleep(3)
这样的 就是不执行点击操作
#71 楼 @y693055797 能不能用代码块。。
#73 楼 @y693055797 你的 if name == 'main':呢。。。
#73 楼 @y693055797 你最好再看下自己的代码结构,没有主函数的。。
#19 楼 @strayeagle 请问报告中 case 的中文是怎么加上的
"""啊啊啊 “”“”
#82 楼 @y693055797 就这么写啊
def A():
"""啊啊啊啊啊啊啊啊"""
#84 楼 @y693055797 我不按这个玩意的
#86 楼 @y693055797 来吧,来互相伤害
#88 楼 @y693055797 来吧,来互相伤害