unittest框架第二节、unittest.TestSuite()+unittest.defaultTestLoader+unittest.TextTestRunner+断言

本文深入介绍了Python的unittest框架,包括如何创建单元测试类,使用setUp()、tearDown()、setUpClass()和tearDownClass()进行资源管理。此外,讲解了TestSuite和TestLoader如何组织及运行测试用例,以及TextTestRunner生成测试报告。最后,重点阐述了unittest的各种断言方法,如assertEqual、assertTrue等,确保测试用例的正确性。

unittest.TestSuite()

""""
使用unittest框架设计mypath的单元测试用例(讲述unittest的特性)
1、导包,不需要安装
2、建一个单元测试类
3、
setUp()、test_xxx()、tearDown(),不管怎么调整顺序执行顺序不变
setUp():准备条件,资源初始化
test_xxx():测试用例,把测试步骤写在这里
tearDown():测试用例的资源释放
 @classmethodz注解方法是类方法,不用创建对象他也能用,他在对象进内存之前就已经存在的方法,随着类一起进的内存
setUpClass:给当前单元测试类所有的用例进行初始化
tearDownClass:给当前单元测试类所有的用例进行资源释放

setUpClass和setUp()区别
    setUp()不需要@classmethod注解;setUpClass方法需要@classmethod注解
    setUp()实例方法:需要创建对象再调用;setUpClass方法:不需要创建对象也可以调用
    setUp()在每一个测试用例执行之前执行一次;setUpClass方法在测试执行之前只执行一次
    setUp()是对一条测试用例进行初始化;setUpClass方法给当前单元测试类所有的用例进行初始化

4、创建测试用例:
test开头的方法

5、测试用例执行:
main():把所有的测试用例都执行了一遍,控制不了执行顺序,按照测试用例名(方法名)的字母顺序来排序执行的
如何解决:
使用测试集合的概念,testsuite
分类,我要把加法的测试用例加到测试集合testsuite中,只运行测试集合即可

testsuite:
1、testsuite创建对象
2、调用testsuite方法将addTest、addTests将测试用例加入测试集合
3、testsuite的run()方法运行测试集合
注意:run方法参数是testresult的对象:re =unittest.TestResult()
testresult中存储测试执行的结果
print(re.__dict__)





"""
import unittest
# 创建一个单元测试类
class unitmypath(unittest.TestCase):
    #一种注解,在python,java语言中使用给方法特定的含义
    @classmethod
    def setUpClass(cls) -> None:
        print("我是setupclass方法")
        # 3个用例,其中第一个需要a条件,其中第二个需要b条件,其中第三个需要c条件,三个都需要d条件
        # abc,可以放在test开头的方法中的,d条件都需要放在setUp()中(建议这么做), setUpClass也可以


    @classmethod
    def tearDownClass(cls) -> None:
        print("我是teardownclass方法")

    # 方法名不能改,self参数不能少,写test中公用的代码
    def setUp(self) -> None:
        print("我是setUp方法")
        self.mm =mymath()

    # 必须是test开头的方法,self参数不能少
    def test_add_1(self):
        print("我是第一条测试用例")
        actuallval = self.mm.jia(10,12)
        exceptval = 22
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")



    def test_add_2(self):
        print("我是第二条测试用例")
        actuallval = self.mm.jia("abc","123")
        exceptval = "abc123"
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    def test_chengfa_3(self):
        print("我是第三条测试用例")
        actuallval = self.mm.chengfa(12,2)
        exceptval = 24
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    # 方法名不能改,self参数不能少
    def tearDown(self) -> None:
        print("我是tearDown")
        # 用这句话注销对象,释放资源
        self.mm = None

# 创建一个加减法运算
class mymath():
    def jia(self,a,b):
        return a+b
    def jian(self,a,b):
        return a-b
    def chengfa(self,a,b):
        return a*b

