国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pytest和Unittest測(cè)試框架的區(qū)別?

這篇具有很好參考價(jià)值的文章主要介紹了Pytest和Unittest測(cè)試框架的區(qū)別?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

如何區(qū)分這兩者,很簡(jiǎn)單unittest作為官方的測(cè)試框架,在測(cè)試方面更加基礎(chǔ),并且可以再次基礎(chǔ)上進(jìn)行二次開發(fā),同時(shí)在用法上格式會(huì)更加復(fù)雜;而pytest框架作為第三方框架,方便的地方就在于使用更加靈活,并且能夠?qū)υ衭nittest風(fēng)格的測(cè)試用例有很好的兼容性,同時(shí)在擴(kuò)展上更加豐富,可通過擴(kuò)展的插件增加使用的場(chǎng)景,比如一些并發(fā)測(cè)試等;

Pytest 安裝
pip安裝:

pip install pytest

測(cè)試安裝成功:

pytest --help
 
py.test --help

檢查安裝版本:

pytest --version

Pytest 示例

Pytest編寫規(guī)則:

  • 測(cè)試文件以test_開頭(以_test為結(jié)尾)
  • 測(cè)試的類以Test開頭;
  • 測(cè)試的方法以test_開頭
  • 斷言使用基本的assert

test_example.py

def count_num(a: list) -> int:
    return len(a)
 
 
def test_count():
    assert count_num([1, 2, 3]) != 3

執(zhí)行測(cè)試:

pytest test_example.py

執(zhí)行結(jié)果:

C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest>pytest test_example.py -v
================================================================= test session starts =================================================================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- d:\coding\python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collected 1 item                                                                                                                                       
 
test_example.py::test_count FAILED                                                                                                               [100%]
 
====================================================================== FAILURES =======================================================================
_____________________________________________________________________ test_count ______________________________________________________________________
 
    def test_count():
>       assert count_num([1, 2, 3]) != 3
E       assert 3 != 3
E        +  where 3 = count_num([1, 2, 3])
 
test_example.py:11: AssertionError
=============================================================== short test summary info ===============================================================
FAILED test_example.py::test_count - assert 3 != 3
================================================================== 1 failed in 0.16s ==================================================================

備注:

  • .代表測(cè)試通過,F(xiàn)代表測(cè)試失?。?/li>
  • -v顯示詳細(xì)的測(cè)試信息, -h顯示pytest命令詳細(xì)的幫助信息;

標(biāo)記

默認(rèn)情況下,pytest會(huì)在當(dāng)前目錄下尋找以test_為開頭(以_test結(jié)尾)的測(cè)試文件,并且執(zhí)行文件內(nèi)所有以test_為開頭(以_test為結(jié)尾)的所有函數(shù)和方法;

  1. 指定運(yùn)行測(cè)試用例,可以通過::顯示標(biāo)記(文件名::類名::方法名)(文件名::函數(shù)名)
pytest test_example3.py::test_odd
  1. 指定一些測(cè)試用例測(cè)試運(yùn)行,可以使用-k模糊匹配
pytest -k example
  1. 通過pytest.mark.skip()或者pytest.makr.skipif()條件表達(dá)式,跳過指定的測(cè)試用例
import pytest
 
test_flag = False
 
@pytest.mark.skip()
def test_odd():
    num = random.randint(0, 100)
    assert num % 2 == 1
 
 
@pytest.mark.skipif(test_flag is False, reason="test_flag is False")
def test_even():
    num = random.randint(0, 1000)
    assert num % 2 == 0
  1. 通過pytest.raises()捕獲測(cè)試用例可能拋出的異常
def test_zero():
    num = 0
    with pytest.raises(ZeroDivisionError) as e:
        num = 1/0
    exc_msg = e.value.args[0]
    print(exc_msg)
    assert num == 0
  1. 預(yù)先知道測(cè)試用例會(huì)失敗,但是不想跳過,需要顯示提示信息,使用pytest.mark.xfail()
@pytest.mark.xfail()
def test_sum():
    random_list = [random.randint(0, 100)  for x in range(10)]
    num = sum(random_list)
    assert num < 20
  1. 對(duì)測(cè)試用例進(jìn)行多組數(shù)據(jù)測(cè)試,每組參數(shù)都能夠獨(dú)立執(zhí)行一次(可以避免測(cè)試用例內(nèi)部執(zhí)行單組數(shù)據(jù)測(cè)試不通過后停止測(cè)試)
@pytest.mark.parametrize('num,num2', [(1,2),(3,4)])
def test_many_odd(num: int, num2: int):
    assert num % 2 == 1
    assert num2 % 2 == 0

固件(Fixture)

固件就是一些預(yù)處理的函數(shù),pytest會(huì)在執(zhí)行測(cè)試函數(shù)前(或者執(zhí)行后)加載運(yùn)行這些固件,常見的應(yīng)用場(chǎng)景就有數(shù)據(jù)庫(kù)的連接和關(guān)閉(設(shè)備連接和關(guān)閉)

簡(jiǎn)單使用

import pytest
 
 
@pytest.fixture()
def postcode():
    return "hello"
 
 
def test_count(postcode):
    assert postcode == "hello"

?按照官方的解釋就是當(dāng)運(yùn)行測(cè)試函數(shù),會(huì)首先檢測(cè)運(yùn)行函數(shù)的參數(shù),搜索與參數(shù)同名的fixture,一旦pytest找到,就會(huì)運(yùn)行這些固件,獲取這些固件的返回值(如果有),并將這些返回值作為參數(shù)傳遞給測(cè)試函數(shù);

預(yù)處理和后處理

接下來進(jìn)一步驗(yàn)證關(guān)于官方的說法:

import pytest
 
 
@pytest.fixture()
def connect_db():
    print("Connect Database in .......")
    yield
    print("Close Database out .......")
 
 
def read_database(key: str):
    p_info = {
        "name": "zhangsan",
        "address": "China Guangzhou",
        "age": 99
    }
    return p_info[key]
 
 
def test_count(connect_db):
    assert read_database("name") == "zhangsan"

?執(zhí)行測(cè)試函數(shù)結(jié)果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 1 item
 
test_example.py::test_count Connect Database in .......
PASSED                                       [100%]Close Database out .......
 
 
============================== 1 passed in 0.07s ==============================

備注:

首先從結(jié)果上看驗(yàn)證了官方的解釋,pytest執(zhí)行測(cè)試函數(shù)前會(huì)尋找同名的固件加載運(yùn)行;
connect_db固件中有yield,這里pytest默認(rèn)會(huì)判斷yield關(guān)鍵詞之前的代碼屬于預(yù)處理,會(huì)在測(cè)試前執(zhí)行,yield之后的代碼則是屬于后處理,將在測(cè)試后執(zhí)行;
作用域
從前面大致了解了固件的作用,抽離出一些重復(fù)的工作方便復(fù)用,同時(shí)pytest框架中為了更加精細(xì)化控制固件,會(huì)使用作用域來進(jìn)行指定固件的使用范圍,(比如在這一模塊中的測(cè)試函數(shù)執(zhí)行一次即可,不需要模塊中的函數(shù)重復(fù)執(zhí)行)更加具體的例子就是數(shù)據(jù)庫(kù)的連接,這一連接的操作可能是耗時(shí)的,我只需要在這一模塊的測(cè)試函數(shù)運(yùn)行一次即可,不需要每次都運(yùn)行。

而定義固件是,一般通過scop參數(shù)來聲明作用,常用的有:

function: 函數(shù)級(jí),每個(gè)測(cè)試函數(shù)都會(huì)執(zhí)行一次固件;
class: 類級(jí)別,每個(gè)測(cè)試類執(zhí)行一次,所有方法都可以使用;
module: 模塊級(jí),每個(gè)模塊執(zhí)行一次,模塊內(nèi)函數(shù)和方法都可使用;
session: 會(huì)話級(jí),一次測(cè)試只執(zhí)行一次,所有被找到的函數(shù)和方法都可用。

import pytest
 
 
@pytest.fixture(scope="function")
def func_scope():
    print("func_scope")
 
 
@pytest.fixture(scope="module")
def mod_scope():
    print("mod_scope")
 
 
@pytest.fixture(scope="session")
def sess_scope():
    print("session_scope")
 
 
def test_scope(sess_scope, mod_scope, func_scope):
    pass
 
 
def test_scope2(sess_scope, mod_scope, func_scope):
    pass

執(zhí)行結(jié)果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items
 
