Test-Driven Development no Rails: Unit Tests

Tamanho: px
Começar a partir da página:

Download "Test-Driven Development no Rails: Unit Tests"

Transcrição

1 Test-Driven Development no Rails: Unit Tests 11/05/07 Tags:, Ruby, Ruby on Rails, TDD, Teste Unitário, Unit Tests Todo mundo fala que Test-Driven Development aumenta sua produtividade, reduz a quantidade de erros do seu código e deixa todo mundo mais feliz. O quem ninguém fala é como fazer isso, quando você não conhece nada de testes. Por isso, resolvi escrever este texto, mostrando o pouco que apri nas últimas semanas sobre esse tema. Test-Driven Development (TDD) Desenvolvimento Orientado a Testes ou Desenvolvimento Guiado por Testes é uma técnica de desenvolvimento de software onde primeiro são criados os testes e somente depois é escrito o código necessário para passar por eles. Dessa maneira, você escreverá códigos melhores e, o que é mais importante, muito mais rapidamente. Veja como é o ciclo de TDD, segundo o livro Test-Driven Development by Example, de Kent Back (ISBN ): 1. Crie um teste: Cada nova funcionalidade deve começar com um teste escrito. Este teste deve falhar antes da funcionalidade ser implementada. Você deve conhecer claramente os requisitos e especificações da funcionalidade. 2. Execute todos os testes: Você saberá que a rotina de testes está funcionando corretamente e que o novo teste não passou sem que o teste da funcionalidade tenha sido implementado. 3. Escreva o código: Escreva o código que irá passar naquele teste que você criou na etapa anterior, sem se preocupar em torná-lo elegante/otimizado. É muito importante que o código implementado reflita somente o teste escrito. 4. Execute novamente todos os teste: Se todos os testes passarem, você terá certeza que o código ate todos os requisitos testados e que esta nova funcionalidade não afetou outras partes do sistema. 5. Refatore o código: Agora você pode "limpar" o código, se for necessário. Lembre-se de executar os testes constantemente durante esta etapa, pois só assim você saberá se o sistema não foi modificado de maneira incorreta, gerando erros. Os testes, quando devidamente implementados, oferecem uma certa "garantia" de que a aplicação está funcionando da maneira como deveria. TDD no Rails Este texto não tem a pretensão de ser o "guia definitivo" de TDD; ao invés disso, você verá uma abordagem simples e direta do assunto, utilizando Ruby on Rails. Não irei explicar detalhadamente como desenvolver em Rails; para isso você tem outras fontes um tanto quanto completas. O que é um teste? Teste é um método que contém asserções segundo o dicionário Houaiss, asserção significa "afirmação categórica" e que representam um cenário de testes em particular. Um teste só passará caso todas as asserções sejam verdadeiras.

2 No Ruby, um teste é um método iniciado por "test"; assim, você pode nomear seu método como "test_", "testing_", "testando_", e por aí vai! O Rails trabalha com alguns tipos diferentes de testes. Existem os testes unitários que são responsáveis pelos testes de modelos; existem os testes funcionais, responsáveis por testar os controllers; e, por último, temos os testes de integração, responsáveis por testar múltiplas camadas de seu aplicativo e a integração entre elas. O teste unitário será, provavelmente, o primeiro lugar onde você irá trabalhar em qualquer projeto. Isso acontece porque não é preciso escrever muito código vou além e digo que não é preciso escrever nenhum código para se criar tais testes, a não ser o próprio teste. Quando estamos fazo TDD, é importante que todos os seus testes iniciais não passem na validação, pois você precisa identificar os itens a serem validados para depois corrigi-los. Você deve também criar pelo menos um teste que passe na validação. Nosso exemplo Nós vamos criar um sistema de blog muito mais poderoso que o Wordpress :P totalmente feito em Rails. Então, a primeira coisa que temos que fazer é pensar nos requisitos de nosso projeto. Isso é importante, pois permite ter uma visão melhor do que precisa ser feito. Obviamente, podemos ajustar tais requisitos ao longo do tempo. A princípio, nosso blog deve: permitir configurações sobre o autor (nome, , etc) criar posts com resumo permitir que usuários postem comentários, informando , nome e website Completo, não? :) Para começar, vamos criar nossa aplicação. Digite o comando rails blog. Nosso projeto será criado e a lista dos arquivos será exibida. Iremos, então, criar nosso banco de dados MySQL, neste exemplo tanto de desenvolvimento quanto de testes. Se você não se sente confortável com a linha de comandos, faça da maneira como está acostumado. ~$ mysqladmin -u root create blog_development ~$ mysqladmin -u root create blog_test Abra o arquivo "config/database.yml" e insira o usuário e senha que terão acesso aos bancos de dados. Meu arquivo se parece com isso: development: adapter: mysql database: blog_development username: root password: socket: /var/run/mysqld/mysqld.sock test: adapter: mysql

3 database: blog_test username: root password: socket: /var/run/mysqld/mysqld.sock production: adapter: mysql database: blog_production username: root password: socket: /var/run/mysqld/mysqld.sock É muito importante que você defina 2 bancos diferentes para desenvolvimento e testes, uma vez que o banco de dados "testes" é apagado quando estamos testando nossa aplicação. Quando nosso desenvolvimento é orientado a testes, você inicialmente só cria os modelos e, logo depois, parte para os testes. Controllers? Não, agora. Você só irá criálos muito mais à frente. Vamos trabalhar inicialmente no modelo "usuário". ~/blog$ script/generate model User exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/user.rb create test/unit/user_test.rb create test/fixtures/users.yml create db/migrate create db/migrate/001_create_users.rb O Rails nos permite trabalhar com DDLs muito facilmente através das migrations. Então, neste texto não iremos lidar com SQL diretamente, mas Ruby. Abra o arquivo "db/migrate/001_create_users.rb". Nossa tabela de usuários terá os campos "name", " " e "password". Sua migração deverá ser algo como: class CreateUsers < ActiveRecord::Migration def self.up create_table :users do t t.column :name, :string, :nil => false t.column : , :string, :nil => false t.column :password, :string, :nil => false def self.down drop_table :users Execute o comando rake db:migrate para criar a tabela "users". ~/blog$ rake db:migrate (in /home/nando/blog) == CreateUsers: migrating ===================================================== -- create_table(:users)

4 -> s == CreateUsers: migrated (0.0037s) ============================================ Com a tabela criada, podemos meter a mão na massa! Abra o arquivo "test/unit/user_test.rb", que foi gerado automaticamente quando criamos nosso modelo. Uma das vantagens de se desenvolver em Rails é justamente esta; é tão simples de se criar testes para uma aplicação, com arquivos criados automaticamente, que você deve se sentir envergonhado de não fazê-lo. Este arquivo possui uma única asserção chamada test_truth. Apesar de parecer inútil, ela ajuda a corrigir algumas configurações do ambiente, como quando o banco de dados de teste não existe, por exemplo. require File.dirname( FILE ) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users # Replace this with your real tests. def test_truth assert true Para rodarmos nossos testes unitários, devemos executar o comando rake test:units. O Ruby irá executar os testes unitários e receberemos uma resposta como esta: Started. Finished in seconds. 1 tests, 1 assertions, 0 failures, 0 errors Esta resposta é bastante direta e fácil de enter. Cada ponto exibido na tela (logo abaixo da linha "Started") representa um teste que passou. Temos também uma linha que nos diz que foi executado 1 teste, com 1 asserção, mas que não retornou erro ou falha. O teste que vem por padrão não faz muita coisa, então vamos criar o nosso! Nosso primeiro modelo a ser testado é o User. Alguns testes possíveis são: nome, e senha são obrigatórios a senha deve ter no mínimo 6 caracteres o é único Podemos escrever um teste genérico para ver se o usuário é criado quando não passamos nenhuma informação. def test_should_be_invalid user = User.create assert!user.valid?, "User shouldn't be created"

5 Primeiro, nós criamos um usuário (User.create) sem passar nenhuma informação. Se nosso modelo tivesse uma validação utilizando os métodos disponíveis do ActiveRecord, o método user.valid? retornaria false e nossa aplicação passaria nos testes. Rodando os testes temos uma surpresa: ~/blog$ rake test:units Started F Finished in seconds. 1) Failure: test_should_be_invalid(usertest) [./test/unit/user_test.rb:8]: User shouldn't be created. 1 tests, 1 assertions, 1 failures, 0 errors rake aborted! Alguma coisa não está funcionando direito! Nosso teste deveria receber false do método valid?, o que não aconteceu. Não se preocupe em fazer o teste passar. Lembrese que antes devemos criar os outros testes. Vamos, então, criar cada um dos testes em separado. Não sei se você notou, mas ficou complicado enter a condição assert!user.valid? no teste que criamos. Para estes casos, podemos utilizar helpers, semelhantes ao que utilizamos nas views, mas que aqui são específicos para os testes. Abra o arquivo "tests/test_helper.rb" e adicione os métodos abaixo: def deny(condition, message='') assert!condition, message def assert_invalid(record, message='') deny record.valid?, message O método deny faz a negativa de assert e o método assert_invalid apenas dá uma força, evitando que tenhamos que explicitar o.valid? toda vez. Não se preocupe em verificar se o método valid? existe ou não; nos testes, assumimos um ambiente e ele deve ser verdadeiro e, caso não seja, investigamos as causas do erro que foi apontado para então corrigí-lo. Troque o método test_should_be_invalid que criamos anteriormente por este que utiliza nossos helpers. def test_should_be_invalid user = User.create assert_invalid user, "User shouldn't be created" Muito melhor, certo? E assim, você vive sem a culpa de ir contra o princípio DRY

6 Agora, temos que adicionar outros testes. Antes disso, já prevo mais um pouco de repetição, vamos criar um método chamado create para nos ajudar. É assim que sua classe de testes deve estar neste momento. require File.dirname( FILE ) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users def test_should_be_invalid user = create(:name => nil, : => nil, :password => nil) assert_invalid user, "User shouldn't be created" private def create(options={}) User.create({ :name => "Homer Simpson", : => "homer@simpsons.com", :password => "test" }.merge(options)) O método create será responsável por definir os valores padrão para os campos. Assim, não teremos que digitá-los toda vez que quisermos adicionar um teste. Os outros testes que iremos criar irão verificar as condições impostas lá em cima. Vamos começar pelo teste que verifica se o nome foi informado. def test_should_require_name user = create(:name => nil) assert user.errors.invalid?(:name), ":name should be required" assert_invalid user, "User shouldn't be created" Não mudou muita coisa do primeiro teste que fizemos. Apenas adicionamos mais uma asserção que verifica se o campo "name" é inválido. No ActiveRecord, temos os métodos validates_* que necessitam do nome do campo; toda vez que uma validação não passa, um erro é adicionado ao campo. Além de verificar se nosso campo possui um erro, poderíamos verificar se uma mensagem também foi definida. A seguinte asserção faz justamente isso. assert_not_nil user.errors.on(:name), ":name should have had a error message" E os outros testes: require File.dirname( FILE ) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users def test_should_be_invalid user = create(:name => nil, : => nil, :password => nil) assert_invalid user, "User shouldn't be created"

7 def test_should_require_name user = create(:name => nil) assert user.errors.invalid?(:name), ":name should be required" assert_invalid user, "User shouldn't be created" def test_should_require_ user = create(: => nil) assert user.errors.invalid?(: ), ": should be required" assert_invalid user, "User shouldn't be created" def test_should_deny_bad_ user = create(: => 'bad@format') assert user.errors.invalid?(: ), ": should be in a valid format" assert_invalid user, "User shouldn't be created" def test_should_require_password user = create(:password => nil) assert user.errors.invalid?(:password), ":password should be required" assert_invalid user, "User shouldn't be created" def test_should_require_longer_password user = create(:password => 't') assert user.errors.invalid?(:password), ":password should be 4 characters or longer" assert_invalid user, "User shouldn't be created" def test_should_deny_duplicate_user user = create assert_valid user user = create assert_invalid user, "User shouldn't be created" private def create(options={}) User.create({ :name => "Homer Simpson", : => "homer@simpsons.com", :password => "test" }.merge(options)) Execute os testes e veja que uma longa lista de erros irá aparecer. ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started F.FFFFFF Finished in seconds.

8 1) Failure: test_should_be_invalid(usertest) [./test/unit/../test_helper.rb:29:in `deny'./test/unit/../test_helper.rb:33:in `assert_invalid'./test/unit/user_test.rb:8:in `test_should_be_invalid']: User shouldn't be created. 2) Failure: test_should_deny_bad_ (usertest) [./test/unit/user_test.rb:25]: : should be in a valid format. 3) Failure: test_should_deny_duplicate_user(usertest) [./test/unit/../test_helper.rb:29:in `deny'./test/unit/../test_helper.rb:33:in `assert_invalid'./test/unit/user_test.rb:46:in `test_should_deny_duplicate_user']: User shouldn't be created. 4) Failure: test_should_require_ (usertest) [./test/unit/user_test.rb:19]: : should be required. 5) Failure: test_should_require_longer_password(usertest) [./test/unit/user_test.rb:37]: :password should be 4 characters or longer. 6) Failure: test_should_require_name(usertest) [./test/unit/user_test.rb:13]: :name should be required. 7) Failure: test_should_require_password(usertest) [./test/unit/user_test.rb:31]: :password should be required. 8 tests, 9 assertions, 7 failures, 0 errors Foram executados 8 testes, com 9 asserções, so que 7 falharam. O único teste que passou foi test_should_create_user, como era de se esperar. O que temos que fazer agora? Criar o código que irá passar nestes testes. No caso dos testes unitários isso é bastante simples. Você trabalha basicamente com modelos, então, abra o arquivo "app/models/user.rb". Você não precisa resolver os testes que falharam na ordem em que foram exibidos. Comece pelo que você julgar ser mais simples e com menor depência. Que tal começarmos pela falha 4: : should be required. Esta falha é bastante simples de se resolver, bastando que você coloque o método validates_presence_of no modelo. Por equivalência, também podemos resolver as falhas 6 e 7. class User < ActiveRecord::Base validates_presence_of : validates_presence_of :name

9 validates_presence_of :password Execute os testes Agora você verá que 12 asserções foram executadas mas que apenas 3 falharam. Muito mais interessante que o nosso teste anterior! ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started..FF.F.. Finished in seconds. 1) Failure: test_should_deny_bad_ (usertest) [./test/unit/user_test.rb:25]: : should be in a valid format. 2) Failure: test_should_deny_duplicate_user(usertest) [./test/unit/../test_helper.rb:29:in `deny'./test/unit/../test_helper.rb:33:in `assert_invalid'./test/unit/user_test.rb:46:in `test_should_deny_duplicate_user']: User shouldn't be created. 3) Failure: test_should_require_longer_password(usertest) [./test/unit/user_test.rb:37]: :password should be 4 characters or longer. 8 tests, 12 assertions, 3 failures, 0 errors Vamos validar o atributo password: ele não deve ter menos que 6 caracteres. Basta adicionar o validador abaixo ao seu modelo. validates_length_of :password, :minimum => 4 Mais uma vez, execute os testes. Apenas 2 testes falharam: test_should_deny_bad_ e test_should_deny_duplicate_user. Para, finalmente, passar por todos os testes, adicione os métodos abaixo. validates_uniqueness_of : , :case_sensitive => false validates_format_of : , :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2,})$/i Ao executar os testes, teremos uma resposta muito mais agradável! ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started... Finished in seconds. 8 tests, 14 assertions, 0 failures, 0 errors

