Tag Archive for 'olive'

PHP UnitTesting com SimpleTest

Estou a usar o SimpleTest há já mais de um ano, mas nunca tinha verdadeiramente puxado por ele. Agora, que estou a juntar as peças da minha framework, preciso de actualizar os testes por forma a levar o projecto 100% até o próximo nível: test now, code later.

Neste momento, as classes que constituem o core e a base dos controladores (o C do MVC), estão 100% testadas. Claro que nem todos os testes passam ainda, but that’s not the point here…


$test->addTestCase(new test_OE_Base());
$test->addTestCase(new test_OliveConfig());
$test->addTestCase(new test_OliveMessage());
$test->addTestCase(new test_OliveStorageDefault());
$test->addTestCase(new test_OliveLocatorDefault());
$test->addTestCase(new test_OliveLoaderDefault());
$test->addTestCase(new test_OliveExecutorDefault());
$test->addTestCase(new test_OliveConfiguratorDefault());
$test->addTestCase(new test_OliveConfigurableBase());
$test->addTestCase(new test_OliveComponentBase());
$test->addTestCase(new test_OliveExecutableBase());
$test->addTestCase(new test_OliveModuleBase());
$test->addTestCase(new test_OliveControlBase());
$test->addTestCase(new test_OliveFrameworkBuilderBase());
$test->addTestCase(new test_OliveApplicationFactoryBase());

São já 447 testes e ainda falta testar/escrever todas as componentes de Output (V) e Model (M)… Ah! Recordo-me agora que quando eu era substancialmente mais novo as noitadas de sábado eram substancialmente mais divertidas.

Olive Framework tests with SimpleTest

Acerca do SimpleTest

Quando avaliei as frameworks de teste para PHP escolhi o SimpleTest por implementar todas as features (e mais um par de botas) e, ao mesmo tempo, permitir escrever testes com um código, de facto, muito simples.

Entre outras funcionalidades, o SimpleTest permite gerar Mocks em run-time e configurá-los para agir como actores (retornar valores consoante os argumentos) e críticos (testar chamadas e argumentos). Eis um exemplo:


  /**
   * should call given strategies and return as soon as some strategy returns data
   */
  public function test_load_specific_strategy()
  {
    // create
    $configurator = OliveConfiguratorDefault::instance();

    // create mock strategy
    $strategy1 = new MockOliveConfigStrategy();
    $strategy1->expectNever('load');

    // create mock strategy
    $strategy2 = new MockOliveConfigStrategy();
    $strategy2->expectOnce('load', array($this->_path, $this->_name));
    $strategy2->setReturnValue('load', $this->_data);

    // create mock strategy
    $strategy3 = new MockOliveConfigStrategy();
    $strategy3->expectNever('load');    

    // pass mocks
    $configurator->add_strategy($this->_strategy[0], $strategy1);
    $configurator->add_strategy($this->_strategy[1], $strategy2);
    $configurator->add_strategy($this->_strategy[2], $strategy3);       

    // load with specific strategy
    $data = $configurator->load($this->_path, $this->_name, $this->_strategy[1]);

    // assert data
    $this->assertIdentical($data, $this->_data);
  } 

Ainda mais á frente, permite também fazer Web Testing, scraping, navegação, submissão de forms e autenticações. Digo mais à frente porque, apesar do mecanismo ser claro como a água, ainda não consigo pensar em estratégias eficazes para implementar testes desta natureza. Mas lá chegarei.

Mas o SimpleTest tem outras características de ganhador: está relativamente bem documentado, principalmente com exemplos que te possibilitam estar up and running em menos 10 minutos; tem uma comunidade bastante activa (mailing list); a versão que está cá fora é 1.0.1, ou seja, para lá do Beta; o desenvolvimento está bastante activo e os planos são claros no que toca a levar o SimpleTest ao colo até ao php6.

A versão que eu estou a usar é um pouco antiga e foi hacked para permitir testar se durante a execução dos testes houve ou não output para o browser. Por isso ainda não o actualizei para a última versão e ainda não experimentei o plugin para o Eclipse que promete um nível de integração porreiro com o PDT e o XDebug.

Introduzindo Olive, mais uma Framework MVC para PHP

Acabei de publicar o primeiro exemplo de uma aplicação implementada sobre a minha framework MVC, o Olive.

Porquê escrever uma framework? Porquê chamar-lhe Olive? Essas respostas já estão na (parca) documentação que coloquei no wiki. Mas posso adiantar que Olive é algo muito português, que reporta às origens beirãs da minha família (também válido para outros portugueses, desde algarvios a transmontanos). E também que é divertido ter componentes da aplicação que se chamam OliveTree ou OliveField.

olivedemoapplication.jpg

A framework está em rápido desenvolvimento e conto ter uma versão 1 totalmente documentada até ao final de 2008. Quem se interessar pelo assunto pode entrar em contacto comigo, porque a Olive precisa de alguma ajuda.

Posso-vos dizer que é um projecto interessante, por esta e aquela razão, mas sou suspeito. Vejam por vocês mesmos.

Para já apenas as layers de Controlo e Output estão verdadeiramente funcionais e os exemplos publicados são parcos, mas já mostram algumas das características interessantes do projecto, tais como flexibilidade (output por smarty ou old schoool, configuração por xml, yaml ou db, ajax por html, json ou xml), modularidade (controls, modules, components, widgets), performance (uma obsessão) e sintaxe produtiva (pelo menos divertida).

Quanto à camada dos dados, o M do MVC, está a sofrer um refactor verdadeiramente intestinal: no original a class central (OliveConnection) foi desenvolvida como Singleton para facilitar o acesso aos métodos de carregamento das definições de tabelas, views, procedures, etc… tipo:

$res = OliveConnection::table('blog')->row($id);

Burrice, porque isso não permitia fazer várias ligações, ligações a bases de dados diferentes por exemplo. Enfim… agora o acesso passará a ser feito através de um método estático na class da aplicação, que retorna uma conexão por pedido (ou a conexão primária por defeito)

// conexão primária (primeira a ser criada)
$res = OliveApp::connection()->table('blog')->row($id);
// chamar conexão por nome
$res = OliveApp::connection('remote')->table('blog')->result();

ou

// criar query SELECT sobre tabela/view "blog"
$res = OliveApp::connection()->select('blog')
  // escolher campos
  ->fields('data', 'titulo', 'texto', 'autor.nome AS autor_nome')
  // filtrar
  ->where_equals('categoria_id', $cat_id)
  // ordenar
  ->orderby('data DESC')
  // limitar
  ->limit(10);

Também planeio implementar no próximo sprint artefactos como “embrulhar” os resultados das querys numa class que implemente a interface Iterator (PHP5) para permitir

// cool
foreach($res as $row) { ... }

// em vez de old school
while($row = $db->fetch_row($res)) { ... }

Mas antes disso, actualizar a documentação.

Melhor Wiki (para projectos de desenvolvimento e não só)

os Wikis são para colaborar! Brevemente irei começar a publicar documentação e código da minha framework e dos seus projectos associados. Para esse efeito tenho estado a experimentar alguns sistemas para suportar o site que quero colocar online. Wikis, principalmente.

Para quem quiser escolher um wiki php, com ou sem base-de-dados, este artigo pode ser interessante.

Click para continuar a ler “Melhor Wiki (para projectos de desenvolvimento e não só)”







Close
E-mail It
1