业务型的项目测试，都应该使用 @SolonTest 注解（经常有用户无视它，所以独文再提一下）：

* 可以指定启动类
* 如果启动类有 main 函数，则会运行 main 函数（摸拟了真实的项目启动）
* 有 main 函数时，则只会启动一个 SolonApp 实例（其它测试，会不断实例化 SolonTestApp 实例，以实现环境隔离）
* 其它还可以指定应用属性，启动参数，环境等

注解属性说明：


| 属性 | 说明 | 示例 |
| -------- | -------- | -------- |
| value     | 启动类（默认为空，表示当前类）      |       |
| classes     | 启动类（默认为，表示当前类）      |       |
| delay     | 延迟秒数（默认为1）     |       |
| env     | 环境配置     |       |
| args     | 启动参数     | `args="-server.port=9999"`     |
| properties     | 应用属性     | `properties="solon.app.name=demoapp"`     |
| debug     | 是否调试模式（默认为 true）     |       |
| isAot     | 是否 AOT 运行（默认为 fasle）     |       |






### 1、启动 Solon 应用，并测试

以 TestApp 为启动类进行启动。测试一个 service 接口：

```java
@SolonTest(webapp.TestApp.class) 
public class DemoTest{
    @Inject
    UserService userService;

    @Test
    public void hello() {
        assert userService.hello("world").equals("hello world");
    }
}
```

以 TestApp 为启动类进行启动，并指定环境。测试一个 service 接口：

```java
@SolonTest(value=webapp.TestApp.class, env="dev") 
public class DemoTest{
    @Inject
    UserService userService;

    @Test
    public void hello() {
        assert userService.hello("world").equals("hello world");
    }
}
```


### 2、启动 Solon 应用，并进行 http 接口测试

基于 HttpTester 扩展测试类，方便做 http 本地接口测试：

```java
@SolonTest(webapp.TestApp.class) 
public class DemoTest extends HttpTester{
    @Inject
    UserService userService;

    @Test
    public void hello() {
        //测试注入的Service
        assert userService.hello("world").equals("hello world");
    }
    
    @Test
    public void demo1_run0() {
        //HttpTester 提供的请求本地 http 服务的接口
        assert path("/demo1/run0/?str=").get().equals("不是null(ok)");
    }
    
    @Test
    public void demo2_header() throws Exception {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("address", "192.168.1.1:9373");
        map.put("service", "wateradmin");
        map.put("meta", "");
        map.put("check_type", "0");
        map.put("is_unstable", "0");
        map.put("check_url", "/_run/check/");

        assert path("/demo2/header/")
                .header("Water-Trace-Id", "")
                .header("Water-From", "wateradmin@192.168.1.1:9373")
                .data(map)
                .post()
                .equals("OK");
    }
}
```