10 Sim! Todos os nossos testes passaram e não sei se você percebeu mas o esforço foi praticamente nulo. Agora, seguindo nossos requisitos, iremos implementar os posts. No modelo Post, devemos escrever testes para validar os seguintes itens: um autor pode ter inúmeros posts os comentários podem ser permitidos ou não o resumo é opcional, mas se for informado não deve ultrapassar 250 caracteres Como ainda não temos o modelo Post, vamos criá-lo: script/generate model Post Abra o arquivo de migração 002_create_posts.rb e adicione o código abaixo. class CreatePosts < ActiveRecord::Migration def self.up create_table :posts do t t.column :title, :string, :limit => 250, :nil => false t.column :excerpt, :string, :limit => 250, :nil => true t.column :body, :text, :nil => false t.column :created_at, :datetime t.column :updated_at, :datetime t.column :allow_comments, :boolean, :default => true, :nil => false t.column :user_id, :integer, :nil => false def self.down drop_table :posts O código acima dispensa maiores explicações. Execute o comando rake db:migrate para criarmos a tabela de posts. ~/blog$ script/generate model Post exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/post.rb create test/unit/post_test.rb create test/fixtures/posts.yml exists db/migrate create db/migrate/002_create_posts.rb Já podemos criar os testes necessários para validar o modelo de posts. Como nossos testes depem do modelo User o post pertece a um autor temos que carregar alguns usuários no banco de dados. Isso pode ser feito com fixtures. O que são fixtures? Fixtures são conteúdos de um modelo ou modelos que serão carregados no banco de dados para a execução dos testes.

11 As fixtures podem ser carregadas através de SQL (INSERT INTO...), arquivos CSV ou, preferencialmente, arquivos YAML. Cada arquivo YAML de conter dados de um único modelo. O nome do arquivo de fixtures deve ser igual ao nome da tabela do banco de dados com a extensão.yml. O Rails cria estes arquivos para você, automaticamente, toda vez que você cria uma migração ou modelo. # Read about fixtures at one: id: 1 two: id: 2 O arquivo de fixtures é composto por diversos blocos que são equivalentes a registros do banco de dados. Lembre-se: use tabulação separadas por espaços. Vamos editar o arquivo "test/fixtures/users.yml" para adicionar alguns usuários válidos. bart: id: 1 name: Bart Simpson bart@simpsons.com password: test krusty: id: 2 name: Krusty The Clown krusty@simpsons.com password: test Agora, abra o arquivo "test/unit/post_test.rb" e carregue as fixtures de usuários. fixtures :posts, :users O mais interessante de se utilizar fixtures é que você recebe automaticamente um método com o mesmo nome da tabela de banco de dados e cada registro pode ser acessado pelo nome bart e krusty, no nosso caso que você definiu no arquivo de fixtures. Utilize nomes significativos sempre que puder. Vamos aproveitar e já criar algumas fixtures de posts. Abra o arquivo "test/unit/fixtures/posts.yml" e adicione o texto abaixo. rails_rules: id: 1 title: Rails rules body: Rails is a killer framework built with Ruby created_at: <%= Time.now %> updated_at: <%= Time.now %> user_id: 1 allow_comments: false ruby_rules: id: 2 title: Ruby also rules body: Ruby is a charming language created_at: <%= Time.now %> updated_at: <%= Time.now %>

12 user_id: 1 allow_comments: true Sim, você pode utilizar código Ruby dentro do arquivo de fixtures! Isso é extramente útil quando você precisa chamar algum método de um modelo (para criptografar a senha, por exemplo) ou trabalhar com datas, como é o nosso caso. Vamos preparar a nossa classe, adicionando o método create, da mesma maneira que criamos nos testes do modelo User. require File.dirname( FILE ) + '/../test_helper' class PostTest < Test::Unit::TestCase fixtures :posts, :users # Replace this with your real tests. def test_truth assert true private def create(options={}) Post.create({ :title => 'Title', :excerpt => 'Excerpt', :body => 'Body', :allow_comments => true, :user_id => 1 }.merge(options)) Nossos primeiros teste irão validar os campos obrigatórios. def test_should_be_invalid post = create(:title => nil, :excerpt => nil, :body => nil, :allow_comments => nil, :user_id => nil) assert_invalid post, "Post shouldn't be created" def test_should_require_title post = create(:title => nil) assert post.errors.invalid?(:title), ":title should be required" assert_invalid post, "Post shouldn't be created" def test_should_require_body post = create(:body => nil) assert post.errors.invalid?(:body), ":body should be required" assert_invalid post, "Post shouldn't be created" def test_should_require_author post = create(:user_id => nil) assert post.errors.invalid?(:user_id), ":user_id should be required" assert_invalid post, "Post shouldn't be created"

13 O resumo pode ter no máximo 250 caracteres mas é opcional. Então vamos aos testes. def test_should_accept_excerpt post = create(:excerpt => 'Testing excerpt') deny post.errors.invalid?(:excerpt), ":excerpt should have been valid" assert_valid post def test_should_deny_long_excerpt post = create(:excerpt => "a" * 251) assert post.errors.invalid?(:excerpt), ":excerpt should have had an error" assert_invalid post, "Post shouldn't be created" Temos que verificar agora se o usuário existe e se o post foi corretamente associado a ele. Nossos testes: def test_should_deny_non_integer_user post = create(:user_id => 'a') assert post.errors.invalid?(:user_id), ":user_id should have had an error" assert_invalid post, "Post shouldn't be created" post = create(:user_id => 1.397) assert post.errors.invalid?(:user_id), ":user_id should have had an error" assert_invalid post, "Post shouldn't be created" def test_should_check_post_authorship # check all fixtures were loaded assert_equal 2, users(:bart).posts.size, "user should have had 2 posts" # assign a post without user_id post = create(:user_id => nil) # then, assign a post using the relationship method users(:bart).posts << post #now, check if user have one more post assert_equal 3, users(:bart).posts.size, "user should have had 3 posts" # assign a post to a user that doesn't exist post = create(:user_id => 100) assert post.errors.invalid?(:user), "User doesn't exist, so it should be required" E aqui temos um novo método de asserção: assert_equal. Esse método verifica se dois valores são iguais. Veja alguns métodos de asserção que você pode usar. assert(boolean, message) Se o parâmetro boolean for nil ou false a asserção irá falhar. assert_equal(expected, actual, message) assert_not_equal(expected, actual, message)

14 A asserção irá falhar a menos que expected e actual sejam iguais/diferentes. assert_nil(object, message) assert_not_nil(object, message) A asserção irá falhar a menos que object seja/não seja nil. assert_raise(exception,..., message) { block } assert_not_raise(exception,..., message) { block } A asserção irá falhar a menos que block dispare/não dispare um erro da exceção especificada. assert_match(pattern, string, message) assert_no_match(pattern, string, message) A asserção irá falhar a menos que string seja/não seja correspondente à expressão regular pattern. assert_valid(record) Falha a menos que record não tenha erros de validação. Na parte dois deste artigo você verá outros métodos de asserção disponíveis para testes dos controllers. E ao rodarmos os testes unitários, temos ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started.FEFFFFF... Finished in seconds. 1) Failure: test_should_be_invalid(posttest) [./test/unit/../test_helper.rb:30:in `deny'./test/unit/../test_helper.rb:34:in `assert_invalid'./test/unit/post_test.rb:9:in `test_should_be_invalid']: Post shouldn't be created. 2) Error: test_should_check_post_authorship(posttest): NoMethodError: undefined method `posts' for #<User:0xb7334d2c> /usr/lib/ruby/gems/1.8/gems/activerecord /lib/active_record/base.rb:1860:in `method_missing'./test/unit/post_test.rb:49:in `test_should_check_post_authorship' 3) Failure: test_should_deny_long_excerpt(posttest) [./test/unit/post_test.rb:38]: :excerpt should have had an error. 4) Failure: test_should_deny_non_integer_user(posttest) [./test/unit/../test_helper.rb:30:in `deny'./test/unit/../test_helper.rb:34:in `assert_invalid'./test/unit/post_test.rb:44:in `test_should_deny_non_integer_user']: Post shouldn't be created. 5) Failure: test_should_require_author(posttest) [./test/unit/post_test.rb:26]: :user_id should be required.