test_example2.py::test_scope session_scope
mod_scope
func_scope
PASSED                                      [ 50%]
test_example2.py::test_scope2 func_scope
PASSED                                     [100%]
 
============================== 2 passed in 0.07s ==============================

從這里可以看出module,session作用域的固件只執(zhí)行了一次,可以驗(yàn)證官方的使用介紹

自動(dòng)執(zhí)行

有人可能會(huì)說,這樣子怎么那么麻煩,unittest框架中直接定義setUp就能自動(dòng)執(zhí)行預(yù)處理,同樣的pytest框架也有類似的自動(dòng)執(zhí)行; pytest框架中固件一般通過參數(shù)autouse控制自動(dòng)運(yùn)行。

import pytest
 
 
@pytest.fixture(scope='session', autouse=True)
def connect_db():
   print("Connect Database in .......")
   yield
   print("Close Database out .......")
 
 
def test1():
   print("test1")
 
 
def test2():
   print("test")

?執(zhí)行結(jié)果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items
 
test_example.py::test1 Connect Database in .......
PASSED                                            [ 50%]test1
 
test_example.py::test2 PASSED                                            [100%]test
Close Database out .......
 
 
============================== 2 passed in 0.07s ==============================

從結(jié)果看到,測(cè)試函數(shù)運(yùn)行前后自動(dòng)執(zhí)行了connect_db固件;

參數(shù)化

前面簡(jiǎn)單的提到過了@pytest.mark.parametrize通過參數(shù)化測(cè)試,而關(guān)于固件傳入?yún)?shù)時(shí)則需要通過pytest框架中內(nèi)置的固件request,并且通過request.param獲取參數(shù)

import pytest
 
 
@pytest.fixture(params=[
    ('redis', '6379'),
    ('elasticsearch', '9200')
])
def param(request):
    return request.param
 
 
@pytest.fixture(autouse=True)
def db(param):
    print('\nSucceed to connect %s:%s' % param)
 
    yield
 
    print('\nSucceed to close %s:%s' % param)
 
 
def test_api():
    assert 1 == 1

執(zhí)行結(jié)果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items
 
test_example.py::test_api[param0] 
Succeed to connect redis:6379
PASSED                                 [ 50%]
Succeed to close redis:6379
 
test_example.py::test_api[param1] 
Succeed to connect elasticsearch:9200
PASSED                                 [100%]
Succeed to close elasticsearch:9200
 
 
============================== 2 passed in 0.07s ==============================

這里模擬連接redis和elasticsearch,加載固件自動(dòng)執(zhí)行連接然后執(zhí)行測(cè)試函數(shù)再斷開連接。

總結(jié)
對(duì)于開發(fā)來說為什么也要學(xué)習(xí)自動(dòng)化測(cè)試這一塊,很重要的一點(diǎn)就是通過自動(dòng)化測(cè)試節(jié)省一些重復(fù)工作的時(shí)間,同時(shí)對(duì)于優(yōu)化代碼結(jié)構(gòu),提高代碼覆蓋率,以及后續(xù)項(xiàng)目重構(gòu)都是有著很重要的意義,同時(shí)理解pytest和unittest在基礎(chǔ)上有何區(qū)別有助于不同的業(yè)務(wù)場(chǎng)景中選擇適合自己的測(cè)試工具。
這篇文章只是簡(jiǎn)單的介紹了pytest的基本使用,有興趣的可以去看看官方文檔,官方文檔中還提到了如內(nèi)置固件的使用,常用測(cè)試的場(chǎng)景等等。

最后感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

Pytest和Unittest測(cè)試框架的區(qū)別?,軟件測(cè)試,自動(dòng)化測(cè)試,pytest,python,開發(fā)語言

軟件測(cè)試面試小程序

被百萬人刷爆的軟件測(cè)試題庫(kù)!?。≌l用誰知道?。?!全網(wǎng)最全面試刷題小程序,手機(jī)就可以刷題,地鐵上公交上,卷起來!

涵蓋以下這些面試題板塊:

1、軟件測(cè)試基礎(chǔ)理論 ,2、web,app,接口功能測(cè)試 ,3、網(wǎng)絡(luò) ,4、數(shù)據(jù)庫(kù)?,5、linux

6、web,app,接口自動(dòng)化 ,7、性能測(cè)試?,8、編程基礎(chǔ),9、hr面試題 ,10、開放性測(cè)試題,11、安全測(cè)試,12、計(jì)算機(jī)基礎(chǔ)

?Pytest和Unittest測(cè)試框架的區(qū)別?,軟件測(cè)試,自動(dòng)化測(cè)試,pytest,python,開發(fā)語言

這些資料,對(duì)于【軟件測(cè)試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)也陪伴上萬個(gè)測(cè)試工程師們走過最艱難的路程,希望也能幫助到你!

Pytest和Unittest測(cè)試框架的區(qū)別?,軟件測(cè)試,自動(dòng)化測(cè)試,pytest,python,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-675493.html

到了這里,關(guān)于Pytest和Unittest測(cè)試框架的區(qū)別?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 震驚!強(qiáng)大的接口自動(dòng)化測(cè)試框架2.0,unittest與pytest無縫穿插對(duì)接,可以像postman一樣編寫代碼

    震驚!強(qiáng)大的接口自動(dòng)化測(cè)試框架2.0,unittest與pytest無縫穿插對(duì)接,可以像postman一樣編寫代碼

    接口自動(dòng)化測(cè)試項(xiàng)目2.0 本框架主要是基于 Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企業(yè)微信通知 + Jenkins 實(shí)現(xiàn)的接口自動(dòng)化框架。 項(xiàng)目參與者: 陳勇志 技術(shù)支持郵箱: 262667641@qq.com 個(gè)人微信: Testing_player 個(gè)人博客地址: https://home.cnblogs.com/u/Nephalem-262667641 微信公眾號(hào):測(cè)

    2024年02月12日
    瀏覽(29)
  • 軟件測(cè)試Pytest實(shí)現(xiàn)接口自動(dòng)化應(yīng)該如何在用例執(zhí)行后打印日志到日志目錄生成日志文件?

    軟件測(cè)試Pytest實(shí)現(xiàn)接口自動(dòng)化應(yīng)該如何在用例執(zhí)行后打印日志到日志目錄生成日志文件?

    Pytest可以使用內(nèi)置的logging模塊來實(shí)現(xiàn)接口自動(dòng)化測(cè)試用例執(zhí)行后打印日志到日志目錄以生成日志文件。以下是實(shí)現(xiàn)步驟: 1、在pytest配置文件(conftest.py)中,定義一個(gè)日志輸出路徑,并設(shè)置logging模塊。 2、在測(cè)試用例中調(diào)用logging模塊,輸入需要生成的日志信息。 3、運(yùn)行p

    2024年02月10日
    瀏覽(34)
  • 軟件測(cè)試 | 測(cè)試開發(fā) | Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    軟件測(cè)試 | 測(cè)試開發(fā) | Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    ** 本章介紹使用DjCelery即Django+Celery框架開發(fā)定時(shí)任務(wù)功能,在Autotestplat平臺(tái)上實(shí)現(xiàn)單一接口自動(dòng)化測(cè)試腳本、業(yè)務(wù)場(chǎng)景接口自動(dòng)化測(cè)試腳本、App自動(dòng)化測(cè)試腳本、Web自動(dòng)化測(cè)試腳本等任務(wù)的定時(shí)執(zhí)行、調(diào)度、管理等,從而取代Jenkins上的定時(shí)執(zhí)行腳本和發(fā)送郵件等功能。** 自動(dòng)

    2023年04月08日
    瀏覽(29)
  • 【軟件測(cè)試】UI自動(dòng)化框架,數(shù)據(jù)驅(qū)動(dòng) vs 關(guān)鍵字驅(qū)動(dòng)怎么選

    【軟件測(cè)試】UI自動(dòng)化框架,數(shù)據(jù)驅(qū)動(dòng) vs 關(guān)鍵字驅(qū)動(dòng)怎么選

    讓我們先從分析一端自動(dòng)化測(cè)試案例的代碼開始我們的旅程。以下是我之前寫的一個(gè)自動(dòng)化測(cè)試的小Demo。這個(gè)Demo 基于Selenium與Java 。 自動(dòng)化測(cè)試小Demo 它要測(cè)試的東西其實(shí)是要看一下百度搜索能不能返回興業(yè)銀行的官網(wǎng)。我們分析一下這段代碼都包含些什么東西。 第一,這

    2024年02月13日
    瀏覽(29)
  • 【接口自動(dòng)化測(cè)試項(xiàng)目2.0】unittest與pytest無縫穿插對(duì)接,可以像postman一樣編寫代碼

    【接口自動(dòng)化測(cè)試項(xiàng)目2.0】unittest與pytest無縫穿插對(duì)接,可以像postman一樣編寫代碼

    ??專注于分享軟件測(cè)試干貨內(nèi)容,歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯(cuò)誤敬請(qǐng)指正! ??交流討論:歡迎加入我們一起學(xué)習(xí)! ??資源分享:耗時(shí)200+小時(shí)精選的「軟件測(cè)試」資料包 ?? 最困難的時(shí)候,也就是我們離成功不遠(yuǎn)的時(shí)候! 接口自動(dòng)化測(cè)試項(xiàng)目2.0 本框架主要是基于

    2024年02月03日
    瀏覽(48)
  • 自動(dòng)化測(cè)試——unittest框架(單元測(cè)試)

    自動(dòng)化測(cè)試——unittest框架(單元測(cè)試)

    目錄 一、unittest框架解析 1.1unittest的5個(gè)重要概念 1.1測(cè)試用例的編寫及代碼 1.2斷言 1.3用例的執(zhí)行順序 1.4測(cè)試用例綜合管理框架 1.5HTML報(bào)告生成 參考博文 unittest 單元測(cè)試提供了創(chuàng)建測(cè)試用例,測(cè)試套件以及批量執(zhí)行的方案, unittest 在安裝pyhton 以后就直接自帶了,直接import

    2024年01月17日
    瀏覽(25)
  • unittest自動(dòng)化測(cè)試框架詳解

    unittest自動(dòng)化測(cè)試框架詳解

    目錄 一、單元測(cè)試的定義 二、unittest框架及原理 三、unittest的斷言 四、TestCase測(cè)試用例 五、TestFixure測(cè)試夾具 六、TestSuite測(cè)試套件 七、TestRunner執(zhí)行用例 ? 單元測(cè)試是指,對(duì)軟件中的最小可測(cè)試單元在與程序其他部分相隔離的情況下進(jìn)行檢查和驗(yàn)證的工作,這里的最小可測(cè)

    2024年02月04日
    瀏覽(25)
  • 自動(dòng)化測(cè)試框架之unittest

    unittest 是python 的單元測(cè)試框架,它主要有以下作用: 提供用例組織與執(zhí)行 :當(dāng)你的測(cè)試用例只有幾條時(shí),可以不必考慮用例的組織,但是,當(dāng)測(cè)試用例達(dá)到成百上千條時(shí),大量的測(cè)試用例堆砌在一起,就產(chǎn)生了擴(kuò)展性與維護(hù)性等問題,此時(shí)需要考慮用例的規(guī)范與組織問題了

    2024年02月01日
    瀏覽(28)
  • Python自動(dòng)化測(cè)試框架:unittest介紹

    Unittest是Python中最常用的測(cè)試框架之一,它提供了豐富和強(qiáng)大的測(cè)試工具和方法,可以幫助開發(fā)者更好地保證代碼質(zhì)量和穩(wěn)定性,本文就來介紹下Unittest單元測(cè)試框架。 unittest是Python的單元測(cè)試框架,它提供了一套豐富的測(cè)試工具和方法,包括測(cè)試用例、測(cè)試套件、斷言、測(cè)試

    2024年02月05日
    瀏覽(34)
  • (六)Selenium自動(dòng)化測(cè)試實(shí)戰(zhàn)—unittest框架

    (六)Selenium自動(dòng)化測(cè)試實(shí)戰(zhàn)—unittest框架

    上一篇:(五)Selenium自動(dòng)化測(cè)試實(shí)戰(zhàn)—PO模式_要開朗的spookypop的博客-CSDN博客 先看下代碼的運(yùn)行效果: 運(yùn)行自動(dòng)化測(cè)試代碼 unittest是python單元測(cè)試框架,它提供了一組豐富的工具來構(gòu)建和運(yùn)行測(cè)試,可以滿足日常做自動(dòng)化測(cè)試的需求。 上一篇詳細(xì)的介紹了如何用PO模式寫登

    2023年04月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包