# 5.3A原则




3A原则原本是单元测试用例编写时应该遵循的基本原则，不过我们可以扩展到接口的自动化测试用例编写中来。

我们首先看一下3A原则在每一层自动化测试中的具体应用。

### 单元测试用例

* Arrange: 初始化测试对象或者准备测试数据
* Act : 调用被测方法
* Assert: 断言

给一个例子(c#)

```c#
[TestMethod]  
public void Withdraw_ValidAmount_ChangesBalance()  
{  
    // arrange  
    double currentBalance = 10.0;  
    double withdrawal = 1.0;  
    double expected = 9.0;  
    var account = new CheckingAccount("JohnDoe", currentBalance);  
    // act  
    account.Withdraw(withdrawal);  
    double actual = account.Balance;  
    // assert  
    Assert.AreEqual(expected, actual);  
}  
```

### 服务间的接口测试用例

服务间的接口测试实际上是黑盒测试，3A原则也适用于这种测试用例的编写

* A: arrange 初始化测试数据，就是造数据，这里的数据有我们输入的数据，也有目标接口所涉及的资源，比如hr系统中的用户信息，我们必须先有几条人员的详细信息才能去测获取人员信息的接口（当然只是正常的流程，我们有时候还需要清掉数据以便测试资源为空的情况）；
* A: act 调用接口，传入输入数据；
* A: assert 断言， 对返回的资源信息进行断言，比如获取用户信息的接口返回了用户信息之后，我们要判断返回的用户是不是我们想要的那个用户，我们获取的是李雷的信息，接口如果返回韩梅梅，那么接口的逻辑就是不对的；

举个例子(python)

```python
def test_get_task_by_id(self):
# arrange
        create_task_res = self.create_task('test', 'desc')
        new_id = create_task_res['id']

        # act
        url_for_get_by_id = self.ip + '/api/tasks/' + str(new_id)
        res = requests.request("GET", url_for_get_by_id).json()

        # assert
        self.assertEqual(res['id'], new_id)

```

### 手工测试用例

手工的功能测试用例也可以用3A原则来编写。

* Arrange: 准备被测功能相关的测试数据，比如往系统里录入一批工单以便测试工单的分页功能
* Act : 调用被测的功能，实际上这就是我们一直讲的测试步骤
* Assert: 断言

举个例子

```
# arrange and act
打开chrome浏览器并跳转至http://localhost/wordpress/wp-login.php
在用户名文本框中输入admin
在密码文本框中输入admin
点击登陆按钮
# assert
浏览器跳转到http://localhost/wordpress/wp-admin/
右上角出现“你好，admin”字样
```

### 总结

总之对于接口的自动化测试用例说来，遵循3A原则就意味着

* Arrange: 测试用例执行之前需要准备测试数据，包括需要输入的数据及存量数据
* Act: 通过不同的参数来调用接口，并拿到返回
* Assert: **必须**做断言，否则用例就没有任何意义了




原始封面

![课程图片](https://images.unsplash.com/photo-1471897488648-5eae4ac6686b?w=300)