15 6) Failure: test_should_require_body(posttest) [./test/unit/post_test.rb:20]: :body should be required. 7) Failure: test_should_require_title(posttest) [./test/unit/post_test.rb:14]: :title should be required. 15 tests, 21 assertions, 6 failures, 1 errors uma verdadeira catástrofe! Um erro no teste test_should_check_post_authorship nos diz que o método posts não existe. Mas parando para pensar, faz todo sentido, já que nós ainda não definimos o relacionamento entre os modelos. Vamos tratar este erro apenas colocando o relacionamento no modelo User. class User < ActiveRecord::Base has_many :posts, :depent => :destroy #[...] Note que apenas exibi o código relevante a esta alteração; as validações anteriores permanecem e são representadas aqui por #[...]. Após adicionar esta linha, você já tem o relacionamento entre posts e usuários e se você rodar os testes agora, apenas as falhas serão exibidas. ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started.FFFFFFF... Finished in seconds. 1) Failure: test_should_be_invalid(posttest) [./test/unit/../test_helper.rb:29:in `deny'./test/unit/../test_helper.rb:33:in `assert_invalid'./test/unit/post_test.rb:9:in `test_should_be_invalid']: Post shouldn't be created. 2) Failure: test_should_check_post_authorship(posttest) [./test/unit/post_test.rb:63]: User doesn't exist, so it should be required. 3) Failure: test_should_deny_long_excerpt(posttest) [./test/unit/post_test.rb:38]: :excerpt should have had an error. 4) Failure:

16 test_should_deny_non_number_user(posttest) [./test/unit/post_test.rb:44]: :user_id should have had an error. 5) Failure: test_should_require_body(posttest) [./test/unit/post_test.rb:20]: :body should be required. 6) Failure: test_should_require_title(posttest) [./test/unit/post_test.rb:14]: :title should be required. 7) Failure: test_should_require_user(posttest) [./test/unit/post_test.rb:26]: :user_id should be required. 16 tests, 25 assertions, 7 failures, 0 errors Vamos às validações mais triviais utilizando o método validates_presence_of. class Post < ActiveRecord::Base validates_presence_of :title validates_presence_of :body validates_presence_of :user_id ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started..FFF... Finished in seconds. 1) Failure: test_should_check_post_authorship(posttest) [./test/unit/post_test.rb:63]: User doesn't exist, so it should be required. 2) Failure: test_should_deny_long_excerpt(posttest) [./test/unit/post_test.rb:38]: :excerpt should have had an error. 3) Failure: test_should_deny_non_number_user(posttest) [./test/unit/post_test.rb:44]: :user_id should have had an error. 16 tests, 28 assertions, 3 failures, 0 errors A coisa já melhorou bastante. As três falhas restantes são relativamente simples de resolver. Primeiro vamos verificar se o user_id é um número. validates_numericality_of :user_id, :only_integer => true

17 A falha relativa ao tamanho do resumo pode ser resolvido com uma validação como esta: validates_length_of :excerpt, :maximum => 250, :if => :check_excerpt? private def check_excerpt?!self.excerpt.blank? E agora, só mais uma falha para corrigir. Estamos ficando bons nisso! ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started..F... Finished in seconds. 1) Failure: test_should_check_post_authorship(posttest) [./test/unit/post_test.rb:67]: User doesn't exist, so it should be required. 16 tests, 32 assertions, 1 failures, 0 errors Para corrigir esta falha, você deve primeiro definir que um post está associado a um usuário. Nós fizemos apenas o outro caminho, dizo que um usuário possui diversos posts. Altere o seu modelo Post, adicionando o relacionamento belongs_to :user. Agora, você poderá adicionar as validações relativas a esta falha. class Post < ActiveRecord::Base belongs_to :user validates_associated :user validates_presence_of :user #[..] Perceba que estamos validando a presença do atributo/método user e não user_id. A mesma coisa está so feita na segunda parte do teste test_should_check_post_authorship. Isso deve ser feito para se validar a associação entre um post e um usuário, de modo que o usuário deve realmente existir; caso contrário, teriamos uma associação incorreta no teste, já que o usuário com id 100 não existe. Parabéns! Mais um modelo foi devidamente testado. ~/blog$ rake test:units Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader Started... Finished in seconds. 16 tests, 32 assertions, 0 failures, 0 errors

18 Falta apenas mais um modelo para testarmos: são os comentários. Crie o modelo Comment e abra o arquivo de migração "db/migrate/003_create_comments.rb". Ele deve se parecer com isto: class CreateComments < ActiveRecord::Migration def self.up create_table :comments do t t.column :post_id, :integer, :nil => false t.column :name, :string, :limit => 100, :nil => false t.column : , :string, :limit => 100, :nil => false t.column :url, :string, :limit => 255, :nil => true t.column :created_at, :datetime t.column :active, :boolean, :default => false, :nil => false t.column :body, :text, :nil => false def self.down drop_table :comments Os requisitos para este modelo são: um comentário deve estar associado a um post só é possível comentar em posts que estão com esta opção ativada nome, comentário e são obrigatórios; a URL é opcional. Execute a migração e abra o arquivo "test/unit/comment_test.rb". Vamos criar nossos testes. Os testes são muito semelhantes aos criados anteriormente, por isso, irei apenas colocá-los aqui, sem explicações. require File.dirname( FILE ) + '/../test_helper' class CommentTest < Test::Unit::TestCase fixtures :comments, :posts def test_should_be_created comment = create(:post_id => posts(:ruby_rules).id) assert_valid comment def test_should_be_invalid comment = create(: => nil, :name => nil, :url => nil, :body => nil) assert_invalid comment, "Comment shouldn't be created" def test_should_require_name comment = create(:name => nil) assert comment.errors.invalid?(:name), ":name should have had an error" assert_invalid comment, "Comment shouldn't be created" def test_should_require_ comment = create(: => nil)

