JUnit学习笔记(2007版)

软件测试--应用JUnit进行单元测试 一、实验原理 JUnit是一个开源的Java编程语言的单元测试框架,最初由 Erich Gamma 和 Kent Beck 编写。Junit测试是一种白盒测试工具。JUnit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。具有JUnit经验对于应用“测试驱动开发(TDD)”的程序开发模型是非常重要的。 JUnit本质上是一套框架,即开发者制定了一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接口,就可以用JUnit进行自动测试了。   由于JUnit相对独立于所编 阅读详情
、简介
    JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以说是一个全新的框架。
    由于这里使用的IDE是Eclipse 3.2.1加语言包,已经集成了junit 4.1,因此便免去下载和配置类库的麻烦了^_^
二、创建项目
    下面打开Eclipse,点击菜单“文件”->“新建”->“项目”或“新建”按钮,打开“新建”对话框:
请选中“Java项目”,点击“下一步”,进入“新建Java项目”对话框:
在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为JUnitTest,目录为F:/YPJCCK/JUnit/Eclipse/JUnitTest。由于Eclipse自带了JUnit类库,因此此时点击“完成”即可。
三、编写用于测试的JavaBean
    用于测试的JavaBean很简单,名为Book,只有id和name两个属性,这两个属性将分别用于两个用例当中。下面开始编写该JavaBean。
    请点击“文件”->“新建”->“类”,打开“新建Java类”对话框,设置包为net.test.unit.junit,名称为Book,并确保“public static void main(String[] args)”选项没有选中,然后点击“完成”。修改代码如下:
package net.test.unit.junit;
    
public class Book {
    
        private String id = null;
        private String name = null;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        publicvoid setName(String name) {
            this.name = name;
        }
    
}
至此,用于测试的JavaBean编写完成。
四、编写测试用例
    这里只用了一个类进行测试,名为BookTest。以前像这样的类是需要继承junit.framework.TestCase的,但由于JUnit 4.1充分利用了Java 5.0新增的注解功能,因此便无须再这样做了。当然,JUnit 4.1仍然提供对旧方式的支持,不过这里并不打算介绍。
    BookTest类包含两个用例,分别对应该类的caseId和caseName方法,即每个方法实现一个用例。与JUnit 3.8.1不同,在JUnit 4.1中不再强制要求方法名以test开头,而是允许随意命名,只要符合Java的命名规范就行,这里为了表明这点,特意用了case开头,但测试用例必须以@Test注解。此外,BookTest还有setUp和tearDown这两个方法,并分别使用@Before和@After来进行注解,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。注意,这两个方法的命名同样没有限制,且定义的数量也没有限制,只是必须用@Before和@After进行注解。另外,JUnit 4.1还提供了@BeforeClass和@AfterClass注解,功能与@Before和@After类似,但前者是用在所有用例执行之前做初始化、之后做清理,而后者是在每个用例执行之前做初始化、之后做清理。下面开始编写BookTest。
    在Eclipse中,创建BookTest类有两种方法:方法一,像前边创建Book类一样,点击“文件”->“新建”->“类”来创建;方法二,先在“包资源管理器”中选中Book类,然后点击“文件”->“新建”->“JUnit测试用例”,打开“新建JUint测试用例”窗口:
此时会发现,很多信息已经被Eclipse自动添加进来了。如果想利用Eclipse自动创建测试方法,请点击“下一步”。由于本文会自行编写测试方法,因此请直接点击“完成”。
    创建BookTest类后,修改代码如下:
package net.test.unit.junit;
    
import static org.junit.Assert.*;
    
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
    
public class BookTest {
    
        Book book = null;
    
        @Before
        public void setUp() throws Exception {
            System.out.println("测试开始!");
            book = new Book();
            System.out.println("book对象被初始化!");
        }
    
        @After
        public void tearDown() throws Exception {
            System.out.println("book对象将被清理!");
            book = null;
            System.out.println("测试结束!");
        }
    
        @Test
        public void caseId() {
            book.setId("001"); //设置id属性的值为001
            //使用Assert查看id属性的值是否为001
            assertEquals("001", book.getId());
            System.out.println("id属性被测试!");
        }
    
        @Test
        public void caseName() {
            book.setName("ASP"); //设置name属性的值为ASP
            //使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试
            assertEquals("JSP", book.getName());
            System.out.println("name属性被测试!");
        }
        
}
这里setUp和tearDown方法没什么好说的,就是执行了对book对象的初始化和清理,不过caseId和caseName需要说明一下。前者是在对book的id属性进行测试,首先赋值为”001”,然后使用assertEquals方法查看id属性中存放的值是否是期待的值,由于我的期待值也是”001”,所以执行后这个用例应该是成功的;后者则是对book的name属性进行测试,也是首先赋值为”ASP”,然后使用assertEquals方法查看其值是否是期待的,由于我特意将期待值设定为根本不可能的”JSP”,因此这个用例执行后会出现一个错误。
关于assertEquals方法,是Assert类的一个静态方法。在程序开头有这样一行代码,“import static org.junit.Assert.*;”,利用了Java 5.0提供的静态导入将Assert类静态导入,因此我们在程序中可以直接使用Assert类的任何静态方法。下面简单介绍一下静态类org.junit.Assert。
该类主要包含8类22个方法,如下:
    1.assertEquals(),8个重载,用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;
    2.assertFalse()和assertTrue(),各2个重载,用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测试成功,如果是true则失败,assertTrue()与之相反;
    3.assertSame()和assertNotSame(),各2个重载,用来比较两个对象的引用是否相等和不相等,类似于通过“==”和“!=”比较两个对象;
    4.assertNull()和assertNotNull(),各2个重载,用来查看对象是否为空和不为空;
    5.fail (),2个重载,意为失败,用来抛出错误。我个人认为有两个用途:首先是在测试驱动开发中,由于测试用例都是在被测试的类之前编写,而写成时又不清楚其正确与否,此时就可以使用fail方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库连接失败。
五、运行BookTest
    编写好BookTest后,就可以运行了。请点击运行按钮旁边的倒三角,选择“运行为”->“1 JUnit测试”,此时运行效果如下图:
在图片的左侧可以看到“JUnit”一栏,而且里边还有一个错误。不过这个错误是预计之内的,如果不想看到,可以将testName()方法中的”JSP”改成”ASP”,此时的运行效果如下图:
此时您会看到,“JUnit”栏中的进度条已不是红色,而是绿色的,这说明已经没有错误了。
六、测试套件
    当有多个测试类需要同时进行测试时,应使用测试套件来完成该工作。但Eclipse 3.2.1所提供的测试套件创建功能无法很好地支持JUnit 4.1,所以我们只能手工来创建了。
    点击“文件”->“新建”->“类”创建一个类,类名为AllTests,如下图:
点击“完成”,修改代码如下:
package net.test.unit.junit;
    
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
    
@RunWith(Suite.class)
@Suite.SuiteClasses(BookTest.class)
public class AllTests {}
这里空类AllTests使用@RunWith和@Suite.SuiteClasses进行注解,以作为测试程序入口。将要测试的类BookTest作为@Suite.SuiteClasses注解的参数,然后将测试套件Suite作为参数设置给运行器@RunWith。下面就可以选中该文件,点击“运行为”->“1 JUnit测试”了。
    这里注意一点,@Suite.SuiteClasses注解支持数组,例如:
        @Suite.SuiteClasses ({BookTest.class, BookTest2.class })
这样就可以一次运行多个测试类了。
七、命令行下
    前边介绍的运行方式都是基于Eclipse的,其实JUnit自身也提供了办法,可以在命令行下执行如下命令:
    java -cp junit-4.1.jar所在文件夹; org.junit.runner.JUnitCore
net.test.unit.junit.AllTests
如果要运行多个测试类,如下:
    java -cp junit-4.1.jar所在文件夹; org.junit.runner.JUnitCore
