Publicado por: hugolt | fevereiro 12, 2009

Introdução ao zope.testbrowser

Atualmente tenho usado o zope.testbrowser pra criar testes funcionais no
Grok e é uma ótima ferramenta, com uma API muito bem escrita e os
doctests são muito bem feitos.
O objetivo desse tutorial é apenas dar uma introdução a esta
ferramenta e mostrar como pode ser usada no dia-a-dia pra testes
funcionais, de sistema ou só abrir páginas como um web browser mesmo.

O zope.testbrowser provê uma classe chamada Browser, que é realmente
como um web browser, porém, assim como os browsers em linha de comando,
não tem suporte à JavaScript.

Vamos começar iniciando nosso browser

>>> from zope.testbrowser.browser import Browser
>>> browser = Browser()

Para acessar uma página usa-se o método `open` e passa pra ele a URL
desejada.
(É possível passar pra Browser a URL a ser acessada, assim,
evita-se que tenha-se que usar o método `open` em seguida)

>>> browser.open(‘http://www.python.org’)
>>> browser.url
http://www.python.org’
>>> ‘Python Programming Language’ in browser.contents
True
>>> browser.contents
‘…<a href=”/about/website”>Website maintained by the Python community</a>…Python Software Foundation…’

Para acessar links usa-se o método `getLink`.
`getLink` possui três parâmetros:
text – permite que seja passada uma expressão regular para
procurar o link
url  – link direto pra ser pego, ou seja, o valor do
atributo href
id   – id do link (atributo id da tag a) a ser aberto

# text pode ser omitido, pois é o primeiro argumento
>>> about = browser.getLink(text=’About’)
>>> about2= browser.getLink(url=’/about/’)
>>> about.url == about2.url
True
>>> about2.text
‘About’
>>> about.text == about2.text
True
>>> about.click()
>>> browser.title
‘About’
>>> browser.url
http://www.python.org/about/&#8217;
>>> ‘Python is powerful… and fast’ in browser.contents
True
>>> ‘Python plays well with others’ in browser.contents
True

Vamos voltar pra pagina anterior, só pra ver mais o que poderemos fazer

>>> browser.goBack()
>>> browser.url
http://www.python.org&#8217;

O método `goBack` possui um único argumento, count, que por padrão é 1,
esse valor indica quantas vezes o browser deve voltar.

Vamos agora ao site do Plone pra aprender um pouco sobre `Controls` do
zope.testbrowser
>>> plone = Browser(‘http://www.plone.org&#8217;)
>>> plone.url
http://plone.org/&#8217;

Na classe `Browser` existe o método `getControls`, que acessa todos os
campos de um formulário e ele possui três parâmetros:
label – busca por um label como nome que você passar
name  – busca por uma tag que tenha um atributo name
com o valor que você passar, e caso não haja name,
pega pelo atributo `id`
index – é um critério pra desambiguação, pois caso
haja tags com o mesmo valor pra name, usa-se o valor de index pra pegar
a ocorrência desejada

No site do Plone tem uma área em que é possível fazer buscas por
produtos. Vamos usa-la como exemplo
>>> busca = plone.getControl(name=’SearchableText’)
>>> busca.value = ‘Content Rating’
>>> botao_de_busca = plone.getControl(‘Search’)
>>> botao_de_busca.click()
>>> plone.url
http://plone.org/search?SearchableText=Content+Rating&#8217;
>>> ‘plone.contentratings’ in plone.contents
True
>>> plone.contents
‘…Plone support for the contentratings package…’

Caso queira pegar o formulário inteiro, ao invés dos itens dele, há o
método `getForm`, e no objeto de formulário você pode pegar os
controles, da mesma maneira, a única diferença é que com o formulário,
você tem a facilidade de submeter direto, sem precisar saber quem é o
responsável por isso.
Os parâmetros de `getForm` são:
id     – valor do atributo id da tag form
name   – valor do atributo name da tag form
action – valor do atributo action da tag form
index  – critério de desambuiguação, pois pode have mais de um
caso de mesmo valor pra name, id ou action

>>> plone.open(‘http://www.plone.org&#8217;)
>>> form = plone.getForm(name=’searchform’)
>>> form_by_action = plone.getForm(action=’http://plone.org/search&#8217;)
>>> form.name == form_by_action.name
True
>>> form.action == form_by_action.action
True
>>> form.getControl(name=’SearchableText’).value = ‘plone4artists’
>>> form.submit()
>>> plone.url
http://plone.org/search?SearchableText=plone4artists&#8217;

Caso queira trocar ou adicionar/remover algum cabeçalho, é bem simples,
e abaixo é mostrado como trocar o cabeçalho de idioma

>>> google_en = Browser(‘http://www.google.com/ncr&#8217;)
>>> google_en.url
http://www.google.com/&#8217;
>>> ‘Advanced Search’ in google_en.contents
True
>>> ‘Pesquisa avan\xe7ada’ in google_en.contents
False
>>> ‘Google Search’ in google_en.contents
True

>>> google_ptbr = Browser()
>>> google_ptbr.addHeader(‘Accept-Language’, ‘pt-BR’)
>>> google_ptbr.open(‘http://www.google.com&#8217;)
>>> google_ptbr.url
http://www.google.com.br/&#8217;
>>> ‘Pesquisa avan\xe7ada’ in google_ptbr.contents
True
>>> ‘Advanced Search’ in google_ptbr.contents
False
>>> ‘Pesquisa Google’ in google_ptbr.contents
True

A melhor maneira de aprender sobre o zope.testbrowser é olhando os
testes dele:
http://svn.zope.org/zope.testbrowser/trunk/src/zope/testbrowser/README.txt?rev=95681&view=markup

zope.testbrowser é uma excelente ferramenta pra fazer testes, e possui
um módulo chamado testing pra auxiliar nos testes funcionais do zope3,
grok e etc.
Há uma diferença mínima nos imports pra usar o módulo de
testes. Ao invés de importar de zope.testbrowser.browser, você deve
importar de zope.testbrowser.testing.
zope.testbrowser.testing.Browser herda de zope.testbrowser.browser.Browser,
e a única diferença entre as duas classes está no mech_browser,
sendo que no Browser de testing você não pode passar o mech_browser, pois
ele sempre vai usar o PublisherMechanizeBrowser.
A única utilidade do zope.testbrowser.testing.Browser é fazer testes funcionais
com o zope, pois essa classe faz requisições ao Zope Publisher. Não há conexão http real.

Para executar esse documento com o doctest,
esse trecho de código é suficiente:
>>> import doctest
>>> doctest.testfile(NOME_DO_SEU_ARQUIVO, optionflags=doctest.ELLIPSIS)

Referências:
http://svn.zope.org/zope.testbrowser/trunk/src/zope/testbrowser/testing.py?rev=94307&view=markup
http://svn.zope.org/zope.testbrowser/trunk/src/zope/testbrowser/browser.py?rev=94307&view=markup
http://svn.zope.org/zope.testbrowser/trunk/src/zope/testbrowser/README.txt?rev=95681&view=markup


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Categorias

%d blogueiros gostam disto: