use docsify generate doc page

This commit is contained in:
金戟 2020-11-22 22:12:51 +08:00
parent a8ed46e60d
commit df9da81f75
14 changed files with 163 additions and 84 deletions

View File

@ -1,9 +1,10 @@
# TestableMock
基于代码和字节码增强的Java单元测试辅助工具包含以下功能
换种思路写Mock让单元测试更简单。
- 使单元测试能直接调用和访问被测类的私有成员,解决私有方法无法测试的问题
- 使被测类的任意方法调用快速替换为Mock实现"指哪换哪"解决传统Mock工具使用繁琐的问题
无需初始化不挑测试框架甭管要换的方法是被测类的私有方法、静态方法还是其他任何类的成员方法也甭管要换的对象是怎么创建的。写好Mock方法加个@TestableMock注解一切统统搞定。
文档https://alibaba.github.io/testable-mock/
## 目录结构
@ -25,3 +26,12 @@
```bash
mvn clean install
```
## 本地生成文档
```bash
docsify serve docs
```
> Testable文档使用`docsify`工具生成,构建前请安装[nodejs](https://nodejs.org/en/download/)运行时,并使用`npm install -g docsify`命令安装文档生成工具。

40
docs/index.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TestableMock</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
</head>
<body>
<div id="app">Loading...</div>
<script>
window.$docsify = {
name: 'Testable',
repo: 'https://github.com/alibaba/testable-mock',
loadSidebar: "sidebar.md",
loadNavbar: "navbar.md",
mergeNavbar: true,
homepage: '/zh-cn/README.md',
alias: { '^/([^/]+)$': '/zh-cn/$1' },
plugins: [
function (hook, vm) {
hook.beforeEach(function (html) {
return html
+ '\n\n----\n\n'
+ '<a href="https://devops.aliyun.com" target="_blank" style="color: inherit; font-weight: normal; text-decoration: none;">Powered by 云效</a>'
})
}
]
}
</script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify-tabs@1"></script>
<script async defer src="https://buttons.github.io/buttons.js"></script>
</body>
</html>

View File

@ -1,14 +0,0 @@
TestableMock简介
---
换种思路写Mock让单元测试更简单。
单元测试中的Mock方法通常是为了绕开那些依赖**外部资源**或**无关功能**的方法调用,使得测试重点能够集中在**需要验证和保障的代码逻辑**上。
在定义Mock方法时开发者真正关心的只有一件事<u>这个调用在测试的时候要换成那个假的Mock方法</u>
然而当下主流的Mock框架在实现Mock功能时需要开发者操心的事情实在太多Mock框架如何初始化、与所用的单元测试框架是否兼容、要被Mock的方法是不是私有的、是不是静态的、被Mock对象是new出来的还是注入的、怎样把被测对象送回被测类里...这些非关键的额外工作极大分散了使用Mock工具应有的乐趣。
为此,我们开发了`TestableMock`**一款与众不同的轻量Mock工具**。
无需初始化不挑测试框架甭管要换的方法是被测类的私有方法、静态方法还是其他任何类的成员方法也甭管要换的对象是怎么创建的。写好Mock方法加上`@TestableMock`注解,一切统统搞定。

10
docs/zh-cn/README.md Normal file
View File

@ -0,0 +1,10 @@
TestableMock简介
---
单元测试中的Mock方法通常是为了绕开那些依赖外部资源或无关功能的方法调用使得测试重点能够集中在需要验证和保障的代码逻辑上。
在定义Mock方法时开发者真正关心的只有一件事"<u>这个调用在测试的时候要换成那个假的Mock方法</u>"。
然而当下主流的Mock框架在实现Mock功能时需要开发者操心的事情实在太多Mock框架如何初始化、与所用的单元测试框架是否兼容、要被Mock的方法是不是私有的、是不是静态的、被Mock对象是new出来的还是注入的、怎样把被测对象送回被测类里...这些非关键的额外工作极大分散了使用Mock工具应有的乐趣。
为此,我们开发了`TestableMock`**一款特立独行的轻量Mock工具**。

View File

@ -19,4 +19,4 @@
结合[Roboelectric](https://github.com/robolectric/robolectric)测试框架可使用。
Android系统的`Dalvik`和`ART`虚拟机采用了与标准JVM不同的字节码体系会影响`TestableMock`的正常工作。`Roboelectric`框架能在普通JVM虚拟机上运行Android单元测试其速度比通过Android虚拟机运行单元测试快非常多当下绝大多数Android App的单元测试都使用`Roboelectric`框架。
Android系统的`Dalvik`和`ART`虚拟机采用了与标准JVM不同的字节码体系会影响`TestableMock`的正常工作。`Roboelectric`框架能在普通JVM虚拟机上运行Android单元测试其速度比通过Android虚拟机运行单元测试快非常多绝大多数Android App的单元测试都使用`Roboelectric`框架。

View File

@ -1,4 +1,4 @@
已知问题
已知缺陷
---
#### 1. 访问私有方法或私有成员代码在IDE提示语法错误

View File

@ -0,0 +1,15 @@
访问私有成员字段和方法
---
只需为测试类添加`@EnablePrivateAccess`注解,即可在测试用例中获得以下增强能力:
- 调用被测类的私有方法
- 读取被测类的私有成员
- 修改被测类的私有成员
- 修改被测类的常量成员使用final修饰的成员
访问和修改私有、常量成员时IDE可能会提示语法有误但编译器将能够正常运行测试。
若不希望看到IDE的语法错误提醒或是在基于JVM的非Java语言项目里譬如Kotlin语言也可以借助`PrivateAccessor`工具类来实现私有成员的访问。
效果见`java-demo`和`kotlin-demo`示例项目`DemoPrivateAccessTest`测试类中的用例。

62
docs/zh-cn/doc/usage.md Normal file
View File

@ -0,0 +1,62 @@
使用TestableMock
---
`TestableMock`是基于源码和字节码增强的Java单元测试辅助工具包含以下功能
- [访问被测类私有成员](zh-cn/doc/private-accessor.md):使单元测试能直接调用和访问被测类的私有成员,解决私有成员初始化和私有方法测试的问题
- [快速Mock任意方法](zh-cn/doc/use-mock.md)使被测类的任意方法调用快速替换为Mock方法实现"指哪换哪"解决传统Mock工具使用繁琐的问题
## 在Maven项目中使用
在`pom.xml`文件中添加`testable-processor`依赖:
```xml
<dependency>
<groupId>com.alibaba.testable</groupId>
<artifactId>testable-processor</artifactId>
<version>${testable.version}</version>
<scope>provided</scope>
</dependency>
```
以及`testable-maven-plugin`插件:
```xml
<plugin>
<groupId>com.alibaba.testable</groupId>
<artifactId>testable-maven-plugin</artifactId>
<version>${testable.version}</version>
<executions>
<execution>
<id>prepare</id>
<goals>
<goal>prepare</goal>
</goals>
</execution>
</executions>
</plugin>
```
> 其中`${testable.version}`需替换为具体版本号,当前最新版本为`0.3.0`
若仅需使用单元测试随意访问被测类私有字段和方法的能力不使用Mock功能则`testable-maven-plugin`插件可以省略。
## 在Gradle项目中使用
在`build.gradle`文件中添加`testable-processor`依赖:
```groovy
dependencies {
testCompile('com.alibaba.testable:testable-processor:0.3.0')
}
```
然后在测试配置中添加javaagent
```groovy
test {
jvmArgs "-javaagent:${classpath.find { it.name.contains("testable-agent") }.absolutePath}"
}
```
> 该配置尚未在Gradle项目上经过实际验证可行性待确认。

View File

@ -1,63 +1,7 @@
使用说明
快速Mock被测类的任意方法调用
---
## 引入TestableMock
在项目的`pom.xml`文件中添加`testable-processor`依赖:
```xml
<dependency>
<groupId>com.alibaba.testable</groupId>
<artifactId>testable-processor</artifactId>
<version>${testable.version}</version>
<scope>provided</scope>
</dependency>
```
以及`testable-maven-plugin`插件:
```xml
<plugin>
<groupId>com.alibaba.testable</groupId>
<artifactId>testable-maven-plugin</artifactId>
<version>${testable.version}</version>
<executions>
<execution>
<id>prepare</id>
<goals>
<goal>prepare</goal>
</goals>
</execution>
</executions>
</plugin>
```
> 其中`${testable.version}`需替换为具体版本号,当前最新版本为`0.3.1-SNAPSHOT`
若仅需使用单元测试随意访问被测类私有字段和方法的能力不使用Mock功能则`testable-maven-plugin`插件可以省略。
## 使用TestableMock
`TestableMock`目前能为测试类提供两项增强能力__直接访问被测类的私有成员__ 和 __极速Mock被测方法中的调用__
### 访问私有成员字段和方法
只需为测试类添加`@EnablePrivateAccess`注解,即可在测试用例中获得以下增强能力:
- 调用被测类的私有方法
- 读取被测类的私有成员
- 修改被测类的私有成员
- 修改被测类的常量成员使用final修饰的成员
访问和修改私有、常量成员时IDE可能会提示语法有误但编译器将能够正常运行测试。
若不希望看到IDE的语法错误提醒或是在基于JVM的非Java语言项目里譬如Kotlin语言也可以借助`PrivateAccessor`工具类来实现私有成员的访问。
效果见`java-demo`和`kotlin-demo`示例项目中`DemoPrivateAccessTest`测试类的用例。
### Mock被测类的任意方法调用
**1. <u>覆写任意类的方法调用</u>**
#### 1. 覆写任意类的方法调用
在测试类里定义一个有`@TestableMock`注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。
@ -80,7 +24,7 @@ private String substring(String self, int i, int j) {
完整代码示例见`java-demo`和`kotlin-demo`示例项目中的`should_able_to_mock_common_method()`测试用例。(由于Kotlin对String类型进行了魔改故Kotlin示例中将被测方法在`BlackBox`类里加了一层封装)
**2. <u>覆写被测类自身的成员方法</u>**
#### 2. 覆写被测类自身的成员方法
有时候在对某些方法进行测试时希望将被测类自身的另外一些成员方法Mock掉。
@ -99,7 +43,7 @@ private String innerFunc(DemoMock self, String text) {
完整代码示例见`java-demo`和`kotlin-demo`示例项目中的`should_able_to_mock_member_method()`测试用例。
**3. <u>覆写任意类的静态方法</u>**
#### 3. 覆写任意类的静态方法
对于静态方法的Mock与普通方法相同。但需要注意的是对于静态方法传入Mock方法的第一个参数实际值始终是`null`。
@ -117,7 +61,7 @@ private BlackBox secretBox(BlackBox ignore) {
完整代码示例见`java-demo`和`kotlin-demo`示例项目中的`should_able_to_mock_static_method()`测试用例。
**4. <u>覆写任意类的new操作</u>**
#### 4. 覆写任意类的new操作
在测试类里定义一个有`@TestableMock`注解的普通方法,将注解的`targetMethod`参数写为"<init>",然后使该方法与要被创建类型的构造函数参数、返回值类型完全一致,方法名称随意。
@ -137,15 +81,14 @@ private BlackBox createBlackBox(String text) {
完整代码示例见`java-demo`和`kotlin-demo`示例项目中的`should_able_to_mock_new_object()`测试用例。
**5. <u>识别当前测试用例和调用来源</u>**
#### 5. 识别当前测试用例和调用来源
在Mock方法中可以通过`TestableTool.TEST_CASE`和`TestableTool.SOURCE_METHOD`来识别**当前运行的测试用例名称**和**进入该Mock方法前的被测类方法名称**,从而区分处理不同的调用场景。
完整代码示例见`java-demo`和`kotlin-demo`示例项目中的`should_able_to_get_source_method_name()`和`should_able_to_get_test_case_name()`测试用例。
**6. <u>验证Mock方法被调用的顺序和参数</u>**
#### 6. 验证Mock方法被调用的顺序和参数
在测试用例中可用通过`TestableTool.verify()`方法,配合`with()`、`withInOrder()`、`without()`、`withTimes()`等方法实现对Mock调用情况的验证。
详见`java-demo`和`kotlin-demo`示例项目中的相关测试用例。
详见[校验Mock调用](zh-cn/doc/matcher.md)文档。

2
docs/zh-cn/navbar.md Normal file
View File

@ -0,0 +1,2 @@
* [首页](/zh-cn/)
* [问题和反馈](https://github.com/alibaba/testable-mock/issues)

11
docs/zh-cn/sidebar.md Normal file
View File

@ -0,0 +1,11 @@
- 使用指南
- [使用TestableMock](zh-cn/doc/usage.md)
- [直接访问私有成员](zh-cn/doc/private-accessor.md)
- [快速Mock任意方法](zh-cn/doc/use-mock.md)
- [校验Mock调用](zh-cn/doc/matcher.md)
- [自助问题排查](zh-cn/doc/troubleshooting.md)
- 其他文档
- [常见问题](zh-cn/doc/frequency-asked-questions.md)
- [已知缺陷](zh-cn/doc/known-issues.md)
- [Release Note](zh-cn/doc/release-note.md)