在我以前的项目中,我通过活动完成了大部分工作,并根据文档使用了ActivityInstrumentationTestCase2:
http://developer.android.com/tools/testing/activity_testing.html
我知道如何使用Activity Test案例;但是当谈到Fragment时,我没有太多的想法,也没有找到与此相关的文档。
那么当我有几个片段有一个或两个活动时,如何编写测试用例?
任何示例代码或示例都会更有帮助。
答案 0 :(得分:25)
以下是使用ActivityInstrumentationTestCase2
的粗略指南:
第1步。创建一个空白活动来保存您的片段
private static class FragmentUtilActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout view = new LinearLayout(this);
view.setId(1);
setContentView(view);
}
}
第2步: 在测试中,实例化您的片段并将其添加到空白活动
public class MyFragmentTest extends ActivityInstrumentationTestCase2<FragmentUtilActivity> {
private MyFragment fragment;
@Before
public void setup() {
fragment = new MyFragment();
getActivity().getFragmentManager().beginTransaction().add(1, fragment, null).commit();
}
}
第3步测试您的实例化片段
@Test
public void aTest() {
fragment.getView().findViewById(...);
}
如果您正在使用robolectric,使用FragmentUtilTest类非常简单:
@Test
public void aTest() {
// instantiate your fragment
MyFragment fragment = new MyFragment();
// Add it to a blank activity
FragmentTestUtil.startVisibleFragment(fragment);
// ... call getView().findViewById() on your fragment
}
答案 1 :(得分:3)
这是我的工作解决方案:
在androidTest目录中为此创建一个检测单元测试类,即:
public class FragmentTest extends
ActivityInstrumentationTestCase2<MainActivity> {
private MainActivity testingActivity;
private TestFragment testFragment;
//...
}
在这个新类中调用此构造函数:
public FragmentTest() {
super(MainActivity.class);
}
覆盖setUp()方法(确保在Activity类中有R.id.fragmentContainer),最后将调用 waitForIdleSync():
@Override
protected void setUp() throws Exception {
super.setUp();
// Starts the activity under test using
// the default Intent with:
// action = {@link Intent#ACTION_MAIN}
// flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
// All other fields are null or empty.
testingActivity = getActivity();
testFragment = new TestFragment();
testingActivity.getFragmentManager().beginTransaction().add(R.id.fragmentContainer,testFragment,null).commit();
/**
* Synchronously wait for the application to be idle. Can not be called
* from the main application thread -- use {@link #start} to execute
* instrumentation in its own thread.
*
* Without waitForIdleSync(); our test would have nulls in fragment references.
*/
getInstrumentation().waitForIdleSync();
}
编写测试方法,例如:
public void testGameFragmentsTextViews() {
String empty = "";
TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
assertTrue("Empty stuff",(textView.getText().equals(empty)));
}
运行测试。
答案 2 :(得分:2)
将您的主要活动用作您发送到ActivityInstrumentationTestCase2的测试活动。然后,您可以通过启动片段的主活动的片段管理器处理片段。这比测试活动更好,因为它使用您在主活动中编写的逻辑来测试场景,从而提供更全面,更完整的测试。
示例:
public class YourFragmentTest extends ActivityInstrumentationTestCase2<MainActivity> {
public YourFragmentTest(){
super(MainActivity.class);
}
}
答案 3 :(得分:2)
AndroidX
提供了一个FragmentScenario
库,用于创建片段并更改其状态。
app / build.gradle
dependencies {
def fragment_version = "1.0.0"
// ...
debugImplementation 'androidx.fragment:fragment-testing:$fragment_version'
}
示例
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
// The "fragmentArgs" and "factory" arguments are optional.
val fragmentArgs = Bundle().apply {
putInt("selectedListItem", 0)
}
val factory = MyFragmentFactory()
val scenario = launchFragmentInContainer<MyFragment>(
fragmentArgs, factory)
onView(withId(R.id.text)).check(matches(withText("Hello World!")))
}
}
更多{@ {3}}。
答案 4 :(得分:0)
现在不推荐使用ActivityInstrumentationTestCase2。现在,您可以使用规则来使用测试中的活动:http://wiebe-elsinga.com/blog/whats-new-in-android-testing/
为了让那些人工作,你必须将依赖项添加到build.gradle:
testCompile 'com.android.support.test:rules:0.5'
testCompile 'com.android.support.test:runner:0.5'
(见Why cannot I import AndroidJUnit4 and ActivityTestRule into my unit test class?)