Herencia de testcases en Android -- android campo con parcelable campo con android-testing camp Relacionados El problema

Inheritance of TestCases on Android


0
vote

problema

Español

Me preguntaba si era una buena práctica para subclase los casos de prueba en Android. Quiero decir, necesito probar un montón de objetos public Cursor returnData_schedule() { return db.query(TABLE_SCHEDULE,new String[] {date,time,food},null,null,null,null,null); } 10 y podría crear una clase como b = Board.first b.board_threads.select_with_likes.order()... 1111111 para probar todos estos objetos.

También tengo un problema que lo implementa, tengo algo como esto:

  b = Board.first b.board_threads.select_with_likes.order()... 2  

y eso:

  b = Board.first b.board_threads.select_with_likes.order()... 3  

b = Board.first b.board_threads.select_with_likes.order()... 4 Implementa b = Board.first b.board_threads.select_with_likes.order()... 5 Por supuesto.

me devuelve este error:

junit.framework.assertionfailedError: Clase GenericParcelableTest no tiene un constructor público de testcase (nombre de cadena) o testcase ()

Quiero decir, sé que no creé ningún constructor vacío, pero ¿por qué necesitaría uno?

y en general, ¿hay algunos problemas conocidos con este enfoque? Si no, ¿por qué hay muy pocos artículos sobre este tema en Internet (y en realidad algunos dicen que no es una buena idea).

Original en ingles

I was wondering if it was good practice to subclass the test cases on Android. I mean, I need to test a lot of Parcelable objects and I could create a class like GenerericParcelableAndroidTestCase to test all these objects.

I also have a problem implementing it, I have something like this:

public class GenericParcelableTest extends AndroidTestCase {      private Parcelable p = null;      GenericParcelableTest(Parcelable p) {         this.p = p;     }      public void testDescribeContents() throws Exception {         assertEquals(0, p.describeContents());      } } 

And that:

public class AttachmentTest extends GenericParcelableTest {      public AttachmentTest() {         super(new Attachment());     } } 

Attachment implements Parcelable of course.

It returns me this error:

junit.framework.AssertionFailedError: Class GenericParcelableTest has no public constructor TestCase(String name) or TestCase()

I mean, I know that I created no empty constructor but why would I need one?

