之前一直忽略单元测试,遇到问题的时候 (修改-运行-等待-操作-验证) 或者 (修改-debug-操作-验证),每次调试都是需要进行这么繁琐的步骤。因为一直没有去了解,去接触单元测试,干了这么久的开发,好像也习惯了,对这些也不厌其烦。也只能说是习惯了,但是难免碰到大姨夫的时候,心里一着急,也会有摔杯子的冲动。But 现在接触到了单元测试,改变命运的时候到了。
现在流程的单元测试框架有很多:
- 开源的Robolectric
- 谷歌的Espresso
- Mockito
我今天一直在寻找一个问题的答案,这么多的框架,有什么区别,怎么去选择?
Robolectric
对于Android app来说,写起单元测试来瞻前顾后,一方面单元测试需要运行在模拟器上或者真机上,麻烦而且缓慢,另一方面,一些依赖Android SDK的对象(如Activity,TextView等)的测试非常头疼,Robolectric可以解决此类问题,它的设计思路便是通过实现一套JVM能运行的Android代码,从而做到脱离Android环境进行测试。下面对Robolectric3.0做个简单介绍,并列举了如何对Android的组件和常见功能进行测试的示例。
- 添加gradle 引入Robolectric3.0 和 AssertJ的依赖
testCompile "org.robolectric:robolectric:3.0"
testCompile "org.assertj:assertj-core:1.7.0"
- Activity测试
import android.app.Activity;
import android.widget.Button;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by jack on 2016/7/20.
*/
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest {
Activity activity;
Button button;
TextView textView;
@Before
public void setUp() {
activity = Robolectric.setupActivity(MainActivity.class);
button = (Button) activity.findViewById(R.id.bt_1);
textView = (TextView) activity.findViewById(R.id.tv_hellow);
}
@Test
public void mainActivity() {
MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
assertThat(mainActivity.getTitle()).isEqualTo(mainActivity.getTitle());
System.out.print(mainActivity.getTitle().equals((mainActivity.getTitle())));
}
@Test
public void getTextContent() {
textView.setText("123");
button.performClick();
System.out.print(textView.getText().toString());
}
}
1. 运行mainActivity测试单元
2. 运行getTextContent测试单元
未完待续