• Nenhum resultado encontrado

QTestLib framework: Criando unit tests inteligentes para projetos baseados em Qt. Bruno Abinader 22 de Julho de 2010

N/A
N/A
Protected

Academic year: 2021

Share "QTestLib framework: Criando unit tests inteligentes para projetos baseados em Qt. Bruno Abinader 22 de Julho de 2010"

Copied!
16
0
0

Texto

(1)

QTestLib framework:

Criando unit tests inteligentes

para projetos baseados em Qt

Bruno Abinader

(2)

CONTEÚDO (1/2)

Introdução

- Quem somos?

- O que é o Qt?

- O que são unit tests?

Ferramentas de testes do Qt

- Framework QTestLib

- QTest namespace

(3)

CONTEÚDO (2/2)

Escrevendo unit tests

- Criando uma classe de teste

- Comparando valores

- Utilizando diferentes valores de entrada

- Simulação de eventos

Tópicos avançados

- Eventos em widgets baseados no QGraphicsView

- Acessando membros privados

(4)

INTRODUÇÃO

Quem somos?

Manaus

Brasília

São Paulo

Recife

(5)

INTRODUÇÃO

O que é o Qt?

(6)

INTRODUÇÃO

O que são unit tests?

Características:

• Teste de blocos individuais e independentes de código

• Validação do comportamento esperado

• Mensura a qualidade do código gerado

• Testes podem ser automatizados

Benefícios:

• Simplifica a integração de código

• Evita bugs de regressão

(7)

FERRAMENTAS DE TESTES DO QT

Framework QTestLib

Características:

• Leve: ~6000 LOC e ~60 símbolos exportados

• Auto-contido: QT = core testlib

• Testes são binários independentes

• Suporte a Data Driven Testing

• Separação entre lógica e dados

• Simulação de eventos de teclado e mouse

• Introspecção de sinais/slots

(8)

FERRAMENTAS DE TESTES DO QT

QTest namespace

Conteúdo:

• Métodos públicos: Benchmarking, Data Driven Testing,

Simulação de Eventos, Sleep/Wait do Loop de Eventos,

Facilitadores de Output

• Macros: QBENCHMARK, QCOMPARE, QTEST, QVERIFY e outros

• Tipos: KeyAction, MouseAction, TestFailMode e outros

(9)

FERRAMENTAS DE TESTES DO QT

Benchmarks

Macros: QBENCHMARK / QBENCHMARK_ONCE

Backends:

• Walltime (padrão – repete o código várias vezes)

• Tick Counter (menos repetições, problemas com frequency

scaling)

• Valgrind/Callgrind (resultados exatos, não leva em conta I/O)

• Event Counter (provê o número de eventos gerados)

(10)

ESCREVENDO UNIT TESTS

Criando uma classe de teste

O que é necessário:

• Herdar de QObject

• Implementar cada teste em separado como private slots

• 4 slots especiais tratados como não-teste:

initTestCase()

cleanupTestCase()

init()

(11)

ESCREVENDO UNIT TESTS

Comparando valores

Exemplo:

class MinhaClasse: public QObject {

Q_OBJECT private slots:

void initTestCase()

{ qDebug("chamado antes de começar a executar os testes"); } void primeiroTeste()

{ QVERIFY(1 == 1); } void segundoTest()

{ Qstring valor(“teste”); QCOMPARE(QString(“teste”), valor); } void cleanupTestCase()

{ qDebug("chamado depois da execução de todos os testes"); } };

(12)

ESCREVENDO UNIT TESTS

Utilizando diferentes valores de entrada

Exemplo:

class MinhaClasse: public QObject {

Q_OBJECT private slots:

void meuTeste_data()

{ QTest::addColumn<QString>(“texto”);

QTest::newRow(“texto igual”) << “fulano”;

Qtest::newRow(“texto diferente”) << “sicrano”; } void meuTeste()

{ QFETCH(QString, texto);

QCOMPARE(texto, “fulano”); }

(13)

ESCREVENDO UNIT TESTS

Simulação de eventos

Exemplo:

class MinhaClasse: public QObject {

Q_OBJECT private slots:

void testeEventoTeclado() { QlineEdit campoTexto;

QtTest::keyClicks(&campoTexto, “olá FISL”); QCOMPARE(campoTexto.text(), “olá FISL”); } void testeEventoMouse()

{ QpushButton botao;

QsignalSpy espiaoCliqueBotao(&botao, SIGNAL(clicked())); QtTest::MouseClick(&botao, Qt::LeftButton);

QVERIFY(espiaoCliqueBotao.count() == 1); } };

(14)

TÓPICOS AVANÇADOS

Eventos em itens do QGraphicsWidget

Exemplo:

class MinhaClasse: public QObject { Q_OBJECT private slots: void testeQGV() { QgraphicsWidget widget; scene.addItem(&widget); ... QtTest::mouseClick(view.viewport(), Qt::LeftButtom, 0, widget.geometry().center().mapToScene()}; } };

(15)

TÓPICOS AVANÇADOS

Acessando membros privados

Método 1: Friend class

class myWidget : public Qwidget

friend class myWidgetTest;

Método 2: Include hack

#define private public

#define protected public

#include “mywidget.h”

#undef protected

#undef private

(16)

Obrigado!

Perguntas?

Contato:

bruno.abinader@openbossa.org (abinader @ irc.freenode.org)

Próximas palestras:

“Plasma Animations Overview” (23/07 – 13:00)

“Desenvolvendo aplicações para dispositivos Nokia usando Linux” (23/7 - 13:00)

“Gallium3D: Understand the Linux Graphical Infrastructure” (24/07 - 17:00)

Referências

Documentos relacionados

A hipótese do presente estudo é que as pacientes diabéticas teriam maior prevalência de alterações urodi- nâmicas do que as não diabéticas, e que o mecanismo de DTUI

A Secretaria de Administração do Município de Condeúba, Estado da Bahia, no uso de suas atribuições e devidamente autorizado pelo Excelentíssimo Senhor Prefeito Municipal, convoca

Os resultados mostraram que (i) a eficiência dos fosfatos estudados foi maior nos Latosslos Distróficos do que no Neossolo Quartzarênico Distrófico; (ii) os fosfatos de Arad e

A finalidade do “Documento de Arquitetura de Software - DAS” é definir um modelo arquitetural para ser aplicado ao desenvolvimento dos jogos do Desafio SEBRAE, bem como

• A Revolução Industrial corresponde ao processo de industrialização que teve início na segunda metade do.. século XVIII no

A prática delas também é norteada pelos saberes adquiridos com a experiência, esta é produzida por elas no seu cotidiano docente, num processo permanente de reflexão

O processo de modelagem de distribuição geográfica de espécies biológicas pode ser resumido nas seguintes etapas: (1) um conjunto de pontos de ocorrência

A UNIMED GRANDE FLORIANÓPOLIS – UGF – COOPERATIVA DE TRABALHO MÉDICO, por meio do Instituto Agos, mantido pela Fundação Educacional Lucas Machado – Feluma, torna