And generally, is there some known issues with this approach? If not why is there very few article on this topic on the internet (and actually some say even that it's not a good idea).

        

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Tengo esta conversación con bastante frecuencia al introducir nuevos miembros del equipo a las pruebas de la unidad. La forma en que lo explico es afirmando que sus pruebas son ciudadanos de primera clase de su base de código (sin juego de palabras), son susceptibles a la misma deuda técnica que cualquier otra parte de su base de código y tenga equivalente (tal vez más ?!) importancia como la del código de tiempo de ejecución.

Con esta mentalidad, las preguntas comienzan a responderse; Si tiene sentido de una perspectiva de OO para usar la herencia (es decir, su subclase es un nombre de inserción de la prueba SuperClass ) y luego subre. Sin embargo, como cualquier abuso de herencia, ten cuidado ... En el momento en que agrega un caso de prueba que no confía en ese comportamiento de SuperClass, puede tener un olor a código.

En este escenario, es probable (quizás el 90% del tiempo?) Es una separación del problema de preocupación dentro del código que se está colocando bajo prueba, es decir, la "unidad" bajo prueba no es realmente (una) unidad, pero tiene Comportamiento combinatorio. Refactorizar que el código para hacer una cosa sería una buena manera de permitir que su caso de prueba de super clase vive. Sin embargo, observe este estuche de prueba de super clase como un halcón ... En el momento en que se vea los booleanos que se agregan a las firmas para "permitir que ese caso de prueba similar, pero no el mismo" para que se ejecute debajo de su super clase no fluida, entonces tiene un problema, una Problema de deuda tecnológica que no es diferente a su código de tiempo de ejecución.

En la última verificación AndroidTestCase depende de un contexto extends LoginScenario4 por lo que es probable que se describe mejor como una prueba de integración que tiende a tener regularmente el comportamiento de la prueba de la supercasa de la placa de calderas. En este caso, intente reducir el enfoque de su SuperClase al caso de uso bajo prueba ... es. extends LoginUseCase O extends LoginScenario6 Para mejorar "cubo" aquellas subclases en la primera instancia. Esto ayudará a guiarlos sería extensores sobre si deberían estar usándolo para su escenario de no inicio de sesión. ¡Con suerte, se desarrollará la conversación y se evite la acumulación de deuda tecnológica!

Con respecto a su error, en Junit3, haga lo que recomienda @allen, si se muda a Junit4 con algo como Robolectric, explore el uso de reglas , así como @BeforeClass .

Nota personal

Solo he sentido la necesidad de escribir clases super de prueba para las pruebas de pseudo-unidades que se burlan de un punto final de API (similar a MockWebServer si está familiarizado con ese producto) y las pruebas de integración de DAO mediante la cual En la memoria DB se inicia y se desgarra sobre el ciclo de vida de cada prueba (ADVERTENCIA: pruebas lentas (pero útiles)!)

 

I have this conversation quite often when introducing new team members to unit testing. The way I explain it is by stating that your tests are first class citizens of your code base (no pun intended), they are susceptible to the same technical debt as any other part of your code base and have equivalent (maybe more?!) importance as that of the runtime code.

With this mindset, the questions begins to answer itself; if it makes sense from an OO perspective to use inheritance (i.e. your subclass is a insert name of test superclass) then subclass away. However, like any abuse of inheritance ever, be careful...the minute you add a test case that doesn't rely upon that superclass behaviour you may have a code smell.

In this scenario, it's likely (perhaps 90% of the time?) it is a separation of concern issue within the code being placed under test, i.e. the "unit" under test isn't actually (one) unit but has combinatorial behaviour. Refactoring that code to do one thing would be a good way of allowing your super-class test case to live on. However, watch this super class test case like a hawk...the minute you see booleans being added to signatures to "allow that similar but not the same" test case to run under your once unpolluted super class then you have a problem, a tech debt problem that is no different to your runtime code.

At last check AndroidTestCase depends on an Activity context so it's likely best described as an integration test which tend to regularly have boilerplate super-class test behaviour. In this case, try to narrow the focus of your superclass to the use case under test...i.e. extends LoginUseCase or extends LoginScenario to better "bucket" those subclasses in the first instance. This will help guide would be extenders as to whether they should be using it for their non-login scenario. Hopefully, conversation will ensue and tech debt accumulation be avoided!

Regarding your error, in JUnit3 do what @Allen recommends, if moving to JUnit4 with something like Robolectric then explore using Rules as well as @BeforeClass.

Personal note

I have only felt the need to write test super classes for pseudo-unit tests that mock an API end point (akin to MockWebServer if you are familiar with that product) and DAO integration tests whereby an in-memory db is started and torn down over the lifecycle of each test (warning - slow (but useful) tests!)

 
 
1
 
vote

junit.framework.assertionfailedError: Clase GenericParcelableTest no tiene un constructor público de testcase (nombre de cadena) o testcase ()

Obtiene este error porque Juit necesita poder construir una instancia de su clase de prueba. Solo sabe cómo hacerlo usando NO-ARG, o constructores de cadena única.

En lugar de realizar la inicialización en su constructor, debe ponerlo en el método de configuración (). Esto le permitirá usar el constructor predeterminado mientras sigue inicializando el objeto antes de que se llame el método de prueba.

 

junit.framework.AssertionFailedError: Class GenericParcelableTest has no public constructor TestCase(String name) or TestCase()

You get this error because JUnit needs to be able to construct an instance of your test class. It only knows how to do this using no-arg, or single string constructors.

Instead of performing initialization in your constructor, you should put it in the setUp() method. This will let you use the default constructor while still initializing the object before the test method is called.

 
 

Relacionados problema

4  ¿Cómo ejecutar pruebas de Uiautomator en múltiples dispositivos?  ( How to run uiautomator tests in to multiple devices ) 
Estoy tratando de realizar pruebas de UIAutomator Android UI en un archivo .bat. Pero no pude poder ejecutar paralelamente. Aquí está mi flujo de ejecución ...

45  ROBOLECTRICO: Recursos $ NotFoundException: ID de recurso de cadena con complemento de grado de Android 3  ( Robolectric resourcesnotfoundexception string resource id with android gradle ) 
Android Studio 3.0 Beta2 classpath 'com.android.tools.build:gradle:3.0.0-beta3' testCompile 'org.robolectric:robolectric:3.4.2' Clase de prueba que estoy...

4  ¿Cómo usar Mockito para probar las APIs a lo largo de Robospice y Rodear?  ( How to use mockito to test apis along robospice and retrofit ) 
He estado siguiendo esta Entrada del blog que muestra cómo simularse las solicitudes con Mockito y Rodear. El problema es que estoy usando tanto a lo largo ...

0  ¿Por qué Android Studio 1.2.1.1 solo soporta automáticamente un archivo de prueba?  ( Why android studio 1 2 1 1 automatically only support one test file ) 
Quería agregar dos archivos de prueba diferentes en mi proyecto. Uno para pruebas instrumentales y la otra para pruebas de junit. He agregado el archivo SRC...

2  Las pruebas de Android a través de la cuchara no son iguales cuenta de prueba  ( Android testing via spoon not equal test counts ) 
Estoy tratando de usar una cuchara para las pruebas instrumentales en paralelo en todos los dispositivos conectados en mi situación. Tengo 3 dispositivos cone...

1  Swipe hasta el elemento visible en el espresso de Android  ( Swipe until element visible in android espresso ) 
Tengo una pantalla vertical larga con forma de entrada de datos. Necesito SWIPEUP (desplácese hacia abajo) Esta pantalla hasta que se muestre uno de campo en ...

5  Androide. Robolectric. Resultados de prueba de prueba  ( Android robolectric testing accountmanager results ) 
En mi aplicación, uso el método con el Administrador de cuentas para obtener correos electrónicos del propietario. ¿Cómo puedo probar este método con ROBOLECT...

13  java.lang.securityException: Denegación de permisos: getIntentsender () cuando se usa Uiautomation en una prueba  ( Java lang securityexception permission denial getintentsender when using uia ) 
Cada vez que intento usar UiAutomation en cualquier prueba a través de ( approps_precio * moneda_valor BETWEEN 2000 AND 6000) 0 , el proceso se bloquea c...

25  Grados de grado: ¿Cómo mostrar los resultados de AndroidTest en la consola?  ( Gradle how to display androidtest results in the console ) 
Como se explica en otros hilos, se puede configurar para registrar los resultados de las pruebas en la consola: Gradle Android: Cómo mostrar los resultado...

3  OnstartCommand () no se llama cuando se inicia el servicio en mi caso de prueba  ( Onstartcommand isnt called when start service in my test case ) 
Tengo un proyecto de prueba, mi simple caso de prueba se extiende AndroidTestCase CLASE: public class MyTest extends AndroidTestCase{ private Context...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos