1. 程式人生 > >selenium+python自動化97--unittest引數化(paramunittest

selenium+python自動化97--unittest引數化(paramunittest

http://mp.weixin.qq.com/s?__biz=MzI5ODU1MzkwMA==&mid=2247484532&idx=1&sn=8df303295e8a06c73fe0b42f0c0b3a02&chksm=eca54337dbd2ca217070815bb703d0f6794dce5aa6370809c6823dd46953c228c2c15fd67be1&mpshare=1&scene=23&srcid=04178FgANJXwXQIavin9hudG#rd

paramunittest是unittest實現引數化的一個專門的模組,可以傳入多組引數,自動生成多個用例


前面講資料驅動的時候,用ddt可以解決多組資料傳入,自動生成多個測試用例。本篇繼續介紹另外一個引數化的框架paramunittest,也能實現一樣的效果。

pip install paramunittest

1.官方文件地址:https://pypi.python.org/pypi/ParamUnittest/

2.github原始碼下載地址:https://github.com/rik0/ParamUnittest

3.官方文件上給出了2個使用案例,以下兩種方法都是可以的,小編傾向於第二種,更容易理解一些,這裡注意了,在pycharm裡面執行的時候,最後滑鼠要放到if下方執行。

4.加上這個引數verbosity=2是為了顯示用例執行詳情

import unittest
import paramunittest

# 方案一
@paramunittest.parametrized(
    ('1', '2'),
    #(4, 3),
    ('2', '3'),
    (('4', ), {'b': '5'}),
    ((), {'a': 5, 'b': 6}),
    {'a': 5, 'b': 6},
)
class TestFoo(paramunittest.ParametrizedTestCase):
    def setParameters(self, a, b):
        self.a = a
        self.b = b

    def testLess(self):
        self.assertLess(self.a, self.b)

# 方案二
@paramunittest.parametrized(
    ('1', '2'),
    #(4, 3),
    ('2', '3'),
    (('4', ), {'b': '5'}),
    ((), {'a': 5, 'b': 6}),
    {'a': 5, 'b': 6},
)
class TestBar(unittest.TestCase):
    def setParameters(self, a, b):
        self.a = a
        self.b = b

    def testLess(self):
        self.assertLess(self.a, self.b)

if __name__ == "__main__":
    unittest.main(verbosity=2)

實踐案例

1.從上面官方文件給的案例可以看出,引數可以傳元組也可以傳字典,先傳字典引數,類似於如下這種一組引數:

{“user”: “admin”, “psw”: “123”, “result”: “true”}

2.注意這裡接受引數的時候,必須要定義setParameters這個方法,並且只能是這個名稱。括號後面的引數分別接受傳入的引數名稱。前面定義的是字典,那引數就跟前面字典的key保持一致

import unittest
import paramunittest
import time
# python3.6
# 作者:上海-悠悠

@paramunittest.parametrized(
    {"user": "admin", "psw": "123", "result": "true"},
    {"user": "admin1", "psw": "1234", "result": "true"},
    {"user": "admin2", "psw": "1234", "result": "true"},
    {"user": "admin3", "psw": "1234", "result": "true"},
    {"user": "admin4", "psw": "1234", "result": "true"},
    {"user": "admin5", "psw": "1234", "result": "true"},
    {"user": "admin6", "psw": "1234", "result": "true"},
    {"user": "admin7", "psw": "1234", "result": "true"},
    {"user": "admin8", "psw": "1234", "result": "true"},
    {"user": "admin9", "psw": "1234", "result": "true"},
    {"user": "admin10", "psw": "1234", "result": "true"},
    {"user": "admin11", "psw": "1234", "result": "true"},
)

class TestDemo(unittest.TestCase):
    def setParameters(self, user, psw, result):
        '''這裡注意了,user, psw, result三個引數和前面定義的字典一一對應'''
        self.user = user
        self.user = psw
        self.result = result

    def testcase(self):
        print("開始執行用例:--------------")
        time.sleep(0.5)
        print("輸入使用者名稱:%s" % self.user)
        print("輸入密碼:%s" % self.user)
        print("期望結果:%s " % self.result)
        time.sleep(0.5)
        self.assertTrue(self.result == "true")

if __name__ == "__main__":
    unittest.main(verbosity=2)

3.執行結果:

開始執行用例:--------------
testcase (paramunittest.TestDemo_0) ... 輸入使用者名稱:123
輸入密碼:123
期望結果:true 
ok
testcase (paramunittest.TestDemo_1) ... 開始執行用例:--------------
輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
testcase (paramunittest.TestDemo_10) ... 開始執行用例:--------------
輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
開始執行用例:--------------
ok
testcase (paramunittest.TestDemo_11) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
開始執行用例:--------------
ok
testcase (paramunittest.TestDemo_2) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
開始執行用例:--------------
testcase (paramunittest.TestDemo_3) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
testcase (paramunittest.TestDemo_4) ... 開始執行用例:--------------
輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
testcase (paramunittest.TestDemo_5) ... 開始執行用例:--------------
輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
開始執行用例:--------------
ok
testcase (paramunittest.TestDemo_6) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
開始執行用例:--------------
ok
testcase (paramunittest.TestDemo_7) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
開始執行用例:--------------
testcase (paramunittest.TestDemo_8) ... 輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok
testcase (paramunittest.TestDemo_9) ... 開始執行用例:--------------
輸入使用者名稱:1234
輸入密碼:1234
期望結果:true 
ok

----------------------------------------------------------------------
Ran 12 tests in 12.001s

4.注意了,這裡的執行順序是先執行0,1,再執行10,11,12依次來的,別問我為什麼,也別找我解決,設計如此,之前ddt框架也是有同樣的問題。

5.除了傳字典引數,傳元組型別的也是可以的

@paramunittest.parametrized(
    ("admin", "123", "true"),
    ("admin1", "123", "true"),
    ("admin2", "123", "true"),
    ("admin3", "123", "true"),
    ("admin4", "123", "true"),
    ("admin5", "123", "true"),
    ("admin6", "123", "true"),
    ("admin7", "123", "true"),
    ("admin8", "123", "true"),
    ("admin9", "123", "true"),
    ("admin10", "123", "true"),
    ("admin11", "123", "true"),
    ("admin12", "123", "true")
)

生成html報告

1.unittest生成html報告參考前面介紹的這篇http://www.cnblogs.com/yoyoketang/p/6680503.html就可以了,這裡就不重複介紹了,實現的效果圖如下: