2016-07-18 10 views
1

Ich habe viele Artikel gelesen und versucht, einen Komponententest mit Roboelectric zu starten, aber ich bekomme es immer noch nicht und bin nicht in der Lage, einen einfachen Komponententest zu schreiben. Kann mir jemand sagen, was zu verwenden und wie zu starten, da Unit-Tests in Android nicht einfach ist.Android Unit Test Start

+0

Haben Sie ihre Website Tutorial überprüft? – Lawrance

+0

https://developer.android.com/training/testing/start/index.html –

+0

@Lawrance ja, ich habe die Website-Tutorials überprüft und bin immer noch nicht in der Lage, eine klare Idee zu haben –

Antwort

2

verwenden Robotium nächsten Schritte folgen:

1.- Import Robotium - Build.gradle:

dependencies { 
    .... 
    testCompile 'junit:junit:4.12' 
    ..... 
    compile 'com.jayway.android.robotium:robotium-solo:5.6.0' 
    compile 'com.android.support:support-annotations:23.0.0' 
    ..... 
} 

2.- eine Abtract Klasse Erstellen Sie Ihren Test innerhalb androidTest Paket zu initialisieren:

import android.app.Activity; 
import android.test.ActivityInstrumentationTestCase2; 

import com.robotium.solo.Solo; 


public abstract class AbstractSystemTestBase<T extends Activity> extends ActivityInstrumentationTestCase2<T> { 

    public static final int WAIT_FOR_ACTIVITY_TIMEOUT = 30000; 
    public static final int WAIT_FOR_DIALOG_TIMEOUT = 30000;  
    public static final int WAIT_FOR_VIEW_TIMEOUT = 6000; 
    public static final int WAIT_FOR_TEXT_TIMEOUT = 6000; 
    public static final int STANDARD_WAIT_TIME = 30000; 
    public static final int SHORT_WAIT_TIME = 5000; 

    protected Solo solo; 

    public AbstractSystemTestBase(Class<T> activityClass) { 
     super(activityClass); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     solo = new Solo(getInstrumentation(), getActivity()); 
    } 

    @Override 
    public void tearDown() throws Exception { 
     super.tearDown(); 
     solo.finishOpenedActivities(); 
    } 


} 

3.- Erstellen Sie Ihre Testklasse, die abstrakte Klasse (in androidTest-Paket) erweitern:

public class TestMainMenu extends AbstractSystemTestBase<MainMenuActivity> { 

    public TestMainMenu() { 
     super(MainMenuActivity.class); 
    } 

    public void testMenu() throws InterruptedException { 
     assertTrue("MainMenu Activity never started", solo.waitForActivity(MainMenuActivity.class, WAIT_FOR_ACTIVITY_TIMEOUT)); 
     //YOUR TESTS HERE 

     //EXAMPLE: 

     View view = solo.getView("main_menu_activity_iv_go_activity_one"); 
     solo.clickOnView(view); 
     assertTrue("Activity one never started", solo.waitForActivity(Activity1.class, WAIT_FOR_ACTIVITY_TIMEOUT)); 


    } 
} 

4.- Führen Sie Ihren Test aus. Rechtsklick auf Ihre Testklasse

+0

Können Sie bitte ein Beispiel geben, wie eine Methode zu testen, die ich in einer bestimmten Klasse geschrieben? –

+0

Abhängig von der Methode. In einem Szenario, in dem Sie eine Math-Klasse mit einer Divide-Methode haben, funktioniert dieser Code: SimpleMath mSimpleMath = new SimpleMath(); int Ergebnis = mSimpleMath.divide (4,2); assertTrue ("Ergebnis fehlgeschlagen!", Ergebnis == 2); Obwohl ich denke, ist besser mit JUnit für diese Art von Szenario –

+0

auf eine Sortiermethode, die einige Parameter und ein Objekt zurückgibt. Ich meine, wie beziehe ich mich von dem Test auf die angegebene Methode, die ich testen möchte –

2

Ich hatte auch das gleiche Problem wie zuvor ich das Modul für die Unit-Tests im Android gegeben wurde. Dies ist das einfache Beispiel, das Ihnen helfen könnte. Ich habe mein Bestes getan, um Ihnen zu helfen. Sie können einfach die EmailValidatorTest-Klasse ausführen, um die Testergebnisse zu sehen. Für assert (JUnit) können Sie Assert folgen. Dies ist XML.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#F0F0F0" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp" 
    android:text="@string/lbl_register" 
    android:textAllCaps="true" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="#176CEC" 
    android:textStyle="bold" /> 

<EditText 
    android:id="@+id/editText_email" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#fff" 
    android:ems="10" 
    android:hint="@string/lbl_email_hint" 
    android:inputType="textEmailAddress" 
    android:padding="12dp" /> 

<EditText 
    android:id="@+id/editText_password" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="1dp" 
    android:background="#fff" 
    android:ems="10" 
    android:hint="@string/lbl_password_hint" 
    android:inputType="textPassword" 
    android:padding="12dp" /> 