if __name__ == '__main__':
    # 调用单元测试类
    # 这个方法可以执行单元测试用例,执行全部的测试用例
    # 如果我只想执行加法的测试用例,main()方法不太行了

    # unittest.main()

    suitt = unittest.TestSuite()
    # 测试集合对象中的一个方法,addTest---》追加单个测试用例到测试集合
    # 格式,类名(用例名)
    # 要求掌握
    # suitt.addTest(unitmypath("test_chengfa_3"))
    # suitt.addTest(unitmypath("test_add_2"))
    # suitt.addTest(unitmypath("test_add_1"))

    # 测试集合对象中的另一个方法,addTests---》追加多个测试用例到测试集合
    # 了解即可
    suitt.addTests(map(unitmypath,["test_add_2","test_add_1"]))
    # 测试集合中有run方法直接运行即可
    re =unittest.TestResult()
    suitt.run(re)
    print(re.__dict__)

unittest.TestSuite()不起作用

解决办法
解决办法

unittest.defaultTestLoader

""""
使用unittest框架设计mypath的单元测试用例(讲述unittest的特性)
1、导包,不需要安装
2、建一个单元测试类
3、
setUp()、test_xxx()、tearDown(),不管怎么调整顺序执行顺序不变
setUp():准备条件,资源初始化
test_xxx():测试用例,把测试步骤写在这里
tearDown():测试用例的资源释放
 @classmethodz注解方法是类方法,不用创建对象他也能用,他在对象进内存之前就已经存在的方法,随着类一起进的内存
setUpClass:给当前单元测试类所有的用例进行初始化
tearDownClass:给当前单元测试类所有的用例进行资源释放

setUpClass和setUp()区别
    setUp()不需要@classmethod注解;setUpClass方法需要@classmethod注解
    setUp()实例方法:需要创建对象再调用;setUpClass方法:不需要创建对象也可以调用
    setUp()在每一个测试用例执行之前执行一次;setUpClass方法在测试执行之前只执行一次
    setUp()是对一条测试用例进行初始化;setUpClass方法给当前单元测试类所有的用例进行初始化

4、创建测试用例:
test开头的方法

5、测试用例执行:
main():把所有的测试用例都执行了一遍,控制不了执行顺序,按照测试用例名(方法名)的字母顺序来排序执行的
如何解决:
使用测试集合的概念,testsuite
分类,我要把加法的测试用例加到测试集合testsuite中,只运行测试集合即可

testsuite:
1、testsuite创建对象
2、调用testsuite方法将addTest、addTests将测试用例加入测试集合
3、testsuite的run()方法运行测试集合
注意:run方法参数是testresult的对象:re =unittest.TestResult()
testresult中存储测试执行的结果
print(re.__dict__)

TestLoader:
1、创建TestLoader对象 loader = unittest.TestLoader()
2、将loader的方法loadTestsFromName()指定测试用例加载到测试集合,并返回一个测试集合对象
loadTestsFromName()的参数比较灵活(理解会用即可,必须掌握)
    1、可以是模块名 : 2
    2、可以是模块中的类名 : 2.unitmypath
    3、可以是模块中类中的某一个测试用例 : 2.unitmypath.test_add_1

3、使用loader中的discover方法(必须掌握),将指定的文件(模块)中的测试用例一次性加载完
    suitt = unittest.defaultTestLoader.discover(r"./",pattern="unit*.py")
    path:指定测试用例目录即可(单元测试用例,使用unittest写的测试用例
    pattern:指定匹配规则:unit_reg_*.py
                        unit_login_*.py




"""
import unittest
# 创建一个单元测试类
class unitmypath(unittest.TestCase):
    #一种注解,在python,java语言中使用给方法特定的含义
    @classmethod
    def setUpClass(cls) -> None:
        print("我是setupclass方法")
        # 3个用例,其中第一个需要a条件,其中第二个需要b条件,其中第三个需要c条件,三个都需要d条件
        # abc,可以放在test开头的方法中的,d条件都需要放在setUp()中(建议这么做), setUpClass也可以


    @classmethod
    def tearDownClass(cls) -> None:
        print("我是teardownclass方法")

    # 方法名不能改,self参数不能少,写test中公用的代码
    def setUp(self) -> None:
        print("我是setUp方法")
        self.mm =mymath()

    # 必须是test开头的方法,self参数不能少
    def test_add_1(self):
        print("我是第一条测试用例")
        actuallval = self.mm.jia(10,12)
        exceptval = 22
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")



    def test_add_2(self):
        print("我是第二条测试用例")
        actuallval = self.mm.jia("abc","123")
        exceptval = "abc123"
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    def test_chengfa_3(self):
        print("我是第三条测试用例")
        actuallval = self.mm.chengfa(12,2)
        exceptval = 24
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    # 方法名不能改,self参数不能少
    def tearDown(self) -> None:
        print("我是tearDown")
        # 用这句话注销对象,释放资源
        self.mm = None

# 创建一个加减法运算
class mymath():
    def jia(self,a,b):
        return a+b
    def jian(self,a,b):
        return a-b
    def chengfa(self,a,b):
        return a*b

if __name__ == '__main__':
    # 调用单元测试类
    # 这个方法可以执行单元测试用例,执行全部的测试用例
    # 如果我只想执行加法的测试用例,main()方法不太行了

    # unittest.main()

    suitt = unittest.TestSuite()
    # 测试集合对象中的一个方法,addTest---》追加单个测试用例到测试集合
    # 格式,类名(用例名)
    # suitt.addTest(unitmypath("test_chengfa_3"))
    # suitt.addTest(unitmypath("test_add_2"))
    # suitt.addTest(unitmypath("test_add_1"))

    # 测试集合对象中的另一个方法,addTests---》追加多个测试用例到测试集合
    # suitt.addTests(map(unitmypath,["test_add_2","test_add_1"]))

    # 如果测试用例大,testsuite自带的方法加测试用例到集合很麻烦
    # 可以用unittest提供的testloader模块,提供了把测试用例加载到测试集合的方法
    # 创建testloader对象
    loader =unittest.TestLoader()


    # loadTestsFromName():通过添加一个模块名、类名、测试用例名,将其中的用例添加到测试集合
    # suitt = loader.loadTestsFromName("2")
    # suitt = loader.loadTestsFromName("2.unitmypath")
    # 第一个2是模块名,第二个test_add_2是类名,最后一个才是测试用例名
    # suitt = loader.loadTestsFromName("2.unitmypath.test_add_2")


    # 使用TestLoader对象的discover方法加载用例,是将指定路径下所有符合匹配规则(pattern)的文件中的单元测试用例一次性加载
    # 第一个参数是一个目录,这个目录下可以有单元测试用例的文件(.py)
    # unit*.py表示以unit开头,以.py结尾的文件
    # 因为文件verydow*.py是线性脚本,直接运行
    # 加载测试集合并运行测试用例有几条,0条
    # unittest.defaultTestLoader.discover调用的文件一定是写了test_等类似本代码的函数,否则会加载不进来

    suitt = unittest.defaultTestLoader.discover(r"./",pattern="unit*.py")
    print(suitt.countTestCases())


    # 测试集合中有run方法直接运行即可

    # 测试结果
    re =unittest.TestResult()
    suitt.run(re)
    print(re.__dict__)

unittest.TextTestRunner