19 assert comment.errors.invalid?(: ), ": should have had an error" assert_invalid comment, "Comment shouldn't be created" def test_should_deny_bad_ comment = create(: => 'bad@format') assert comment.errors.invalid?(: ), ": should be in a valid format" assert_invalid comment, "Comment shouldn't be created" def test_should_require_comment comment = create(:body => nil) assert comment.errors.invalid?(:body), ":body should have had an error" assert_invalid comment, "Comment shouldn't be created" def test_should_require_post comment = create(:post_id => nil) assert comment.errors.invalid?(:post_id), ":post_id should have had an error" assert_invalid comment, "Comment shouldn't be created" comment = create(:post_id => 100) assert comment.errors.invalid?(:post), "Post doesn't exist so it should be required" def test_cannot_comment_because_post_is_closed comment = create(:post_id => posts(:rails_rules).id) assert_invalid comment, "Comment shouldn't be created" private def create(options={}) Comment.create({ : => 'burns@simpsons.com', :name => 'Mr Burns', :url => ' :body => "Get em', Smithers.", :post_id => 2 }.merge(options)) Abra também o arquivo "test/fixtures/comments.yml" e adicione as fixtures abaixo: comment_on_ruby_post: id: 1 name: Bart Simpson bart@thesimpsons.com url: body: Heya! post_id: 2 created_at: <%= Time.now %> active: 0 another_comment_on_ruby_post: id: 2

20 name: Bart Simpson url: body: Heya! post_id: 2 created_at: <%= Time.now %> active: 0 comment_on_rails_post: id: 3 name: Principal Skinner skinner@thesimpsons.com url: body: Bart, you'll be in detention forever! post_id: 1 created_at: <%= Time.now %> active: 1 Ao executar estes testes teremos muitas falhas e apenas 1 erro. Novamente, o erro está ligado ao relacionamento que não criamos. Para corrigí-lo, altere o modelo Post. class Post < ActiveRecord::Base has_many :comments, :depent => :destroy #[...] Para validar nosso modelo, basta adicionar os validadores abaixo: class Comment < ActiveRecord::Base belongs_to :post validates_associated :post validates_presence_of :post validates_presence_of :post_id validates_numericality_of :post_id, :only_integer => true validates_presence_of :name validates_presence_of : validates_presence_of :body, :message => "Don't you wanna comment this post?" validates_format_of : , :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i private def validate if post errors.add_to_base("comments are closed") unless post.allow_comments A única coisa que você pode estranhar é o método validate. Nele, verifico se um post foi passado para, então, checar se o post está aberto para comentário ou não. Dicas e considerações

Test-driven Development no Rails Começando seu projeto com o pé direito. 2007, Nando Vieira http://simplesideias.com.br

Test-driven Development no Rails Começando seu projeto com o pé direito. 2007, Nando Vieira http://simplesideias.com.br Test-driven Development no Rails Começando seu projeto com o pé direito 2007, Nando Vieira http://simplesideias.com.br O que iremos ver? slides = Array.new slides

Leia mais

Como incluir artigos:

Como incluir artigos: Como incluir artigos: O WordPress é uma ferramenta muito flexível, com muitas variações e ajustes que podem torná-lo algo muito simples e também muito sofisticado conforme os recursos que são configurados

Leia mais

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software O Animail é um software para criar campanhas de envio de email (email Marketing). Você pode criar diversas campanhas para públicos diferenciados. Tela Principal do sistema Para melhor apresentar o sistema,

Leia mais

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL. Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2012 Edição 7 Listando e Gravando Listando itens em ComboBox e gravando os dados no

Leia mais

Validando dados de páginas WEB

Validando dados de páginas WEB Validando dados de páginas WEB Para que validar os dados? Validar os dados informados pelo usuário garante que sua aplicação funcione corretamente e as informações contidas nela tenha algum sentido. Outro

Leia mais

Versão 0.1. Manual FoRc. Última Atualização: Maio/2007. Daniel Schmitz danieljfa@gmail.com

Versão 0.1. Manual FoRc. Última Atualização: Maio/2007. Daniel Schmitz danieljfa@gmail.com Versão 0.1 Manual FoRc Última Atualização: Maio/2007 Daniel Schmitz danieljfa@gmail.com Sumário 1. O que é FoRc?... 3 2. O que é Adobe Flex?... 3 3. O que é Ruby on Rails?... 3 4. Flex + Ruby on Rails?...

Leia mais

Lazarus pelo SVN Linux/Windows

Lazarus pelo SVN Linux/Windows Lazarus pelo SVN Linux/Windows Sei que não faltam artigos sobre como obter e compilar o Lazarus e o FPC pelo SVN, mas sei também que nunca é de mais divulgar um pouco mais e talvez escrever algo diferente.

Leia mais

4 O Workflow e a Máquina de Regras

4 O Workflow e a Máquina de Regras 4 O Workflow e a Máquina de Regras O objetivo do workflow e da máquina de regras é definir um conjunto de passos e regras configuráveis. Ao longo de sua execução, um usuário consegue simplificar o seu

Leia mais

Programação Web Aula 10 - Testes, Javascript, Ajax

Programação Web Aula 10 - Testes, Javascript, Ajax Programação Web Aula 10 - Testes, Javascript, Ajax Bruno Müller Junior Departamento de Informática UFPR 28 de Abril de 2014 1 Ambientes de Execução 2 Testes Um exemplo Acrescentando Validação Validação

Leia mais

1º passo: Instalando a rvm.

1º passo: Instalando a rvm. Tutorial de instalação de múltiplos ambientes Ruby 1.8.7 e 1.9.2, Ruby on Rails 2.3.11 e 3.0.7 e MySQL no Ubuntu 10.04. Nem sempre é fácil a preparação de um ambiente de desenvolvimento web completo. Às

Leia mais

Tutorial para envio de comunicados e SMS

Tutorial para envio de comunicados e SMS Tutorial para envio de comunicados e SMS Conteúdo 1. Enviando comunicado para os alunos... 1 2. Verificando a situação do envio dos e-mails para os alunos... 5 3. Enviando comunicado para colaboradores

Leia mais

No Fedora, instalamos os pacotes "mysql" e "mysql-server", usando o yum:

No Fedora, instalamos os pacotes mysql e mysql-server, usando o yum: Instalando o MySQL O MySQL é um banco de dados extremamente versátil, usado para os mais diversos fins. Você pode acessar o banco de dados a partir de um script em PHP, através de um aplicativo desenvolvido

Leia mais

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos TUTORIAL Memória Flash Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br

Leia mais

Utilizando a ferramenta de criação de aulas

Utilizando a ferramenta de criação de aulas http://portaldoprofessor.mec.gov.br/ 04 Roteiro Utilizando a ferramenta de criação de aulas Ministério da Educação Utilizando a ferramenta de criação de aulas Para criar uma sugestão de aula é necessário

Leia mais

Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos

Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos Banco de Dados Microsoft Access: Criar tabelas Vitor Valerio de Souza Campos Objetivos do curso 1. Criar uma tabela no modo de exibição Folha de Dados. 2. Definir tipos de dados para os campos na tabela.

Leia mais

EXEMPLO DE COMO FAZER UMA MALA DIRETA

EXEMPLO DE COMO FAZER UMA MALA DIRETA EXEMPLO DE COMO FAZER UMA MALA DIRETA OBS: Para esta nota de aula foi utilizada como referência: Apostila Mala Direta Santos, Jorge Rodrigues dos. Foram adaptados os comando para utilizar mala direta no

Leia mais

Criando Banco de Dados, Tabelas e Campos através do HeidiSQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Criando Banco de Dados, Tabelas e Campos através do HeidiSQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Criando Banco de Dados, Tabelas e Campos através do HeidiSQL Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Edição 2 Pedreiros da Informação Criando Banco de Dados, Tabelas e Campos através do HeidiSQL

Leia mais

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo. Manual de Instruções ECO Editor de Conteúdo Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo. O ECO é um sistema amigável e intui?vo, mas abaixo você pode?rar eventuais dúvidas e aproveitar

Leia mais

Banco de Dados Microsoft Access: Criar tabelas

Banco de Dados Microsoft Access: Criar tabelas Banco de Dados Microsoft Access: Criar s Vitor Valerio de Souza Campos Objetivos do curso 1. Criar uma no modo de exibição Folha de Dados. 2. Definir tipos de dados para os campos na. 3. Criar uma no modo

Leia mais

WF Processos. Manual de Instruções

WF Processos. Manual de Instruções WF Processos Manual de Instruções O WF Processos é um sistema simples e fácil de ser utilizado, contudo para ajudar os novos usuários a se familiarizarem com o sistema, criamos este manual. Recomendamos

Leia mais

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Trabalhando com conexão ao banco de dados MySQL no Lazarus Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Edição 4 O Componente Trabalhando com conexão ao banco de dados MySQL no Lazarus Ano: 03/2011

Leia mais

Dicas para usar melhor o Word 2007

Dicas para usar melhor o Word 2007 Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.

Leia mais

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela Aula 01 - Formatações prontas e Sumário Formatar como Tabela Formatar como Tabela (cont.) Alterando as formatações aplicadas e adicionando novos itens Removendo a formatação de tabela aplicada Formatação

Leia mais

Segurança de Acesso a Banco de Dados no MS SQL Server

Segurança de Acesso a Banco de Dados no MS SQL Server Segurança de Acesso a Banco de Dados no MS SQL Server Para efetuar com sucesso os exemplos que serão mostrados a seguir é necessário que exista no SQL Server uma pessoa que se conecte como Administrador,

Leia mais

2 echo "PHP e outros.";

2 echo PHP e outros.; PHP (Hypertext Preprocessor) Antes de qualquer coisa, precisamos entender o que é o PHP: O PHP(Hypertext Preprocessor) é uma linguagem interpretada gratuita, usada originalmente apenas para o desenvolvimento

Leia mais

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET I Sumário 1. Objetivo do Documento... 1 2. Início... 1 3. Cadastro de Pessoa Física... 3 3.1. Preenchimentos Obrigatórios.... 4 3.2. Acesso aos Campos

Leia mais

Parte I. Demoiselle Mail

Parte I. Demoiselle Mail Parte I. Demoiselle Mail Para o envio e recebimento de e-s em aplicativos Java, a solução mais natural é usar a API JavaMail [http:// www.oracle.com/technetwork/java/java/index.html]. Ela provê um framework

Leia mais

Parte I Tutorial Wi Fi 2.0 Arduino Exemplo usado: Webserver

Parte I Tutorial Wi Fi 2.0 Arduino Exemplo usado: Webserver Parte I Tutorial Wi Fi 2.0 Arduino Exemplo usado: Webserver Olá a todos! me chamo ONTREUS e sou iniciante na programação com o Arduino e resolvi criar este tutorial para facilitar a vida de muitos que

Leia mais

Prefeitura Municipal de São Luís Manual de uso dos serviços da SEMFAZ. Prefeitura Municipal de São Luís Manual de uso dos serviços da SEMFAZ

Prefeitura Municipal de São Luís Manual de uso dos serviços da SEMFAZ. Prefeitura Municipal de São Luís Manual de uso dos serviços da SEMFAZ Prefeitura Municipal de São Luís Manual de uso dos serviços da SEMFAZ 1 Sumário 1. Introdução 2. Emissão de Certidões 3. Autenticação de Certidões 4. Cadastro de Imóveis/Empresa 5. Acessando meu cadastro

Leia mais

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA FERRAMENTAS DE COLABORAÇÃO CORPORATIVA Compartilhamento de Arquivos no Google Drive Sumário (Clique sobre a opção desejada para ir direto à página correspondente) Utilização do Google Grupos Introdução...

Leia mais

Trilha Agile TDD e 20 coisas que você precisa saber

Trilha Agile TDD e 20 coisas que você precisa saber Trilha Agile TDD e 20 coisas que você precisa saber Camilo Lopes Quem sou eu?! Trabalha com desenvolvimento de software desde 2003. Atualmente Desenvolvedor de Software na ADP Labs, escritor do livro "Guia

Leia mais

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova. 3.5 Páginas: Ao clicar em Páginas, são exibidas todas as páginas criadas para o Blog. No nosso exemplo já existirá uma página com o Título Página de Exemplo, criada quando o WorPress foi instalado. Ao

Leia mais

CONSTRUÇÃO DE BLOG COM O BLOGGER

CONSTRUÇÃO DE BLOG COM O BLOGGER CONSTRUÇÃO DE BLOG COM O BLOGGER Blog é uma abreviação de weblog, qualquer registro frequênte de informações pode ser considerado um blog (últimas notícias de um jornal online por exemplo). A maioria das

Leia mais

Manual Administrador - Mídia System

Manual Administrador - Mídia System Manual Administrador - Mídia System Logo após cadastrarmos sua Empresa em nosso sistema, será enviado um e-mail confirmando as informações de acesso do Administrador do sistema. Obs: Caso não tenha recebido

Leia mais

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR Novell Teaming - Guia de início rápido Novell Teaming 1.0 Julho de 2007 INTRODUÇÃO RÁPIDA www.novell.com Novell Teaming O termo Novell Teaming neste documento se aplica a todas as versões do Novell Teaming,

Leia mais

CRIANDO UM BANCO DE DADOS

CRIANDO UM BANCO DE DADOS CRIANDO UM BANCO DE DADOS Bem, antes de iniciarmos propriamente no delphi, devemos aprender a usar sua ferramentas, sendo uma das mais importantes o Database Desktop, pois é com esta que construímos nossos

Leia mais

Nesse artigo abordaremos os principais aspectos de instalação e uso do NTOP no Fedora Core 4.

Nesse artigo abordaremos os principais aspectos de instalação e uso do NTOP no Fedora Core 4. Diego M. Rodrigues (diego@drsolutions.com.br) O NTOP é um programa muito simples de ser instalado e não requer quase nenhuma configuração. Ele é capaz de gerar excelentes gráficos de monitoramento das

Leia mais

Guia do Usuário. Introdução

Guia do Usuário. Introdução Guia do Usuário Introdução Nosso objetivo ao criar o Auditorbook foi valorizar o tempo de profissionais que realizam auditorias, verificações ou inspeções. Com este aplicativo desenvolvido pela VL Corrêa

Leia mais

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS FORMULÁRIOS COM ABAS Trabalhar com abas (ou guias) é um recurso

Leia mais

Scriptlets e Formulários

Scriptlets e Formulários 2 Scriptlets e Formulários Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Permitir ao aluno aprender a criar um novo projeto Java para web no Netbeans IDE,

Leia mais

Como criar e gerir um blog?

Como criar e gerir um blog? Como criar e gerir um blog? Como criar um blog? Como escrever num blog? Como visualizar o meu blog? Como apagar ou emendar um texto que já tenha sido publicado? O Sistema de Comentários Configurações Importantes!!

Leia mais

II Semana de Tecnologia da Informação. Rails Framework

II Semana de Tecnologia da Informação. Rails Framework II Semana de Tecnologia da Informação Rails Framework Rails Instalação Ruby versão 1.8.7 Linux: ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz ou apt-get install ruby (Debian/Ubuntu) Windows:

Leia mais

Guia de instalação para ambiente de Desenvolvimento LINUX

Guia de instalação para ambiente de Desenvolvimento LINUX Guia de instalação para ambiente de Desenvolvimento LINUX Conteúdo deste manual Introdução O guia de instalação... 3 Capítulo 1 Instalando o servidor Web Apache... 4 Teste de instalação do Apache... 9

Leia mais

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova. 3.5 Páginas: Ao clicar em Páginas, são exibidas todas as páginas criadas para o Blog. No nosso exemplo já existirá uma página com o Título Página de Exemplo, criada quando o WorPress foi instalado. Ao

Leia mais

O Googlebot não consegue aceder a ficheiros CSS e JS em seu blog

O Googlebot não consegue aceder a ficheiros CSS e JS em seu blog O Googlebot não consegue aceder a ficheiros CSS e JS em seu blog O Googlebot não consegue aceder a ficheiros CSS e JS em seu blog? Aprenda agora como resolver essa mensagem. Recentemente muitos blogueiros

Leia mais

Manual de Instalação e Configuração para Revendedores e Assinantes Virtual Server.

Manual de Instalação e Configuração para Revendedores e Assinantes Virtual Server. Manual de Instalação e Configuração para Revendedores e Assinantes Virtual Server. Parte I Cadastrando Sites no painel de controle Parte II Criando E-mail Parte III Configurando o Outlook do Cliente Última

Leia mais

Sistema de Recursos Humanos

Sistema de Recursos Humanos Sistema de Recursos Humanos Projeto 1 O objetivo desse sistema é gerenciar a admissão e a demissão de funcionários. Esse funcionário pode ou não ter dependentes. Esse funcionário está alocado em um departamento

Leia mais

Manual SAGe Versão 1.2 (a partir da versão 12.08.01)

Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação

Leia mais

Instalando servidor Apache com MySQL e as linguagens ColdFusion e PHP. XAMPP 1.6.7 (xampp-win32-1.6.7-installer.exe), veja aqui.

Instalando servidor Apache com MySQL e as linguagens ColdFusion e PHP. XAMPP 1.6.7 (xampp-win32-1.6.7-installer.exe), veja aqui. Instalando servidor Apache com MySQL e as linguagens ColdFusion e PHP. Escrito por Marcio Nakano (marcionakano.com.br) Data: 29/09/2008 Disponível em http:///blog/post/instalando-apache-mysql-coldfusionphp.pdf

Leia mais

UNIVERSIDADE FEDERAL DO AMAPÁ PRÓ REITORIA DE ADMINISTRAÇÃO E PLANEJAMENTO DEPARTAMENTO DE INFORMÁTICA. Manual do Moodle- Sala virtual

UNIVERSIDADE FEDERAL DO AMAPÁ PRÓ REITORIA DE ADMINISTRAÇÃO E PLANEJAMENTO DEPARTAMENTO DE INFORMÁTICA. Manual do Moodle- Sala virtual UNIVERSIDADE FEDERAL DO AMAPÁ PRÓ REITORIA DE ADMINISTRAÇÃO E PLANEJAMENTO DEPARTAMENTO DE INFORMÁTICA Manual do Moodle- Sala virtual UNIFAP MACAPÁ-AP 2012 S U M Á R I O 1 Tela de Login...3 2 Tela Meus

Leia mais

PAINEL GERENCIADOR DE E-MAILS

PAINEL GERENCIADOR DE E-MAILS Este manual foi criado com o objetivo de facilitar o gerenciamento de suas contas de e-mail. Com ele, o administrador poderá criar e excluir e-mails, alterar senha, configurar redirecionamento de contas,

Leia mais

Inventario de produtos

Inventario de produtos Inventario de produtos Parar o TAC. Gerar o inventario. Informações de erros na importação de produtos. Produtos sem código tributário associado. A posse de produtos no Thotau. Como corrigir as posses

Leia mais

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material

Leia mais

"Manual de Acesso ao Moodle - Discente" 2014

Manual de Acesso ao Moodle - Discente 2014 "Manual de Acesso ao Moodle - Discente" 2014 Para acessar a plataforma, acesse: http://www.fem.com.br/moodle. A página inicial da plataforma é a que segue abaixo: Para fazer o login, clique no link Acesso

Leia mais

Desenvolvendo Websites com PHP

Desenvolvendo Websites com PHP Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.

Leia mais

Versão 0.1.0. Manual FoRc. Última Atualização: Maio/2007. Daniel Schmitz danieljfa@gmail.com

Versão 0.1.0. Manual FoRc. Última Atualização: Maio/2007. Daniel Schmitz danieljfa@gmail.com Versão 0.1.0 Manual FoRc Última Atualização: Maio/2007 Daniel Schmitz danieljfa@gmail.com Sumário 1. O que é FoRc?... 3 2. O que é Adobe Flex?... 3 3. O que é Ruby on Rails?... 3 4. Flex + Ruby on Rails?...

Leia mais

Manual do Google agenda. criação e compartilhamento de agendas

Manual do Google agenda. criação e compartilhamento de agendas Manual do Google agenda criação e compartilhamento de agendas 1 O que é o Google Agenda? Google Agenda é um serviço de agenda on line gratuito do Google, onde você pode anotar compromissos e tarefas, organizando

Leia mais

Conexão rápida entre dois computadores em uma plataforma Linux

Conexão rápida entre dois computadores em uma plataforma Linux Conexão rápida entre dois computadores em uma plataforma Linux Algumas vezes, novos usuários de Linux acabam achando difícil transferir aquivos entre duas máquinas Linux em rede (no meu caso via cabo).

Leia mais

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO Antes de criarmos um novo Banco de Dados quero fazer um pequeno parênteses sobre segurança. Você deve ter notado que sempre

Leia mais

AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho.

AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho. DELPHI BÁSICO VANTAGENS Ambiente de desenvolvimento fácil de usar; 1. Grande Biblioteca de Componentes Visuais (VCL - Visual Component Library), que são botões, campos, gráficos, caixas de diálogo e acesso

Leia mais

Tutorial Básico. Instalando e testando o Ruby on Rails no Windows

Tutorial Básico. Instalando e testando o Ruby on Rails no Windows Tutorial Básico Instalando e testando o Ruby on Rails no Windows Ana Luiza Dias Organização do Tutorial: Passos para a instalação...pág 2 Passos para a criação de um projeto rails...pág 3 Passos para acompanhar

Leia mais

Manual do Ambiente Moodle para Professores

Manual do Ambiente Moodle para Professores UNIVERSIDADE FEDERAL DA FRONTEIRA SUL Manual do Ambiente Moodle para Professores Tarefas Versão 1.0b Setembro/2011 Direitos Autorais: Essa apostila está licenciada sob uma Licença Creative Commons 3.0

Leia mais

Manual de Publicaça o no Blog da Aça o TRIBOS nas Trilhas da Cidadania

Manual de Publicaça o no Blog da Aça o TRIBOS nas Trilhas da Cidadania Manual de Publicaça o no Blog da Aça o TRIBOS nas Trilhas da Cidadania Sumário Objetivos do Blog... 2 Log-in... 3 Esqueci minha senha... 4 Utilizando o Blog... 5 Encontrando seu Blog... 5 Conhecendo o

Leia mais

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco). Permissões de compartilhamento e NTFS - Parte 2 Criando e compartilhando uma pasta - Prática Autor: Júlio Battisti - Site: www.juliobattisti.com.br Neste tópico vamos criar e compartilhar uma pasta chamada

Leia mais

NOVIDADES DO JAVA PARA PROGRAMADORES C

NOVIDADES DO JAVA PARA PROGRAMADORES C PROGRAMAÇÃO SERVIDOR EM SISTEMAS WEB NOVIDADES DO JAVA PARA PROGRAMADORES C Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar o Conceito de Classes e Objetos Capacitar para a criação de objetos simples

Leia mais

COMO FAZER SEUS PEDIDOS ONLINE PASSO-A-PASSO

COMO FAZER SEUS PEDIDOS ONLINE PASSO-A-PASSO COMO FAZER SEUS PEDIDOS ONLINE PASSO-A-PASSO Neste passo a passo iremos mostrar como é facil, simples e rápido o acesso ao site para consultas e pedidos online. Primeira etapa: Entrar no site www.thermofisher.com

Leia mais

Segmentação de Lista de Contatos

Segmentação de Lista de Contatos Guia rápido sobre... Segmentação de Lista de Contatos Neste guia... Aprenda a criar combinações precisas para uma segmentação direta e eficaz. Índice 1. Pesquisar Contatos! 3 1.1 Página de pesquisa de

Leia mais

Manual de Utilização

Manual de Utilização Manual de Utilização Versão 1.0 18/01/2013 Sempre consulte por atualizações deste manual em nossa página. O Cotação Web está em constante desenvolvimento, podendo ter novas funcionalidades adicionadas

Leia mais

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5.

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5. Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5. Ele considera que você já tem o Joomla! instalado no seu computador. Caso você queira utilizá lo em um servidor na web,

Leia mais

INSTALANDO E CONFIGURANDO O MY SQL

INSTALANDO E CONFIGURANDO O MY SQL INSTALANDO E CONFIGURANDO O MY SQL Este tutorial tem como objetivo mostrar como instalar o banco de dados My SQL em ambiente Windows e é destinado aqueles que ainda não tiveram um contato com a ferramenta.

Leia mais

Manual de configuração do sistema

Manual de configuração do sistema Manual de configuração do sistema (v.1.5.x Beta) Rua México, 119 Sala 2004 Centro Rio de Janeiro, RJ www.doctors-solution.com.br www.simdoctor.com.br contato@simdoctor.com.br Sumário 1. Fazendo seu primeiro

Leia mais

Cadastrar Categorias e Produtos

Cadastrar Categorias e Produtos Cadastrar Categorias e Produtos 1- Introdução Bom, agora que você conseguiu configurar a sua loja com sucesso, incluindo as informações do PagSeguro, precisamos cadastrar o principal: Os Produtos, afinal,

Leia mais

Tutorial para envio de comunicados

Tutorial para envio de comunicados Tutorial para envio de comunicados Conteúdo 1. Enviando comunicado para os alunos... 2 2. Verificando a situação do envio dos e-mails para os alunos... 4 3. Enviando comunicado para colaboradores e professores...

Leia mais

Fixture-Factory. Criando objetos para seus testes. Como criar objetos através de templates para serem utilizados como massa de dados em seus testes.

Fixture-Factory. Criando objetos para seus testes. Como criar objetos através de templates para serem utilizados como massa de dados em seus testes. fixture-factory_ Fixture-Factory Criando objetos para seus testes Como criar objetos através de templates para serem utilizados como massa de dados em seus testes. Começamos testando métodos simples, mas

Leia mais

Omega Tecnologia Manual Omega Hosting

Omega Tecnologia Manual Omega Hosting Omega Tecnologia Manual Omega Hosting 1 2 Índice Sobre o Omega Hosting... 3 1 Primeiro Acesso... 4 2 Tela Inicial...5 2.1 Área de menu... 5 2.2 Área de navegação... 7 3 Itens do painel de Controle... 8

Leia mais

MICROSOFT EXCEL AVANÇADO

MICROSOFT EXCEL AVANÇADO MICROSOFT EXCEL AVANÇADO SE Retorna um valor se teste_lógico avaliar como VERDADEIRO e um outro valor se for avaliado como FALSO. Use SE para conduzir testes condicionais sobre valores e fórmulas e para

Leia mais

OFICINA BLOG DAS ESCOLAS

OFICINA BLOG DAS ESCOLAS OFICINA BLOG DAS ESCOLAS Créditos: Márcio Corrente Gonçalves Mônica Norris Ribeiro Março 2010 1 ACESSANDO O BLOG Blog das Escolas MANUAL DO ADMINISTRADOR Para acessar o blog da sua escola, acesse o endereço

Leia mais

Índice: CMS 3 O que é Content Management System? Clientes 4 O que é o Cliente? 4 Configurando o i-menu/i-view para trabalhar. com o CMS.

Índice: CMS 3 O que é Content Management System? Clientes 4 O que é o Cliente? 4 Configurando o i-menu/i-view para trabalhar. com o CMS. Índice: CMS 3 O que é Content Management System? Clientes 4 O que é o Cliente? 4 Configurando o i-menu/i-view para trabalhar com o CMS. 5 Removendo o Cliente. Playlist 7 Criando um Playlist. 8 Adicionando

Leia mais

GUIA SISTEMA ONLINE. Anote aqui: Acesso: 1- Navegadores: google chrome, firefox, internet explorer, etc.. 2- Digite: web.aeschool.com.

GUIA SISTEMA ONLINE. Anote aqui: Acesso: 1- Navegadores: google chrome, firefox, internet explorer, etc.. 2- Digite: web.aeschool.com. GUIA SISTEMA ONLINE Anote aqui: Acesso: 1- Navegadores: google chrome, firefox, internet explorer, etc.. 2- Digite: web.aeschool.com.br Nome: Nome de usuário: Senha de acesso: My profile ÍNDICE: Apresentação

Leia mais

COMO INICIAR O RELACIONAMENTO COM OS LEADS? 8 passos para TER UMA SEQUÊNCIA DE EMAILS BEM SUCEDIDA.

COMO INICIAR O RELACIONAMENTO COM OS LEADS? 8 passos para TER UMA SEQUÊNCIA DE EMAILS BEM SUCEDIDA. COMO INICIAR O RELACIONAMENTO COM OS LEADS? 8 passos para TER UMA SEQUÊNCIA DE EMAILS BEM SUCEDIDA. Uma sequência de e-mail, follow-up ou auto responder é um sistema de resposta automática em uma série

Leia mais

W o r d p r e s s 1- TELA DE LOGIN

W o r d p r e s s 1- TELA DE LOGIN S U M Á R I O 1Tela de Login...2 2 Painel......3 3 Post...4 4 Ferramentas de Post...10 5 Páginas...14 6 Ferramentas de páginas...21 7 Mídias...25 8 Links......30 1 1- TELA DE LOGIN Para ter acesso ao wordpress

Leia mais

BEM VINDOS AO DHL WEB SHIPPING GUIA DE USO

BEM VINDOS AO DHL WEB SHIPPING GUIA DE USO Envio de Remessas Online BEM VINDOS AO DHL WEB SHIPPING GUIA DE USO webshipping.dhl.com ACESSE O DHL WEB SHIPPING DE QUALQUER LUGAR DO MUNDO. Ideal para qualquer empresa com acesso à internet, o DHL Web

Leia mais

Docas do Pará - Guia de Instalação

Docas do Pará - Guia de Instalação Docas do Pará - Guia de Instalação Procedimento para instalar em um novo porto Primeiro faça a instalação no computador servidor do porto (v. abaixo), depois instale em cada máquina de cadastro/acompanhamento

Leia mais

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito) 8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito) Nos itens anteriores vimos transações do tipo explícitas, ou seja, aquelas que iniciam com BEGIN TRANSACTION. As outras

Leia mais

Série ArcGIS Online I. Aprenda em 20. Módulo 4. Configure pop-ups. www.academiagis.com.br

Série ArcGIS Online I. Aprenda em 20. Módulo 4. Configure pop-ups. www.academiagis.com.br Série ArcGIS Online I Aprenda em 20 Módulo 4 Configure pop-ups Junho/2015 academiagis@img.com.br www.academiagis.com.br 1 Configure pop-ups No módulo 3, você trabalhou com várias propriedades diferentes

Leia mais

Microsoft Access: Criar relações para um novo banco de dados. Vitor Valerio de Souza Campos

Microsoft Access: Criar relações para um novo banco de dados. Vitor Valerio de Souza Campos Microsoft Access: Criar relações para um novo banco de Vitor Valerio de Souza Campos Conteúdo do curso Visão geral: relações são essenciais Lição: inclui oito seções Tarefas práticas sugeridas Teste Cartão

Leia mais

Desenvolvendo plugins WordPress usando Orientação a Objetos

Desenvolvendo plugins WordPress usando Orientação a Objetos Desenvolvendo plugins WordPress usando Orientação a Objetos por Daniel Antunes danieldeveloper.com @danieldeveloper Introdução Desenvolver plugins WordPress é mais que programar: é obter grandes resultados