<Button 
    android:id="@+id/btn_signup" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="20dp" 
    android:background="#176CEC" 
    android:text="@string/lbl_btn_signup" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="#fff" 
    android:textStyle="bold" /> 

Das ist mein MainActivity

package com.example.hassidiczaddic.unittesting; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
import com.example.hassidiczaddic.unittesting.R; 
public class MainActivity extends Activity { 
private EditText emailEditText; 
private EditText passEditText; 
private Button btnsignup; 
private EmailValidator mEmailValidator; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    emailEditText = (EditText) findViewById(R.id.editText_email); 
    passEditText = (EditText) findViewById(R.id.editText_password); 
    // Setup field validators. 
    mEmailValidator = new EmailValidator(); 
    emailEditText.addTextChangedListener(mEmailValidator); 
    passEditText.addTextChangedListener(mEmailValidator); 


btnsignup=(Button)findViewById(R.id.btn_signup); 
    btnsignup.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      // Don't save if the fields do not validate. 
      if (!mEmailValidator.isValid()) { 
       emailEditText.setError("Invalid email or Password"); 
       Log.w("TAG", "Invalid email"); 
       return; 
      }else 
       Toast.makeText(MainActivity.this,"Satrun is dead",Toast.LENGTH_SHORT).show(); 
     } 
    }); 




} 

}

Das ist mein EmailValidator Klasse ist

package com.example.hassidiczaddic.unittesting; 
import android.app.Activity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class EmailValidator implements TextWatcher { 

/** 
* Email validation pattern. 
*/ 
// validating email id 
public static final Pattern EMAIL_PATTERN = Pattern.compile(
     "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + 
       "\\@" + 
       "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + 
       "(" + 
       "\\." + 
       "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + 
       ")+" 
); 

// validating password with retype password 
private boolean isValidPassword(String pass) { 
    if (pass != null && pass.length() > 6) { 
     return true; 
    } 
    return false; 
} 

private boolean mIsValid = false; 

public boolean isValid() { 
    return mIsValid; 
} 

public static boolean isValidEmail(CharSequence email) { 
    return email != null && EMAIL_PATTERN.matcher(email).matches(); 
} 

public static boolean isValidPassword(CharSequence pass) { 
    return pass != null && isValidPassword(pass); 
} 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

} 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 

} 

@Override 
public void afterTextChanged(Editable editableText) { 
mIsValid=isValidEmail(editableText); 
    mIsValid=isValidPassword(editableText); 
} 
} 

Das ist mein Unittesting In android:

package com.example.hassidiczaddic.unittesting; 
import android.test.suitebuilder.annotation.SmallTest; 
import org.junit.Test; 
import static org.junit.Assert.*; 
@SmallTest 
public class EmailValidatorTest { 
@Test 
public void emailValidator_CorrectEmailSimple_ReturnsTrue() { 
    assertTrue(EmailValidator.isValidEmail("[email protected]")); 
} 

@Test 
public void emailValidator_CorrectEmailSubDomain_ReturnsTrue() { 
    assertTrue(EmailValidator.isValidEmail("[email protected]")); 
} 

@Test 
public void emailValidator_InvalidEmailNoTld_ReturnsFalse() { 
    assertFalse(EmailValidator.isValidEmail("[email protected]")); 
} 

@Test 
public void emailValidator_InvalidEmailDoubleDot_ReturnsFalse() { 
    assertFalse(EmailValidator.isValidEmail("[email protected]")); 
} 

@Test 
public void emailValidator_InvalidEmailNoUsername_ReturnsFalse() { 
    assertFalse(EmailValidator.isValidEmail("@email.com")); 
} 

@Test 
public void emailValidator_EmptyString_ReturnsFalse() { 
    assertFalse(EmailValidator.isValidEmail("")); 
} 

@Test 
public void emailValidator_NullEmail_ReturnsFalse() { 
    assertFalse(EmailValidator.isValidEmail(null)); 
} 


@Test 
public void passwordValidator_NullPassword_ReturnsFalse(){ 
    assertFalse(EmailValidator.isValidPassword(null)); 

    //other testcases for passwords 
}} 

Vergessen Sie nicht, Ihre Gradle SYC mit:

// Required -- JUnit 4 framework 
testCompile 'junit:junit:4.12' 
+0

danke ich habe deine Antwort gewählt –

+1

Es war mir eine Freude, Ihnen zu helfen. Ich hatte ein ähnliches Problem wie Ihres und fand die Lösung nirgends. Ich werde jederzeit helfen, wenn ich mich mit den Themen auskenne. Wenn du glaubst, dass dir das geholfen hat zu verstehen, dann bitte die Antwort als richtig markieren. :) :) – Niroj

+0

Hallo vielen Dank für Ihre Bemühungen, aber ich habe bereits die Antwort angenommen, bevor Ihre Antwort, so kann ich nur Ihre Stimme abstimmen –