""""
使用unittest框架设计mypath的单元测试用例(讲述unittest的特性)
    1、导包,不需要安装
    2、建一个单元测试类
    3、
    setUp()、test_xxx()、tearDown(),不管怎么调整顺序执行顺序不变
    setUp():准备条件,资源初始化
    test_xxx():测试用例,把测试步骤写在这里
    tearDown():测试用例的资源释放
     @classmethodz注解方法是类方法,不用创建对象他也能用,他在对象进内存之前就已经存在的方法,随着类一起进的内存
    setUpClass:给当前单元测试类所有的用例进行初始化
    tearDownClass:给当前单元测试类所有的用例进行资源释放

    setUpClass和setUp()区别
        setUp()不需要@classmethod注解;setUpClass方法需要@classmethod注解
        setUp()实例方法:需要创建对象再调用;setUpClass方法:不需要创建对象也可以调用
        setUp()在每一个测试用例执行之前执行一次;setUpClass方法在测试执行之前只执行一次
        setUp()是对一条测试用例进行初始化;setUpClass方法给当前单元测试类所有的用例进行初始化

    4、创建测试用例:
        test开头的方法

    5、测试用例执行:
        main():把所有的测试用例都执行了一遍,控制不了执行顺序,按照测试用例名(方法名)的字母顺序来排序执行的
        如何解决:
        使用测试集合的概念,testsuite
        分类,我要把加法的测试用例加到测试集合testsuite中,只运行测试集合即可

testsuite:
    1、testsuite创建对象
    2、调用testsuite方法将addTest、addTests将测试用例加入测试集合
    3、testsuite的run()方法运行测试集合
    注意:run方法参数是testresult的对象:re =unittest.TestResult()
    testresult中存储测试执行的结果
    print(re.__dict__)

TestLoader:
    1、创建TestLoader对象 loader = unittest.TestLoader()
    2、将loader的方法loadTestsFromName()指定测试用例加载到测试集合,并返回一个测试集合对象
    loadTestsFromName()的参数比较灵活(理解会用即可)
        1、可以是模块名 : 2
        2、可以是模块中的类名 : 2.unitmypath
        3、可以是模块中类中的某一个测试用例 : 2.unitmypath.test_add_1

    3、使用loader中的discover方法(必须掌握),将指定的文件(模块)中的测试用例一次性加载完
        suitt = unittest.defaultTestLoader.discover(r"./",pattern="unit*.py")
        path:指定测试用例目录即可(单元测试用例,使用unittest写的测试用例
        pattern:指定匹配规则:unit_reg_*.py
                            unit_login_*.py

TestRunner:
    在测试用例、测试集合执行时都用的testsuite()中的run()方法,但是发现不具有可观性suitt.run(result)
    TexTestRunner--->将结果以text的形式展示的运行器





"""
import unittest
# 创建一个单元测试类
class unitmypath(unittest.TestCase):
    #一种注解,在python,java语言中使用给方法特定的含义
    @classmethod
    def setUpClass(cls) -> None:
        print("我是setupclass方法")
        # 3个用例,其中第一个需要a条件,其中第二个需要b条件,其中第三个需要c条件,三个都需要d条件
        # abc,可以放在test开头的方法中的,d条件都需要放在setUp()中(建议这么做), setUpClass也可以


    @classmethod
    def tearDownClass(cls) -> None:
        print("我是teardownclass方法")

    # 方法名不能改,self参数不能少,写test中公用的代码
    def setUp(self) -> None:
        print("我是setUp方法")
        self.mm =mymath()

    # 必须是test开头的方法,self参数不能少
    def test_add_1(self):
        print("我是第一条测试用例")
        actuallval = self.mm.jia(10,12)
        exceptval = 22
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")



    def test_add_2(self):
        print("我是第二条测试用例")
        actuallval = self.mm.jia("abc","123")
        exceptval = "abc123"
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    def test_chengfa_3(self):
        print("我是第三条测试用例")
        actuallval = self.mm.chengfa(12,2)
        exceptval = 24
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    # 方法名不能改,self参数不能少
    def tearDown(self) -> None:
        print("我是tearDown")
        # 用这句话注销对象,释放资源
        self.mm = None

# 创建一个加减法运算
class mymath():
    def jia(self,a,b):
        return a+b
    def jian(self,a,b):
        return a-b
    def chengfa(self,a,b):
        return a*b