Leia mais

OCOMON PRIMEIROS PASSOS

OCOMON PRIMEIROS PASSOS OCOMON PRIMEIROS PASSOS O OCOMON ainda não possui um arquivo de Help para atender a todas questões relacionadas ao sistema. Esse arquivo serve apenas para dar as principais instruções para que você tenha

Leia mais

Manual Sistema de Autorização Online GW

Manual Sistema de Autorização Online GW Sistema de Autorização Online GW Sumário Introdução...3 Acesso ao sistema...4 Logar no sistema...4 Autorizando uma nova consulta...5 Autorizando exames e/ou procedimentos...9 Cancelamento de guias autorizadas...15

Leia mais

Perguntas frequentes do Samsung Drive Manager

Perguntas frequentes do Samsung Drive Manager Perguntas frequentes do Samsung Drive Manager Instalação P: Meu Disco Rígido Externo Samsung está conectado, mas nada está acontecendo. R: Verifique a conexão a cabo USB. Se seu Disco Rígido Externo Samsung

Leia mais

Como escrever melhor em 5 passos simples

Como escrever melhor em 5 passos simples Como escrever melhor em 5 passos simples Escrever um artigo para seu blog pode ser um processo estressante e tomar bastante tempo, especialmente se você não é um escritor. Mas quando você está determinado