net.test.unit.junit.AllTests net.test.unit.BookTest
八、JUnit使用进阶
    @Ignore注解,忽略测试,用于忽略暂时不想运行的测试用例。以BookTest为例,在文件头部添加引用“import org.junit.Ignore;”,然后修改caseName方法:
@Ignore
@Test
    public void caseName()
点击“运行为”->“1 JUnit测试”,运行效果如下:
此时caseName()方法已经被忽略了。
    @Test注解的expected参数,异常测试,用于测试是否会抛出指定的异常,若抛出则为成功,反之为失败。请在BookTest中新增一个测试用例:
    @Test(expected = ArithmeticException.class)
    public void caseException() {
        int n = 2 / 0;
    }
这个测试用例是以0为除数,运行效果如下:
成功!因为指定的ArithmeticException异常被抛出了。
    @Test注解的timeout参数,限时测试,用于限定测试用例耗费的时间,单位毫秒,如果测试用例没有在限定时间内完成则为失败,否则以测试用例的执行结果为准。请在BookTest中新增一个测试用例:
@Test(timeout=1000)
    public void caseWhile() {
        for (;;) {
        }
}
这是一个死循环,1秒之后将被强制停止,运行效果如下:
由于超时,运行失败。
    @Parameters注解,参数化测试,用于对同一测试用例测试一组数据。请新建一个“JUnit测试用例”BookTest2,修改代码如下:
package net.test.unit.junit;
   
import static org.junit.Assert.assertEquals;
   
import java.util.Arrays;
import java.util.Collection;
   
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
   
@RunWith(Parameterized.class)
public class BookTest2 {
   
        private String expectedId;
        private String targetId;
        private String expectedName;
        private String targetName;
   
        Book book = null;
   
        @Parameters
        public static Collection Result() {
            return Arrays.asList(new Object[][] {
                { "002", "001", "JSP", "ASP" },
                { "001", "001", "ASP", "ASP" }
                });
        }
   
        public BookTest2(String expectedId, String targetId, String expectedName, String targetName) {
            this.expectedId = expectedId;
            this.targetId = targetId;
            this.expectedName = expectedName;
            this.targetName = targetName;
        }
   
        @Before
        public void setUp() throws Exception {
            System.out.println("测试开始!");
             book = new Book();
             System.out.println("book对象被初始化!");
        }
   
        @After
        public void tearDown() throws Exception {
            System.out.println("book对象将被清理!");
             book = null;
             System.out.println("测试结束!");
        }
   
        @Test
        public void caseId() {
            book.setId(targetId); //设置id属性的值
             //使用Assert查看id属性的值
             assertEquals(expectedId, book.getId());
             System.out.println("id属性被测试!");
        }
   
        @Test
        public void caseNames() {
            book.setName(targetName); //设置name属性的值
             //使用Assert查看name属性的值
             assertEquals(expectedName, book.getName());
             System.out.println("name属性被测试!");
        }
}
这个例子其实就是BookTest的扩展版,但在原基础上有几点变化:
首先是文件头部增加了一行代码:@RunWith(Parameterized.class),用来调用BookTest2类运行;
其次是定义了一个用@Parameters注解的Result静态方法,该方法用来存放测试数据,本例存放了2组数据,每组4个;
再次是定义了一个带参数的构造函数,其参数个数与每组测试数据的个数相等;
    最后是定义了expectedId等4个成员变量,用来传递测试数据到测试用例中。
下面执行BookTest2,运行效果如下:
测试用例运行了两遍,第一遍由于期待值和设定值不相等而失败,第二遍则运行成功。
    junit.framework.JUnit4TestAdapter类。依赖于Java 5.0新特性,开发测试用例无需继承junit.framework.TestCase的JUnit 4.1已经推出一段时间了,但有些自带JUnit测试环境的IDE,例如NetBeans 5.5甚至旧版Eclipse仍只支持JUnit 3,无法正确运行基于JUnit 4.1环境开发的测试用例,因此要解决这个问题,需要借助于junit.framework.JUnit4TestAdapter类。新建类TestSuite,修改代码如下:
package net.test.unit.junit;
   
public class TestSuite {
   
        public staticvoid main(String[] args) {
            junit.textui.TestRunner.run(TestSuite.suite());
        }
   
        public static junit.framework.Test suite() {
            return new junit.framework.JUnit4TestAdapter(AllTests.class);   
        }
}
其中最重要的是suite方法,该方法通过junit.framework.JUnit4TestAdapter类使基于JUnit 4环境创建的AllTests类能够运行于JUnit 3命令行环境下。
九、版本
《JUnit学习笔记》,2005年7月24日,JUnit版本3.8.1,IDE为Eclipse 3.0.1和JBuilderX。
《JUnit学习笔记(第二版)》,2006年1月27日,JUnit版本3.8.1,IDE为Eclipse 3.1.1和JBuilder 2006。
十、参考
    《JUnit 4 抢先看》;
    《单元测试利器 JUnit 4》;
    《全面认识JUnit 4的新特征》;
    《新版JUnit 4.0 抢先体验》;
    《JUnit重装上阵》等。
 
JUnit 学习笔记 2007版 JUnit学习笔记(2007版) 一、简介    JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以说是一个 阅读详情

相关推荐

在eclipse里进行Junit单元测试并生成测试报告

软件工程课程作业总结,仅供参考

weixin_51685674的博客 8323

JUnit单元测试

JUnit是一种Java语言的单元测试框架,它是最流行的单元测试框架之一。它提供了一些可用于编写和运行测试的API,并且可以生成测试报告。JUnit适用于所有Java语言的项目,例如Java应用程序、Java Servlet、Java EE应用程序以及Android应用程序等。

weixin_44084024的博客 4206

基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式

本文基于不同的JUnit版本(4和5)分别介绍了JUnit的两种不同使用方式—手工和Maven,通过代码的方式可以看出JUnit 5的包结构发生了改变,能帮助初学者入门JUnit 框架的使用和代码阅读。若想对JUnit 更深入了解,推荐阅读文献2。↩︎↩︎↩︎↩︎。

陈广智的专栏 1302

Junit单元测试的基本步骤

Junit单元测试的基本步骤

wgx_0504的博客 5934

JUnit是什么?

JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性: 1、用于测试期望结果的断言(Assertion) 2、用于共享共同测试数据的测试工具 3、用于方便的组织和运行测试的测试套件 4、图形和文本的测试运行器 JUnit最初是由Erich Gamma(GoF之一)和Kent B

ArduousBonze的专栏 6576

深入理解光流法外推雷达回波

背景介绍 鉴于本人实在太过疲惫和劳累,一些简单的便于理解的废话就不在记录,耗费两天时间研究了一下光流法,本帖用于记录学习过程中源码的难点细节。 使用光流预测的核心有两个利用多张连续回波图像(变分)或者相邻两张回波图(交叉相关,LK等)计算出光流场(速度矢量场),之后利用半拉格朗日方法进行外推。 半拉格朗日方法 三时间步半拉格朗日方法,其核心公式如下 但这个有点难理解,但看一维的图就很好理解 它的核心就是迭代求Am(位移矢量),如果理解困难的话,其实质上就是通过未来迭代(猜)出当前时刻的Am找到过去的假设

weixin_44695861的博客 6035

JUnit学习笔记

VincentViny的博客 341

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

junit4学习笔记

太久没有用junit写测试了,前几天被一个面试官问的自己很傻,所以特意在此重新学习和总结一下使用junit做测试目的是尽量早的发现程序的bug,一个bug被隐藏的时间越长,修复这个bug的代价就越大。Junit简介:    Junit最初是由Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),为单元测试(Unit Test)的支持框架。用来编写和执行重覆性的测试。即所谓白盒测试。它包括了以下的特性:对预期结果作断言提供测试装备的