if __name__ == '__main__':
    #  创建测试集合
    suitt = unittest.TestSuite()
    # 使用TestLoader中的discover方法返回测试集合
    suitt =unittest.defaultTestLoader.discover(r"./" , pattern="unit*.py")


    # 调用测试集合的run()方法运行测试用例
    # 创建一个TestResult的对象
    # re = unittest.TestResult()
    # suitt.run(result=re)
    # 查看运行结果
    # print(re.__dict__)

    # 使用TextTestRunner()运行器提供的run()方法运行测试集合
    # 如何产生文件流对象,如何打开一个文本文件,往里面写数据
    # 报告是以TextTestResult的形式展示的
    # TextTestRunner是TestRunner的子类
    # TextTestResult是TestResult的子类


    with open(r'./re.txt',"w",encoding="utf-8") as f:
        runner = unittest.TextTestRunner(f,descriptions="单元测试报告执行", verbosity=2)
        runner.run(suitt)





unittest.TextTestRunner不能使用的问题

断言

""""
使用unittest框架设计mypath的单元测试用例(讲述unittest的特性)
    1、导包,不需要安装
    2、建一个单元测试类
    3、
    setUp()、test_xxx()、tearDown(),不管怎么调整顺序执行顺序不变
    setUp():准备条件,资源初始化
    test_xxx():测试用例,把测试步骤写在这里
    tearDown():测试用例的资源释放
     @classmethodz注解方法是类方法,不用创建对象他也能用,他在对象进内存之前就已经存在的方法,随着类一起进的内存
    setUpClass:给当前单元测试类所有的用例进行初始化
    tearDownClass:给当前单元测试类所有的用例进行资源释放

    setUpClass和setUp()区别
        setUp()不需要@classmethod注解;setUpClass方法需要@classmethod注解
        setUp()实例方法:需要创建对象再调用;setUpClass方法:不需要创建对象也可以调用
        setUp()在每一个测试用例执行之前执行一次;setUpClass方法在测试执行之前只执行一次
        setUp()是对一条测试用例进行初始化;setUpClass方法给当前单元测试类所有的用例进行初始化

    4、创建测试用例:
        test开头的方法

    5、测试用例执行:
        main():把所有的测试用例都执行了一遍,控制不了执行顺序,按照测试用例名(方法名)的字母顺序来排序执行的
        如何解决:
        使用测试集合的概念,testsuite
        分类,我要把加法的测试用例加到测试集合testsuite中,只运行测试集合即可

testsuite:
    1、testsuite创建对象
    2、调用testsuite方法将addTest、addTests将测试用例加入测试集合
    3、testsuite的run()方法运行测试集合
    注意:run方法参数是testresult的对象:re =unittest.TestResult()
    testresult中存储测试执行的结果
    print(re.__dict__)

TestLoader:
    1、创建TestLoader对象 loader = unittest.TestLoader()
    2、将loader的方法loadTestsFromName()指定测试用例加载到测试集合,并返回一个测试集合对象
    loadTestsFromName()的参数比较灵活(理解会用即可)
        1、可以是模块名 : 2
        2、可以是模块中的类名 : 2.unitmypath
        3、可以是模块中类中的某一个测试用例 : 2.unitmypath.test_add_1

    3、使用loader中的discover方法(必须掌握),将指定的文件(模块)中的测试用例一次性加载完
        suitt = unittest.defaultTestLoader.discover(r"./",pattern="unit*.py")
        path:指定测试用例目录即可(单元测试用例,使用unittest写的测试用例
        pattern:指定匹配规则:unit_reg_*.py
                            unit_login_*.py

TestRunner:
    在测试用例、测试集合执行时都用的testsuite()中的run()方法,但是发现不具有可观性suitt.run(result)
    TexTestRunner--->将结果以text的形式展示的运行器

断言:一个测试用例两部分,一个是测试步骤,一个是测试断言,缺一不可
    unittest提供的断言方法:
        asssertEqual(a,b,msg=" "):判断a和b是否相等,如果相等则断言成功,如果不相等,则断言失败,并且输出msg消息
        asssertNotEqual(a,b,msg=" "):判断和b是否不相等
        asssertTrue(a):判断a是否为True这个bool值
        asssertIs(a,b,msg=" "):断言a和b的内存地址是否一致
        asssertIsNot(a,b,msg=" "):断言a和b的内存地址是否不相等
        asssertIsNone(a):判断对象a是不是空指针,如果是断言成功
        asssertIsNotNone(a):判断对象a是不是空指针,如果是空指针,断言失败
        asssertIn(a,b):判断对象a是不是b的成员,如果是则断言成功
        asssertNotIn(a,b):判断对象a是不是b的成员,如果不是则断言成功
        asssertIsInstance(a,b):判断对象a是不是b的一个实例对象,a是对象,b是类
        asssertIsNotInstance(a,b):判断对象a不是b的一个实例对象,a是对象,b是类





"""
import unittest
# 创建一个单元测试类
class unitmypath(unittest.TestCase):
    #一种注解,在python,java语言中使用给方法特定的含义
    @classmethod
    def setUpClass(cls) -> None:
        print("我是setupclass方法")
        # 3个用例,其中第一个需要a条件,其中第二个需要b条件,其中第三个需要c条件,三个都需要d条件
        # abc,可以放在test开头的方法中的,d条件都需要放在setUp()中(建议这么做), setUpClass也可以


    @classmethod
    def tearDownClass(cls) -> None:
        print("我是teardownclass方法")

    # 方法名不能改,self参数不能少,写test中公用的代码
    def setUp(self) -> None:
        print("我是setUp方法")
        self.mm =mymath()

    # 必须是test开头的方法,self参数不能少
    def test_add_1(self):
        print("我是第一条测试用例")
        actuallval = self.mm.jia(10,12)
        exceptval = 22
        # 判断给定的两个参数是否相等
        # self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")
        # self.assertNotEqual(12,12)
        # self.assertTrue(not False)
        # a="12"
        # b="13"
        # self.assertIs(a,b,"身份不相同")# 判断身份是否相同
        # a =None
        # self.assertIsNone(a)
        # self.assertIsNotNone(self.mm)
        # 这种方法a如果是0或者false的话,断言失败
        # 如果a是非0或者True,则断言成功
        # a = 0
        # self.assertTrue(a)
        # self.assertIn("a","anc")
        # self.assertIsInstance(self.mm,mymath)
        self.assertIsInstance("a",str)




    def test_add_2(self):
        print("我是第二条测试用例")
        actuallval = self.mm.jia("abc","123")
        exceptval = "abc123"
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    def test_chengfa_3(self):
        print("我是第三条测试用例")
        actuallval = self.mm.chengfa(12,2)
        exceptval = 22
        # 判断给定的两个参数是否相等
        self.assertEqual(actuallval,exceptval,"预期结果和实际不相等")

    # 方法名不能改,self参数不能少
    def tearDown(self) -> None:
        print("我是tearDown")
        # 用这句话注销对象,释放资源
        self.mm = None

# 创建一个加减法运算
class mymath():
    def jia(self,a,b):
        return a+b
    def jian(self,a,b):
        return a-b
    def chengfa(self,a,b):
        return a*b

if __name__ == '__main__':
    #  创建测试集合
    suitt = unittest.TestSuite()
    test_dir = './'
    # 定义测试目录为当前目录
    suitt = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')


    # # 使用TestLoader中的discover方法返回测试集合
    # suitt =unittest.defaultTestLoader.discover(r"E:\python code\jiekou\qianfengtest\untiet" , pattern="test3.py")

    # loader = unittest.TestLoader()
    # suitt =loader.loadTestsFromName("3.unitmypath")


    # 调用测试集合的run()方法运行测试用例
    # 创建一个TestResult的对象
    # re = unittest.TestResult()
    # suitt.run(result=re)
    # 查看运行结果
    # print(re.__dict__)

    # 使用TextTestRunner()运行器提供的run()方法运行测试集合
    # 如何产生文件流对象,如何打开一个文本文件,往里面写数据
    # 报告是以TextTestResult的形式展示的
    # TextTestRunner是TestRunner的子类
    # TextTestResult是TestResult的子类


    with open(r'./re.txt',"w",encoding="utf-8") as f:
        runner = unittest.TextTestRunner(f,descriptions="单元测试报告执行", verbosity=3)
        runner.run(suitt)







评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值