Testes envolvendo dispositivos externos

Qual a maneira mais apropriada de testar classes que utilizam equipamentos externos? Por exemplo, uma impressora fiscal.
Ex: Eu posso ter uma interface chamada ECF para abstrair as impressoras, e então usar injeção de dependencias para colocar implementações dessa interface (Ex: Classe ECFDaruma, ECFBematech, etc) nas classes que precisam lidar com ecf. Assim, posso facilmente testar tais classes no DUnit* sem precisar ter um ECF real, bastando usar um mock.

Contudo, alguma classe vai ter que implementar a comunicação real com o dispositivo, e eu gostaria de testa-la tambem. Como fazer?

  • Nesse projeto estou utilizando Delphi, mas como não conheço um forum de alto nível sobre Delphi resolvi perguntar aqui no de Java, pois acho que esse problema é independente de linguagem. Espero que não tenha nenhum problema

Cara, conhece o discasbcb?

Na graduação ele foi de grande ajuda quando programava em c++ e eles também tem uma área só pra delphi.
Da uma olhada no site:

http://dicasbcb.com.br/

E no forum:

http://www.dicasbcb.com/Forum/index.php

O site é horroroso, eu sei, mas fazer o que uhahuahuauhahua.

[quote=magnomp]Qual a maneira mais apropriada de testar classes que utilizam equipamentos externos? Por exemplo, uma impressora fiscal.
Ex: Eu posso ter uma interface chamada ECF para abstrair as impressoras, e então usar injeção de dependencias para colocar implementações dessa interface (Ex: Classe ECFDaruma, ECFBematech, etc) nas classes que precisam lidar com ecf. Assim, posso facilmente testar tais classes no DUnit* sem precisar ter um ECF real, bastando usar um mock.

Contudo, alguma classe vai ter que implementar a comunicação real com o dispositivo, e eu gostaria de testa-la tambem. Como fazer?

  • Nesse projeto estou utilizando Delphi, mas como não conheço um forum de alto nível sobre Delphi resolvi perguntar aqui no de Java, pois acho que esse problema é independente de linguagem. Espero que não tenha nenhum problema[/quote]

Sugiro que vc procure material sobre estratégias de teste de integração, em particular “backbone integration”.
Esta é indicada particularmente quando vc tem dependências de dispositivos sem os quais não se consegue testar
adequadamente. Em poucas palavras, trata-se de criar uma camada de teste em cima das classes que acionam
cada dispositivo físico: o foco são as operações disponibilizadas pelo equipamento. O teste usa o equipamento real,
ou um emulador fornecido pelo fabricante.

Para testes mais funcionais, ou seja, que exercitam lógica de controle, utilize dublês de teste (mocks, stubs e outros).
Durante o desenvolvimento, estes permitem agilizar os testes. Fiquei curioso, no entanto, quando você falou
"facilmente testar". Testar direito usando estas técnicas tem seus desafios, e não vejo como algo trivial,
principalmente em linguagens imperativas como Delphi ou Java.

Lembrando que, quando se usam dispositivos proprietários, é necessário investir também em teste de sistema:
ou seja, teste funcional do aplicativo, sem dublês, assim que for viável. Mas usar a estratégia de backbone ajuda a
diminuir a carga de adrenalina dos testes de sistemas.

Referências:
http://www.slideshare.net/bfluri/seminar-on-software-testing (veja as seções sobre isolamento e integração)
http://xunitpatterns.com/ (dublês de teste)

Espero ter ajudado,

Jorge Diz

Quando disse isso, estava me referindo a testar classes que dependem das interfaces que fazem a abstração dos dispositivos em questão. Isso eu já faço, e sinceramente não é nem um pouco dificil.
Eu não estava me referindo aos testes das classes concretas que implementam a comunicação com os equipamentos externos, me desculpe caso eu tenha me expressado mal.

Obrigado pelas informações, vou pesquisar a respeito.

Ao Tchello, obrigado pela indicação do site