Leia mais

Revisando sintaxes SQL e criando programa de pesquisa. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Revisando sintaxes SQL e criando programa de pesquisa. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Revisando sintaxes SQL e criando programa de pesquisa. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011 Edição 5 SELECT * FROM Minha_memoria Revisando Sintaxes SQL e Criando programa de Pesquisa Ano:

Leia mais

Como instalar o Ocomon passo a passo.

Como instalar o Ocomon passo a passo. Como instalar o Ocomon( Ferramenta Help Desk) passo a passo. Pessoal tudo bem? Já uso esta ferramenta há muito tempo e acho fantástica, quero compartilhar com vocês, pois ela é uma boa para quem quer gerenciar

Leia mais

Instalando o Debian em modo texto

Instalando o Debian em modo texto Instalando o Debian em modo texto Por ser composto por um número absurdamente grande de pacotes, baixar os CDs de instalação do Debian é uma tarefa ingrata. Você pode ver uma lista dos mirrors disponíveis

Leia mais

Em 2 minutos de leitura você aprenderá facilmente a: Montar seu perfil Buscar colaboradores e comunidades Utilizar recursos

Em 2 minutos de leitura você aprenderá facilmente a: Montar seu perfil Buscar colaboradores e comunidades Utilizar recursos GUIA RÁPIDO Em 2 minutos de leitura você aprenderá facilmente a: Montar seu perfil Buscar colaboradores e comunidades Utilizar recursos 1º ACESSO Em conecta.estacio.br Coloque sua senha e login (não é

Leia mais

Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua.

Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua. 7 Animação Animações é um dos quesitos muito importantes em jogos, você não acha? Para isso o JPlay tem uma classe específica para lidar com animações. Essa classe se chama Animation. Bem sugestivo o nome

Leia mais

www.marketingdigitalexpress.com.br - Versão 1.0 Página 1

www.marketingdigitalexpress.com.br - Versão 1.0 Página 1 www.marketingdigitalexpress.com.br - Versão 1.0 Página 1 Remarketing é um recurso utilizado para direcionar anúncios personalizados para as pessoas que visitaram uma determinada página do seu site ou clicaram

Leia mais

Introdução ao Processamento de Imagens com o IRIS Por Rodolfo Barros

Introdução ao Processamento de Imagens com o IRIS Por Rodolfo Barros Introdução ao Processamento de Imagens com o IRIS Por Rodolfo Barros O IRIS é um software poderoso para o processamento de imagens astronômicas. Ele possui métodos avançados para realizar uma grande quantidade

Leia mais