Macroli 3万+

凌欧通用FOC框架解析(5.程序环流程)

结构体:电流内环.这是一个结构体函数占空比13.

weixin_43756295的博客 2938

eMMC数据擦除的方式

接下来主要是讲解erase、trim、discard的差异,涉及的command有CMD35、CMD36、CMD38。一般用来擦除整卡或者某些分区,如果只想擦除一个。以下是device status的部分解释。eMMC的数据擦除方式有6种,分别是。将会跳过写保护,只执行其他的范围。Discard的命令序列是。Erase的命令序列是。的范围有包含写保护,Trim的命令序列是。

DPJimmy的博客 1774

JUNIT学习笔记

JUNIT学习笔记 基本使用与知识储备 使用 Junit 只需要在 pom.xml 文件中的 dependencies 节点添加依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </

qq_43398404的博客 411

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1290

JUnit 5和JUnit 4比较

JUnit 5旨在调整java 8样式的编码,并且比JUnit 4更强大和灵活。在这篇文章中,JUnit 5 vs JUnit 4,我们将关注junit 4和junit 5之间的一些主要差异。 1. JUnit 5 vs JUnit 4 - 注释 两个版本中的大多数注释都是相同的,但很少有区别。这是一个快速比较。 特征 JUNIT 4 JUNIT 5 声明一种测试方法 ...

javaZhong的博客 3万+

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略

本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。

weixin_28718793的博客 291

MATLAB算法实战应用案例精讲-【数模应用】梯度提升决策树(GDBT)(附python代码)

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。.........

qq_36130719的博客 2079

SSM框架学习笔记4—Junit单元测试

SSM框架学习笔记4—Junit单元测试

北街末雨Yyg 436

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1296

JUnit 4和JUnit 5区别

特征 JUNIT 4 JUNIT 5 声明一种测试方法 @Test @Test 在当前类中的所有测试方法之前执行 @BeforeClass @BeforeAll 在当前类中的所有测试方法之后执行 @AfterClass @AfterAll 在每个测试方法之前执行 @Before @BeforeEach 每种测试方法后执行 @After @AfterEach 禁用测试方法/类 @Ignore @Disa

渣渣 6258

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Junit学习笔记

今天大概学习了Junit到底该怎么使用,以下只是个人理解。总的来说,有三点要注意的。 第一点:注解 @Test @Test用在一个方法上面,这个方法返回值是void,里面调用了Junit提供的断言函数。一个类测试单元类(比如说TestJunit.java)中可能会有很多的测试方法,只要在每个测试方法上添加@Test注解,Junit就能识别并且在之后的操作中自动地调用这些方法。 第二点:方法 As...

wy827349995的博客 333

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Junit 学习笔记

Junit 学习笔记 .skiplink{display:none}; .code { background-color: #EFEFEF; padding: 5px; font-family: Courier New, Courier, monospace; font-size: 110%; margin-bottom: 5px; m

山哥's 专栏 2404

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jUnit的学习笔记

jUnit单元测试的常用方法

程序员日志 765

JUnit 学习笔记 NetBeans篇

JUnit学习笔记(NetBeans篇) 一、简介    JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以

我是Didizyp 6528

JUnit学习笔记(一)

前言 在慕课网上听了一位老师的JUnit的基础讲解,感觉对于新人来说还是很友好,故总结下来做此笔记 什么是单元测试 你的程序主要是由一个个的 Class 组成的,一个类或一个对象当然也是一个单元,而比类更小的单元是类的方法(函式)。如果你的类中的基本单元——如某些方法不能正常工作,在某些输入条件下会得出错误的执行结果,那么如何保证你的类/对象乃至整个应用软件或系统作为一个整体能正常工作呢...

无_言的笔记本 4184
上一篇: Spring XML配置十二个最佳实践
下一篇: 团队开发利器CVS培训基础讲义
eyejava
博客等级 码龄20年 11粉丝 44原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值