由于 HTMLTestRunner.py 原本就是python2版本,目前還沒找到python3版本,所以需要我們自己修改 HTMLTestRunner.py 文件。
1. 修改的地方
問題一:No module named StringIO
原因:python 3 中 沒有 StringIO 這個模塊。這里我們需要使用io 這個模塊來代替。
解決方法:
第94行引入的名稱要改,從 import StringIO 改成import io。
相應(yīng)的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()
問題二:AttributeError: 'dict' object has no attribute 'has_key'
原因:python 3 字典類型的object 已經(jīng)不支持 has_key函數(shù),我們需要使用in 來進行遍歷。
解決方法:
定位到642行,if not rmap.has_key(cls): 需要換成 if not cls in rmap:
問題三:'str' object has no attribute 'decode'
原因:python3 里面對字符的操作中,decode已經(jīng)拿掉了。
解決方法:
定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。
另外766還有類似的uo = o.decode('latin-1'),改成 uo=o ;
問題四 :TypeError: can't concat bytes to str
原因:定位一下,報在了778行的內(nèi)容escape(uo+ue) 。這是因為我們上面給uo賦值的時候,走的是else流程,uo被賦值的是bytes類型的值。 而bytes類型不能直接轉(zhuǎn)化為str類型。所以我們需要在前面給uo賦值的時候先將bytes類型轉(zhuǎn)換為 str類型。
解決方法:
修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。
另外 774還有類似的 ue = e, 改成 ue = e.decode('utf-8')。
問題五:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'
原因: python3 不支持 print >> sys.stderr 這種寫法,這里定義輸出流的話,采用print("This is print str",file=sys.stderr) 這種方式。
解決方法:
定位到631行,把print的語句修改掉,原來是print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print('\nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)
問題六:TypeError: 'str' does not support the buffer interface
原因:定位一下,問題出在118行,這里s是str類型,我們需要把傳過來的s轉(zhuǎn)化為bytes類型。
解決方法:
定位到118行,把 self.fp.write(s) 修改為 self.fp.write(bytes(s,'UTF-8')) 即可。
2. 保存
修改后對HTMLTestRunner.py 保存一下。
3. 調(diào)用語句更改
python3 里面打開文件使用 open,不要再去用file了。
即 fp = file(filename,'wb')替換成 fp = open(filename,'wb');
關(guān)閉該文件可用fp.close()
備注: 改動之后,中文也不會亂碼。
HTMLTestRunner.py 的使用備注
1. 問題: 執(zhí)行測試用例的過程中,不會打印任何東西,導(dǎo)致上個廁所或第二天回來時,根本不知道執(zhí)行到哪了,或者執(zhí)行多少測試用例了。
解決思路: 每次執(zhí)行一個測試用例時,就打印該測試用例的名稱。
解決方案: 調(diào)用HTMLTestRunner時,定義 verbosity 為大于1的整數(shù),比如說 2:
runner=HTMLTestRunner.HTMLTestRunner(fp,title="xxxx",description="xxx",verbosity=2)
在控制臺console 就可以看到每執(zhí)行一條用例,就會有如下輸出:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">E test (testcases.login.testcase1.MyTest)
ok test (testcases.login.testcase2.MyTest)
F test (testcases.login.testcase3.MyTest)</pre>
- HTMLTestRunner 腳本閱讀。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">class OutputRedirector(object) # 將輸出進行重定向
class Template_mixin(object) # 定義生成HTML結(jié)果文件所需要的模板。 # 如果我們想改變HTML的格式等待,可以在這里進行改動
class _TestResult(TestResult) # 定義繼承自 unittest.TestResult 的 類。 # 這里重寫了 unittest.TestResult 的多個方法,比如 startTest(self, test) 等等
class HTMLTestRunner(Template_mixin) # 這里可以說是使用 HTMLTestRunner.py 的入口。定義了多個我們可以看到的方法,比如 run(self, test)
class TestProgram(unittest.TestProgram) # 這里繼承自 unittest.TestProgram 類,重寫了 runTests 方法。 # 用于命令行執(zhí)行測試</pre>
3. 缺點:使用HTMLTestRunner的執(zhí)行測試用例的過程中,如果中間中斷執(zhí)行,則已經(jīng)執(zhí)行完的用例結(jié)果也不會打印到html文件。
目前我這邊是自己編寫腳本生成html來代替使用 HTMLTestRunner ,感覺 HTMLTestRunner 應(yīng)該沒有每執(zhí)行一條用例就講結(jié)果寫入到html結(jié)果文件的方法