O documento discute testes e refatoração de código em Python. Ele apresenta um caso de estudo de um módulo de diárias e passagens, discute como começar a testar e refatorar de forma segura, conceitos de teste de software, dicas para testar e refatorar, e exemplos de testes em Django.
Ensinando a programar através do Python turtle graphicsGuilherme Medeiros
O documento discute como ensinar programação para crianças e iniciantes usando o módulo Turtle do Python. Ele introduz o Turtle Graphics e mostra comandos básicos como movimentar e desenhar com a tartaruga. Também aborda conceitos como variáveis, loops e procedimentos de forma simples e passo a passo para manter o aprendizado divertido.
O documento descreve os principais conceitos e métodos relacionados a objetos do tipo Array no JavaScript, incluindo: 1) Arrays podem armazenar dados de diferentes tipos e serem acessados por índice; 2) Vários métodos úteis como push, pop, slice, sort, entre outros; 3) É possível criar matrizes multidimensionais no JavaScript usando arrays aninhados.
Having a reliable test suite is incredibly useful when making changes to an existing codebase, both big and small. Mutation testing frameworks run tests against slightly-changed source code in order to detect whether the tests are actually checking the different paths of logic through the application. The aim is to improve the robustness of your test suite, and give you confidence that you aren't introducing any unintended changes.
This presentation gives an overview of mutation testing, along with worked examples in JavaScript of how it catches gaps and improves test coverage.
Vetores são variáveis compostas homogêneas unidimensionais que armazenam dados do mesmo tipo em posições sequenciais na memória. Vetores em C são declarados com colchetes após o nome da variável, indicando o tamanho, e os índices das posições começam em 0. Os valores são atribuídos e acessados usando o índice da posição correspondente.
O documento explica o que são matrizes, como são compostas por linhas e colunas com vetores dentro de vetores, e ensina a identificar posições dentro de uma matriz em linguagem C, onde as linhas e colunas iniciam em zero. É mostrado também como declarar, criar e exibir elementos de uma matriz, bem como realizar operações nela usando laços de repetição. São fornecidos três exercícios para praticar o assunto.
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
Aula 2 da disciplina Programação Orientada a Objetos, onde é apresentando o conceito inicial da linguagem JAVA, que será a base da aplicação prática na disciplina.
O documento discute grafos e sua representação em computação. Ele define grafos, apresenta conceitos básicos como vértices, arestas e grau. Também descreve tipos de grafos como completos, regulares e ponderados. Por fim, aborda formas de representar grafos no computador como matriz e lista de adjacência.
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaLeinylson Fontinele
A aula discute alocação dinâmica de memória, onde espaço na memória pode ser alocado durante a execução do programa conforme a necessidade. As funções malloc, calloc e realloc permitem alocar memória dinamicamente, retornando ponteiros para o espaço alocado. Matrizes podem ser alocadas usando ponteiros para ponteiros, onde cada nível do ponteiro cria uma nova dimensão na matriz.
Ensinando a programar através do Python turtle graphicsGuilherme Medeiros
O documento discute como ensinar programação para crianças e iniciantes usando o módulo Turtle do Python. Ele introduz o Turtle Graphics e mostra comandos básicos como movimentar e desenhar com a tartaruga. Também aborda conceitos como variáveis, loops e procedimentos de forma simples e passo a passo para manter o aprendizado divertido.
O documento descreve os principais conceitos e métodos relacionados a objetos do tipo Array no JavaScript, incluindo: 1) Arrays podem armazenar dados de diferentes tipos e serem acessados por índice; 2) Vários métodos úteis como push, pop, slice, sort, entre outros; 3) É possível criar matrizes multidimensionais no JavaScript usando arrays aninhados.
Having a reliable test suite is incredibly useful when making changes to an existing codebase, both big and small. Mutation testing frameworks run tests against slightly-changed source code in order to detect whether the tests are actually checking the different paths of logic through the application. The aim is to improve the robustness of your test suite, and give you confidence that you aren't introducing any unintended changes.
This presentation gives an overview of mutation testing, along with worked examples in JavaScript of how it catches gaps and improves test coverage.
Vetores são variáveis compostas homogêneas unidimensionais que armazenam dados do mesmo tipo em posições sequenciais na memória. Vetores em C são declarados com colchetes após o nome da variável, indicando o tamanho, e os índices das posições começam em 0. Os valores são atribuídos e acessados usando o índice da posição correspondente.
O documento explica o que são matrizes, como são compostas por linhas e colunas com vetores dentro de vetores, e ensina a identificar posições dentro de uma matriz em linguagem C, onde as linhas e colunas iniciam em zero. É mostrado também como declarar, criar e exibir elementos de uma matriz, bem como realizar operações nela usando laços de repetição. São fornecidos três exercícios para praticar o assunto.
Aula 2 - POO: Fundamentos da linguagem JavaDaniel Brandão
Aula 2 da disciplina Programação Orientada a Objetos, onde é apresentando o conceito inicial da linguagem JAVA, que será a base da aplicação prática na disciplina.
O documento discute grafos e sua representação em computação. Ele define grafos, apresenta conceitos básicos como vértices, arestas e grau. Também descreve tipos de grafos como completos, regulares e ponderados. Por fim, aborda formas de representar grafos no computador como matriz e lista de adjacência.
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaLeinylson Fontinele
A aula discute alocação dinâmica de memória, onde espaço na memória pode ser alocado durante a execução do programa conforme a necessidade. As funções malloc, calloc e realloc permitem alocar memória dinamicamente, retornando ponteiros para o espaço alocado. Matrizes podem ser alocadas usando ponteiros para ponteiros, onde cada nível do ponteiro cria uma nova dimensão na matriz.
Kotlin delegates in practice - Kotlin Everywhere StockholmFabio Collini
The lazy delegate is probably the most famous Kotlin delegate, it’s easy to use and can be really useful. However delegation is a concept that can be used in many other ways in Kotlin. A delegate can be declared at two levels:
* a delegated property allows changing the way the property is managed
* an interface can be implemented delegating the methods to another object
In this talk we’ll see many practical examples to show how to leverage standard delegates and how to create new ones to improve the quality of our code and to avoid duplication.
O documento resume os padrões de projeto GRASP (General Responsability Assignment Software Patterns) e GoF (Gang of Four). GRASP descreve princípios para atribuir responsabilidades a classes e objetos em projetos orientados a objetos. GoF classifica padrões de projeto em criacionais, estruturais e comportamentais.
O documento apresenta uma introdução à tabela hash, estrutura de dados que permite acesso rápido a elementos através de uma função de hash que mapeia chaves para índices de um array. A tabela hash permite busca em tempo constante O(1) através da função de hash, ao contrário de buscas sequenciais em arrays normais. Apresenta também aplicações como busca em bancos de dados, criptografia e compilação.
Este documento fornece um resumo das atividades e serviços oferecidos pela Qualister, uma empresa especializada em testes e qualidade de software. Em três frases ou menos, o documento descreve que a Qualister oferece terceirização de profissionais de teste, consultoria em teste, avaliação de usabilidade e treinamentos em teste e qualidade de software.
Uma tabela hash é uma estrutura de dados que associa chaves de pesquisa a valores de forma rápida, utilizando uma função hash para calcular a posição de armazenamento. Tabelas hash resolvem o problema de busca em arrays, permitindo acesso em O(1). Colisões podem ocorrer quando chaves diferentes geram a mesma posição, e técnicas como encadeamento lidam com isso.
Este documento apresenta os conceitos fundamentais de variáveis do tipo ponteiro em C. Em 3 frases:
1) Ponteiros armazenam endereços de memória de outras variáveis e podem ser usados para acessar e modificar seus valores. 2) Operações como incremento, decremento e aritmética permitem navegar entre posições de memória usando ponteiros. 3) Ponteiros também podem apontar para estruturas, permitindo acessar e modificar seus campos.
A aula apresenta os conceitos fundamentais da Web 2.0, incluindo sua evolução, tecnologias e mercado de trabalho. Aborda tópicos como modelo de desenvolvimento em camadas, padrões da W3C e linguagens como HTML, CSS e JavaScript.
Collections fornece classes para estruturas de dados como listas, conjuntos e mapas. Listas mantêm uma ordem e permitem elementos duplicados. Conjuntos não permitem duplicados e não garantem ordem. Mapas mapeiam chaves para valores.
O documento discute o desenvolvimento web front-end e back-end com JavaScript. Apresenta o professor Erick Petrucelli e sua experiência com desenvolvimento web fullstack usando JavaScript desde 2011. Explica como front-end e back-end estão mais próximos do que nunca, com JavaScript sendo usado em ambos os lados para programação, regras de negócio e comunicação com bancos de dados.
O documento apresenta uma introdução sobre ponteiros em C, definindo-os como variáveis que armazenam endereços de memória e explicando como eles permitem a manipulação dinâmica de estruturas de dados. Os principais pontos apresentados são: (1) ponteiros permitem simular passagem por referência e criar estruturas dinâmicas; (2) ponteiros armazenam endereços de memória ao invés de valores; (3) os operadores & e * são usados para obter endereços e valores apontados.
O documento discute coleções em Java, definindo-as como estruturas de dados que armazenam objetos. Apresenta os principais tipos de coleções: listas, conjuntos e mapas, descrevendo suas características e operações básicas como adição, remoção e acesso a elementos. Fornece também detalhes sobre classes e interfaces de coleções no Java.
O documento apresenta uma introdução à engenharia de requisitos, discutindo seus objetivos, tipos de requisitos, problemas comuns, e a importância do processo. Também explica como a engenharia de requisitos se encaixa no processo maior da engenharia de sistemas.
O documento discute recursividade e apresenta alguns conceitos e exemplos. Em três frases:
A recursividade é uma forma de resolver problemas dividindo-os em subproblemas menores da mesma natureza até chegar a um caso trivial. Isso é ilustrado com exemplos como o cálculo fatorial e a multiplicação usando somas sucessivas. A implementação de funções recursivas no computador usa uma pilha de execução para gerenciar os chamados recursivos.
O documento descreve um curso de Java com as seguintes partes: estruturas da linguagem, classes wrappers, operadores relacionais e lógicos, estruturas de decisão, estruturas de repetição, coleções List e Map. O documento fornece exemplos de uso dessas estruturas da linguagem Java.
No slide que foi utilizado como forma avaliativa durante o 1º ano do meu Ensino Médio no IFPA (2-2017/1-2018) , foi abordado sobre o Diagrama de perfil e estruturas compostas
O documento apresenta um resumo sobre Java, incluindo: (1) Uma introdução sobre o que é Java e sua história; (2) As vantagens da linguagem como portabilidade, compatibilidade e reuso; (3) Uma breve explicação sobre como funcionam os programas em Java.
O documento apresenta uma introdução às principais estruturas de dados em Python, incluindo listas, tuplas, dicionários, pilhas, filas e árvores. Explica os conceitos básicos por trás de cada estrutura de dados e como implementá-las usando Python.
O documento compara as sintaxes de programação entre Portugol e Java, destacando as semelhanças e diferenças nos blocos, variáveis, operadores lógicos, estruturas de decisão e repetição.
1) O documento discute pseudocódigo, apresentando sua estrutura básica, notação, comandos como declaração de variáveis, atribuição, entrada e saída de dados.
2) É apresentado um exemplo de algoritmo para calcular a média de duas notas e realizar testes em tabelas.
3) Exercícios são propostos para fixar conceitos e aplicar pseudocódigo na resolução de problemas.
O documento descreve uma série de aulas sobre lógica de programação. A primeira aula apresenta introduções e jogos lógicos. A segunda aula define algoritmos e apresenta exemplos. As aulas subsequentes discutem estruturas de algoritmos, variáveis, operadores, estruturas de decisão e repetição.
Este documento discute refatoração de código Python. Ele explica que refatoração significa alterar o código sem alterar sua funcionalidade externa, como remover duplicação, melhorar coesão e design. Também destaca que refatoração é importante para manter o software funcionando bem ao longo do tempo e torná-lo mais legível. Além disso, apresenta algumas técnicas comuns de refatoração como extract method, extract class e decompose conditional.
Kotlin delegates in practice - Kotlin Everywhere StockholmFabio Collini
The lazy delegate is probably the most famous Kotlin delegate, it’s easy to use and can be really useful. However delegation is a concept that can be used in many other ways in Kotlin. A delegate can be declared at two levels:
* a delegated property allows changing the way the property is managed
* an interface can be implemented delegating the methods to another object
In this talk we’ll see many practical examples to show how to leverage standard delegates and how to create new ones to improve the quality of our code and to avoid duplication.
O documento resume os padrões de projeto GRASP (General Responsability Assignment Software Patterns) e GoF (Gang of Four). GRASP descreve princípios para atribuir responsabilidades a classes e objetos em projetos orientados a objetos. GoF classifica padrões de projeto em criacionais, estruturais e comportamentais.
O documento apresenta uma introdução à tabela hash, estrutura de dados que permite acesso rápido a elementos através de uma função de hash que mapeia chaves para índices de um array. A tabela hash permite busca em tempo constante O(1) através da função de hash, ao contrário de buscas sequenciais em arrays normais. Apresenta também aplicações como busca em bancos de dados, criptografia e compilação.
Este documento fornece um resumo das atividades e serviços oferecidos pela Qualister, uma empresa especializada em testes e qualidade de software. Em três frases ou menos, o documento descreve que a Qualister oferece terceirização de profissionais de teste, consultoria em teste, avaliação de usabilidade e treinamentos em teste e qualidade de software.
Uma tabela hash é uma estrutura de dados que associa chaves de pesquisa a valores de forma rápida, utilizando uma função hash para calcular a posição de armazenamento. Tabelas hash resolvem o problema de busca em arrays, permitindo acesso em O(1). Colisões podem ocorrer quando chaves diferentes geram a mesma posição, e técnicas como encadeamento lidam com isso.
Este documento apresenta os conceitos fundamentais de variáveis do tipo ponteiro em C. Em 3 frases:
1) Ponteiros armazenam endereços de memória de outras variáveis e podem ser usados para acessar e modificar seus valores. 2) Operações como incremento, decremento e aritmética permitem navegar entre posições de memória usando ponteiros. 3) Ponteiros também podem apontar para estruturas, permitindo acessar e modificar seus campos.
A aula apresenta os conceitos fundamentais da Web 2.0, incluindo sua evolução, tecnologias e mercado de trabalho. Aborda tópicos como modelo de desenvolvimento em camadas, padrões da W3C e linguagens como HTML, CSS e JavaScript.
Collections fornece classes para estruturas de dados como listas, conjuntos e mapas. Listas mantêm uma ordem e permitem elementos duplicados. Conjuntos não permitem duplicados e não garantem ordem. Mapas mapeiam chaves para valores.
O documento discute o desenvolvimento web front-end e back-end com JavaScript. Apresenta o professor Erick Petrucelli e sua experiência com desenvolvimento web fullstack usando JavaScript desde 2011. Explica como front-end e back-end estão mais próximos do que nunca, com JavaScript sendo usado em ambos os lados para programação, regras de negócio e comunicação com bancos de dados.
O documento apresenta uma introdução sobre ponteiros em C, definindo-os como variáveis que armazenam endereços de memória e explicando como eles permitem a manipulação dinâmica de estruturas de dados. Os principais pontos apresentados são: (1) ponteiros permitem simular passagem por referência e criar estruturas dinâmicas; (2) ponteiros armazenam endereços de memória ao invés de valores; (3) os operadores & e * são usados para obter endereços e valores apontados.
O documento discute coleções em Java, definindo-as como estruturas de dados que armazenam objetos. Apresenta os principais tipos de coleções: listas, conjuntos e mapas, descrevendo suas características e operações básicas como adição, remoção e acesso a elementos. Fornece também detalhes sobre classes e interfaces de coleções no Java.
O documento apresenta uma introdução à engenharia de requisitos, discutindo seus objetivos, tipos de requisitos, problemas comuns, e a importância do processo. Também explica como a engenharia de requisitos se encaixa no processo maior da engenharia de sistemas.
O documento discute recursividade e apresenta alguns conceitos e exemplos. Em três frases:
A recursividade é uma forma de resolver problemas dividindo-os em subproblemas menores da mesma natureza até chegar a um caso trivial. Isso é ilustrado com exemplos como o cálculo fatorial e a multiplicação usando somas sucessivas. A implementação de funções recursivas no computador usa uma pilha de execução para gerenciar os chamados recursivos.
O documento descreve um curso de Java com as seguintes partes: estruturas da linguagem, classes wrappers, operadores relacionais e lógicos, estruturas de decisão, estruturas de repetição, coleções List e Map. O documento fornece exemplos de uso dessas estruturas da linguagem Java.
No slide que foi utilizado como forma avaliativa durante o 1º ano do meu Ensino Médio no IFPA (2-2017/1-2018) , foi abordado sobre o Diagrama de perfil e estruturas compostas
O documento apresenta um resumo sobre Java, incluindo: (1) Uma introdução sobre o que é Java e sua história; (2) As vantagens da linguagem como portabilidade, compatibilidade e reuso; (3) Uma breve explicação sobre como funcionam os programas em Java.
O documento apresenta uma introdução às principais estruturas de dados em Python, incluindo listas, tuplas, dicionários, pilhas, filas e árvores. Explica os conceitos básicos por trás de cada estrutura de dados e como implementá-las usando Python.
O documento compara as sintaxes de programação entre Portugol e Java, destacando as semelhanças e diferenças nos blocos, variáveis, operadores lógicos, estruturas de decisão e repetição.
1) O documento discute pseudocódigo, apresentando sua estrutura básica, notação, comandos como declaração de variáveis, atribuição, entrada e saída de dados.
2) É apresentado um exemplo de algoritmo para calcular a média de duas notas e realizar testes em tabelas.
3) Exercícios são propostos para fixar conceitos e aplicar pseudocódigo na resolução de problemas.
O documento descreve uma série de aulas sobre lógica de programação. A primeira aula apresenta introduções e jogos lógicos. A segunda aula define algoritmos e apresenta exemplos. As aulas subsequentes discutem estruturas de algoritmos, variáveis, operadores, estruturas de decisão e repetição.
Este documento discute refatoração de código Python. Ele explica que refatoração significa alterar o código sem alterar sua funcionalidade externa, como remover duplicação, melhorar coesão e design. Também destaca que refatoração é importante para manter o software funcionando bem ao longo do tempo e torná-lo mais legível. Além disso, apresenta algumas técnicas comuns de refatoração como extract method, extract class e decompose conditional.
Gary Stockard is seeking a position that utilizes his technical and business experience accumulated over his career. He has a Master's in Business Administration and a Bachelor's in Business Administration. He has various professional designations and technical skills including COBOL, Microsoft Office, SQL, and .NET. His experience includes roles as a software development advisor, senior developer, senior associate, and various programmer roles at insurance companies supporting applications in COBOL, IMS, SQL Server, and .NET.
10 facts about the adult bullying mindsetNathan Segal
This document discusses facts about adult bullying mindsets and abusive relationships. It notes that bullies will use any slight to weaponize victims, are convincing liars who manipulate others, and form alliances to attain their aims. The purpose of bullies is to cause psychological damage. Workplace bullies often cause their targets to leave their jobs. To recover from bullying trauma, the bully must be removed from one's life, though some may require additional coaching to overcome lingering effects like post-traumatic stress. Abusive relationships are often prolonged by hopes of improvement, fear of being unable to find another partner, and fear of the unknown. Leaving is necessary to recover from trauma.
This document provides Angela Tomas' architecture portfolio from 2017. It includes information about her education and qualifications, professional experience, skills, and academic and professional projects. Some of her academic projects featured are a hybrid building in Loja, hospital rehabilitation in Granada, and an eco-hotel in Timisoara, Romania. Her professional projects included monitoring a sculpture museum construction in Exfiliana, designing a Spanish restaurant with virtual reality in New York, drafting plans for a multifunctional center in Jayena, and overseeing construction of a house of culture in La Calahorra.
Dr. Gamal Mohamed El-Maghrabi Mohamed is an Egyptian occupational health and safety consultant and trainer. He has a B.Sc in Geology from Alexandria University, and postgraduate qualifications in Public Health Sciences, Occupational Hygiene, and Environmental Health from the High Institute of Public Health at Alexandria University. He has over 20 years of experience in workplace inspections, hazard assessments, accident investigations, and safety training. He has held positions in Egypt and Saudi Arabia focused on occupational health and safety.
Ashley Vander Veen has over 10 years of experience in executive assistance, administrative support, and security roles. She currently works as an Executive Assistant and Facilities Security Officer for Zeltech Training Solutions, where she oversees security programs and provides administrative support. Prior to this, she worked as an Administrative Assistant and Bank Teller. She has a high school diploma and some college coursework completed.
Sistemas distribuídos possuem características como comunicação, distribuição, complexidade e heterogeneidade. Existem diferentes modelos arquiteturais como cliente-servidor, peer-to-peer e objetos distribuídos. Infraestruturas de software como sistemas operacionais distribuídos, sistemas operacionais de rede e middleware fornecem serviços para esconder a complexidade dos sistemas distribuídos.
The document discusses the conventions used in horror genre media products and whether the student's media product met these conventions. It addresses conventions related to genre, institutions, forms, and technical elements. The student believes their opening sequence met many conventions such as using social issues, mystery, realism, and vulnerable female victims. They also note ways they could have improved, such as adding more unrealism or subtle foreshadowing.
Este documento introduz os sistemas distribuídos, definindo-os como um conjunto de computadores independentes que aparecem para os usuários como um único sistema coerente. Explora as motivações, características e tipos de sistemas distribuídos, incluindo clusters, supercomputadores, grids, sistemas pervasivos e nuvem.
O documento apresenta uma introdução sobre sistemas distribuídos, definindo-os como sistemas nos quais os componentes de hardware ou software se comunicam através de mensagens. Apresenta também as consequências da definição, como concorrência e inexistência de relógio global, e exemplos como a Internet e intranets. Por fim, descreve desafios na implementação de sistemas distribuídos, como heterogeneidade, segurança, escalabilidade e tratamento de falhas.
El documento habla sobre la importancia de cuidar el agua debido a que los expertos aseguran que los recursos hídricos son limitados y que debido al calentamiento global y la contaminación, especies están desapareciendo y los océanos se están inundando. Si no cambiamos nuestros hábitos de desperdiciar agua, pronto puede haber guerras por el agua.
Este documento define diferentes tipos de reservas hoteleras como reservas tentativas, reservas con límite de tiempo, reservas garantizadas con depósito, y reservas de grupos. También describe el proceso de reserva manual que incluye recopilar información del huésped como nombre, fecha de llegada y salida, y número de habitación. Además, explica que cuando se confirma una reserva se envía una confirmación por correo electrónico al cliente e incluye detalles como la dirección, el precio y la política de cancelación.
Victor Hugo Germano apresenta, na casa CTAI Senai SC um curso de formação entitulado: Teste de Software.
Chamando para uma discussão a respeito de nosso papel dentro do desenvolvimento de software, são apresentados conceitos relacionados à area de teste de software, assim como apresentada sua visão de como um modelo de testes deve estar vinculado ao desenvolvimento.
O documento discute testes de software, apresentando conceitos como objetivos de teste de software, frameworks xUnit e PHPUnit. Também fornece exemplos de código PHP para testes de unidade usando PHPUnit.
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
Este documento fornece dicas sobre como testar aplicações Django de forma efetiva. Ele discute a importância de testes e como testar as principais partes de uma aplicação Django, incluindo views, forms e models. Além disso, fornece exemplos de código de teste e sugere ferramentas como o TestClient do Django e o model_mommy para ajudar a escrever bons testes automatizados.
Como usar a biblioteca SimpleTest do PHP para ganhar tempo resolvendo os problemas mas simples do dia-a-dia. Essa apresentação foi elaborada para o PHPConference2008 que aconteceu em Osasco, SP Brasil.
Atividades de Teste e Cobertura de Código em Javaaceiro
Erik Aceiro Antonio apresenta suas credenciais e experiência em testes de software e cobertura de código. Ele possui graduação em Ciência da Computação, mestrado em Engenharia Elétrica e está cursando doutorado em Ciência da Computação. Seu foco é no teste de software para sistemas embarcados críticos.
Este documento fornece uma introdução sobre testes de software, com foco nos testes funcionais em times ágeis. Apresenta conceitos como qualidade, garantia da qualidade versus controle da qualidade, níveis e tipos de teste, técnicas de teste como análise de valor limite, particionamento por equivalência e tabelas de decisão. Também discute validação versus verificação, desenho de testes, cenários e casos de teste. Por fim, aborda técnicas ágeis como teste exploratório.
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
Minicurso ministrado na XII SemanaTI na UNIVEM - Marília/SP, nos dias 23 e 24 de setembro de 2019. O título do minicurso é Técnicas de Teste e Automatização do Teste de Unidade e o minicurso tratava na teoria sobre algumas técnicas de Teste de Software, bem como a Técnica de Teste Estrutural, Teste Funcional e Teste Baseado em Defeitos, assim como aprendemos sobre a fase do Teste de Unidade, e ali, aplicamos na prática a Técnica de Teste Estrutural e tratamos sobre a teoria e a prática da automação de testes.
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
O documento discute testes de software e desenvolvimento orientado a testes (TDD). Ele apresenta os principais tópicos: 1) razões para testar software e automatizar testes; 2) tipos de testes como unitários e de integração; 3) os princípios e benefícios do TDD; 4) um exemplo prático de implementação de testes unitários usando TDD.
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
O documento discute testes de software com PHPUnit, enfatizando a importância de testes unitários, integração contínua e desenvolvimento orientado a testes. Apresenta o framework PHPUnit e demonstra como criar e organizar testes para validar o código.
O documento discute a importância dos testes de unidade e apresenta a ferramenta JUnit para automatizar testes de unidade. Ele também fornece boas e más práticas para escrever testes de unidade e cobre tópicos como as anotações @Test, @Before, @After e @Rule do JUnit.
O documento apresenta conceitos básicos de teste de software, incluindo suas fases, técnicas e critérios. Discute a importância do teste para encontrar erros, apresenta exemplos de bugs caros, e aborda desafios como novos paradigmas de programação. Explica as fases de teste de unidade, integração e regressão, e as técnicas funcionais como particionamento em classes de equivalência e análise de valor limite para gerar casos de teste.
O documento discute técnicas e estratégias para testes de software, enfatizando a importância de: 1) testar o código sistematicamente durante o desenvolvimento, 2) verificar limites e pré-condições, e 3) automatizar testes para validação contínua e prevenção de regressões.
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
Este documento fornece padrões e técnicas para desenvolvimento de software guiado por testes, incluindo escrever testes primeiro, usar dados de teste realistas, e isolar testes. Os padrões ajudam a responder perguntas como quanto testar e como escolher o que testar.
O documento discute as vantagens de testes automatizados e desenvolvimento guiado por testes (TDD) para projetos Django. Apresenta diversas ferramentas para teste em Django como nose, django-nose e django-test-utils e discute técnicas como testes unitários, de integração e de regressão. Defende que testes automatizados trazem tranquilidade para refatoração e que TDD, apesar de inicialmente lento, torna-se mais rápido com o tempo.
Workshop: Testes automatizados, Refactoring e Design PatternsMauricio Andreazza
O documento resume um workshop sobre testes automatizados, refactoring e design patterns. O workshop foi apresentado por dois desenvolvedores e abordou tópicos como a pirâmide de testes, teste de unidade, refactoring utilizando padrões como extrair método e extrair classe.
O documento discute a área de testes de software, incluindo os papéis de um profissional de testes, os tipos de testes realizados durante o ciclo de vida do software, e as certificações mais valorizadas na área, como a CTFL. O documento também conta a história de dois testadores, um mais dedicado que o outro, para ilustrar a importância dos conhecimentos técnicos para o crescimento na carreira.
Getna: Gerador de Código RubyOnRails apartir de banco de dadosMaximusmano
Minha proposta era fazer um projeto Open Source de um Gerador Rails que apartir de um Banco de dados gera-se toda a estrutura inicial de um Projeto Rails
Semelhante a Testes com python: como fazer uma refatoração segura (20)
A linguagem C# aproveita conceitos de muitas outras linguagens,
mas especialmente de C++ e Java. Sua sintaxe é relativamente fácil, o que
diminui o tempo de aprendizado. Todos os programas desenvolvidos devem
ser compilados, gerando um arquivo com a extensão DLL ou EXE. Isso torna a
execução dos programas mais rápida se comparados com as linguagens de
script (VBScript , JavaScript) que atualmente utilizamos na internet
As classes de modelagem podem ser comparadas a moldes ou
formas que definem as características e os comportamentos dos
objetos criados a partir delas. Vale traçar um paralelo com o projeto de
um automóvel. Os engenheiros definem as medidas, a quantidade de
portas, a potência do motor, a localização do estepe, dentre outras
descrições necessárias para a fabricação de um veículo
7. 7
Meu Objetivo
Aplicar melhorias em um sistema que
já está em produção.
Situação
Possui uma lista com novos requisitos
Não possui nenhum teste
Possui manual de usuário
10. 10
Testar e refatorar, como fazer?
O que testar e o que não testar?
Qual tipo de testes usar?
11. 11
Por onde começar?
Tenha um objetivo bem definido
Verifique se o módulo possui documentação
Faça um teste exploratório nas principais funcionalidades
Estude sobre refatoração
13. 13
O que é teste de software?
Os testes são realizados com a intenção de descobrir defeitos
em um sistema. [Myres, 2004]
Os testes de software podem ser usados para mostrar a
presença de defeitos, mas nunca para mostrar a ausência
deles. [Dijkstra, 1972]
15. 15
Práticas que poderiam ajudar?
Fonte: http://www.aniche.com.br/tdd/
TDD -
Test Driven Development
- Escrever o teste antes de
codificar
16. 16
Requisitos -
Regras de negócio -
Segurança -
Permissões de usuários -
- Framework
- Métodos nativos
- Requisitos com baixo valor
de negócio**
O que testar e o que não testar?
17. 17
Dicas
- Comece pelo mais simples!
- Evolua os testes gradativamente
- As vezes será necessário reorganizar os testes
- Teste o fluxo principal
- Teste a(s) funcionalidade(s) mais importante(s)
18. 18
Exemplos: teste funcional básico
from django.test import TestCase
class HomologadorTestCase(TestCase):
def test_pagina_inicial(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, u"Título da página")
$ ./manage.py test expedicao
19. 19
Exemplos: afirmações
- assertEqual(a, b) # a == b
- assertNotEqual(a, b) # a <> b
- assertTrue(bool) # True
- assertFalse(bool) # False
- assertRaises(Exception) # raise Exception
- assertIn(a, b) # a in b
- assertNotIn(a, b) # a not in b
- assertGreater(a, b) # a > b
- assertLess(a, b) # a < b
20. 20
Exemplos: teste no Suap
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def test_pode_ver_aba_homologador(self):
self.logout()
successful = self.client.login(username=self.user.username, password='123')
self.assertEqual(successful, True)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
21. 21
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def test_pode_ver_aba_homologador(self):
self.logout()
successful = self.client.login(username=self.user.username, password='123')
self.assertEqual(successful, True)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
22. 22
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
self.logout()
successful = self.client.login(username=user.username, password='123')
self.assertEqual(successful, True)
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
23. 23
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
self.logout()
successful = self.client.login(username=user.username, password='123')
self.assertEqual(successful, True)
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
24. 24
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
25. 25
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
url = "/admin/expedicao/viagemservidor/"
response = self.client.get(url, follow=True)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no SuapChangelist {{ app_label }}_{{ model_name }}_changelist
Add {{ app_label }}_{{ model_name }}_add /add
History {{ app_label }}_{{ model_name }}_history /id/history
Delete {{ app_label }}_{{ model_name }}_delete /id/delete
Change {{ app_label }}_{{ model_name }}_change /id
'expedicao_viagemservidor_changelist'
'/admin/expedicao/viagemservidor/'
26. 26
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
def get_changelist_page(cls):
...
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
response = self.get_changelist_page(models.ViagemServidor)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
27. 27
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
def get_changelist_page(cls):
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
response = self.get_changelist_page(models.ViagemServidor)
self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
28. 28
from django.test import TestCase
class SuapTestCase(TestCase):
class ExpedicaoTestCase(SuapTestCase):
class HomologadorTestCase(ExpedicaoTestCase):
def acessar_como(self, user):
def get_changelist_page(cls):
def test_pode_ver_aba_homologador(self):
self.acessar_como(self.homologador)
response = self.get_changelist_page(models.ViagemServidor)
self.assertContains(response, u"tab_viagens_homologar")
# self.logout()
# successful = self.client.login(username=self.user.username, password='123')
# self.assertEqual(successful, True)
# url = "/admin/expedicao/viagemservidor/"
# response = self.client.post(url, follow=True)
# self.assertContains(response, u"tab_viagens_homologar")
Exemplos: teste no Suap
30. 30
Refatorar é…
um processo disciplinado de alterar o código de um
sistema sem alterar o seu comportamento observável
buscando melhorar a estrutura interna e minimizando a
chance de introdução de novas falhas.
(Martin Fowler, Kent Beck)
Exige experiência e envolve uma grande
responsabilidade.
31. 31
Refatorar não é…
Alterar o código adicionando novos recursos
Reescrever ou substituir grande partes do código
32. 32
Etapas
1. Detecção de oportunidades de refactoring
2. Decisão do Uso (custos e benefícios)
3. Preparação da avaliação
4. Execução de um dado refactoring
5. Avaliação
33. 33
Etapa 1: Detecção de oportunidades de refactoring
Code smell
é como se aquele trecho de código cheirasse e você sabe
que precisa ser refatorado
Problemas mais comuns
código duplicado | método longo | classes grandes
comandos switch | campo temporário
classe ociosa | comentários
pylint
34. 34
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Comentário longo.
- Comentário desnecessário.
- Comentário não condiz com o objetivo do método.
- Imports não utilizados.
- Método/código duplicado comum.utils.get_funcionario.
- Linhas com mais de 80 caracteres.
- Método muito extenso.
- Número mágico.
- Nome muito grande para uma variável (23 caracteres).
35. 35
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Comentário longo.
- Comentário desnecessário.
- Comentário não condiz com o objetivo do método.
- Imports não utilizados.
- Método/código duplicado comum.utils.get_funcionario.
- Linhas com mais de 80 caracteres.
- Método muito extenso.
- Número mágico.
- Nome muito grande para uma variável (23 caracteres).
# Cria o relatório referente a esta viagem
relatorio = RelatorioViagem(viagem=viagem)
relatorio.save()
36. 36
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Comentário longo.
- Comentário desnecessário.
- Comentário não condiz com o objetivo do método.
- Imports não utilizados.
- Método/código duplicado comum.utils.get_funcionario.
- Linhas com mais de 80 caracteres.
- Método muito extenso.
- Número mágico.
- Nome muito grande para uma variável (23 caracteres).
if (data.isoweekday() >= 6):
37. 37
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Comentário longo.
- Comentário desnecessário.
- Comentário não condiz com o objetivo do método.
- Imports não utilizados.
- Método/código duplicado comum.utils.get_funcionario.
- Linhas com mais de 80 caracteres.
- Método muito extenso.
- Número mágico.
- Nome muito grande para uma variável (23 caracteres).
SABADO, DOMINGO = 6, 7
if data.isoweekday() in [SABADO, DOMINGO]:
38. 38
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Aquivo não tem limitador de extensão nem de tamanho.
- Extrair consulta para um método.
- Nomenclatura não exite mais.
- Condições complexas demais. Substituir por método:
is_empty(nome_campo).
- Substituir condições negativas por uma afirmativas.
39. 39
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Aquivo não tem limitador de extensão nem de tamanho.
- Extrair consulta para um método.
- Nomenclatura não exite mais.
- Condições complexas demais. Substituir por método:
is_empty(nome_campo).
- Substituir condições negativas por uma afirmativas.
arquivo = models.FileField(
upload_to='/comprovantes/',
verbose_name=u'Comprovante')
40. 40
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Aquivo não tem limitador de extensão nem de tamanho.
- Extrair consulta para um método.
- Nomenclatura não exite mais.
- Condições complexas demais. Substituir por método:
is_empty(nome_campo).
- Substituir condições negativas por uma afirmativas.
arquivo = models.FileField(
upload_to='/comprovantes/',
verbose_name=u'Comprovante',
help_text=u'Tamanho máximo 2MB.',
validators=[FileValidator()])
41. 41
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Aquivo não tem limitador de extensão nem de tamanho.
- Extrair consulta para um método.
- Nomenclatura não exite mais.
- Condições complexas demais. Substituir por método:
is_empty(nome_campo).
- Substituir condições negativas por uma afirmativas.
historico = HistoricoSolicitacao.objects.
filter(viagem=self).
order_by('-data').
all()[0]
historico = self.historicos.latest('data')
42. 42
Exemplos: detecção dos pontos de melhoria
# TODO refactory:
- Aquivo não tem limitador de extensão nem de tamanho.
- Extrair consulta para um método.
- Nomenclatura não exite mais.
- Condições complexas demais. Substituir por método:
is_empty(nome_campo).
- Substituir condições negativas por uma afirmativas.
def ultimo_historico():
return self.historicos.latest('data')
historico = ultimo_historico()
43. 43
Etapa 2: Decisão do Uso (custos e benefícios)
Custos e benefícios
Tempo e esforço necessários valerão a pena?
Decisão não automatizada
Código duplicado:
Extrair Método, Extrair Classe, Subir Método na
Hierarquia ou Substituir Algoritmo
44. 44
Etapa 3: Preparação da avaliação
Desenvolver testes
Garantir que o comportamento do sistema seja mantido
Decidir qual tipo de testes
Testes funcionais
Caixa preta
45. 45
Dicas
Crie grupos de funções que deseja testar
- perfil de usuário (testar acesso e negação de acesso)
- fluxo de negócio
- regras de negócio (validações)
46. 46
Exemplos: Preparação da avaliação
class ExpedicaoTestCase(SuapTestCase):
Testes Tempo
class AdministradorTestCase(ExpedicaoTestCase): | 4 | 00:00:38 |
class ExecutorTestCase(ExpedicaoTestCase): | 4 | 00:00:02 |
class HomologadorTestCase(ExpedicaoTestCase): | 1 | 00:00:00 |
class AutorizadorUOTestCase(ExpedicaoTestCase): | 2 | 00:00:01 |
class ChefeTestCase(ExpedicaoTestCase): | 5 | 00:00:03 |
class SubstitutoTestCase(ExpedicaoTestCase): | 4 | 00:00:03 |
class ViagemServidorTestCase(ExpedicaoTestCase): | 14 | 00:00:11 |
class RelatorioViagemTestCase(ExpedicaoTestCase):| 7 | 00:00:09 |
TOTAL: 41 | 00:01:12 |
Cobertura 72%
$ pip install coverage
47. 47
Etapa 4: Execução de um dado refactoring
Aplicar as refatorações
Objetivo é eliminar o code smell
Qual o momento certo?
Atividade contínua, integrada ao desenvolvimento:
- Acrescentar uma função
- Consertar uma falha
- Revisar o código
48. 48
Exemplos: Aplicar refatorações
def relatorio_detail(request, id):
title = u'Relatório do Servidor'
usuario = request.user
try:
relatorio = RelatorioViagem.objects.get(id=id)
except RelatorioViagem.DoesNotExist:
return HttpResponseBadRequest(u'O relatório não existe!')
if not (eh_dono_viagem(request, relatorio.viagem.id) or
eh_ordenador(request) or
eh_executor(request) or
usuario.eh_chefe_do_setor(usuario.setor)):
raise PermissionDenied
return locals()
49. 49
Exemplos: Aplicar refatorações
def relatorio_detail(request, id):
title = u'Relatório do Servidor'
usuario = request.user
try:
relatorio = RelatorioViagem.objects.get(id=id)
except RelatorioViagem.DoesNotExist:
return HttpResponseBadRequest(u'O relatório não existe!')
if not (eh_dono_viagem(request, relatorio.viagem.id) or
eh_ordenador(request) or
eh_executor(request) or
usuario.eh_chefe_do_setor(usuario.servidor.setor)):
raise PermissionDenied
return locals()
relatorio = get_object_or_404(RelatorioViagem, pk=id)
50. 50
Exemplos: Aplicar refatorações
def relatorio_detail(request, id):
title = u'Relatório do Servidor'
usuario = request.user
relatorio = get_object_or_404(RelatorioViagem, pk=id)
if not (eh_dono_viagem(request, relatorio.viagem.id) or
eh_ordenador(request) or
eh_executor(request) or
usuario.eh_chefe_do_setor(usuario.setor)):
raise PermissionDenied
return locals()
51. 51
Exemplos: Aplicar refatorações
def relatorio_detail(request, id):
title = u'Relatório do Servidor'
usuario = request.user
relatorio = get_object_or_404(RelatorioViagem, pk=id)
if not (eh_dono_viagem(request, relatorio.viagem.id) or
eh_ordenador(request) or
eh_executor(request) or
usuario.eh_chefe_do_setor(usuario.setor)):
raise PermissionDenied
return locals()
regra = regras.RelatorioViagemRegras(relatorio)
if not regra.pode_ver(request.user):
raise PermissionDenied
52. 52
Exemplos: Aplicar refatorações
def relatorio_detail(request, id):
title = u'Relatório do Servidor'
relatorio = get_object_or_404(RelatorioViagem, pk=id)
regra = regras.RelatorioViagemRegras(relatorio)
if not regra.pode_ver(request.user):
raise PermissionDenied
return locals()
53. Etapa 5: Avaliação
O comportamento é o mesmo?
Analisar resultado dos testes
Realizar análise cognitiva
Buscar novo code smell
53
56. 56
Referências
- CARNEIRO, Glauco de F. Usando medição de código fonte para refactoring. Abril de 2003. 123 p. Dissertação (Mestrado
Profissional em Redes de Computadores) - Universidade Salvador, Salvador, 2003.
- Dijkstra, E. W. "The Humble Programmer". Communications of the ACM 15 (10): 859–866, 1972.
- Entendendo Testes de Software https://willianjusten.com.br/entendendo-testes-de-software/
- FOWLER, Martin et al. Refatoração: Aperfeiçoando o Projeto de Código Existente. trad.Acauan Fernandes – Porto Alegre:
Bookman, 2004.
- Improve Your Python: Understanding Unit Testing https://jeffknupp.com/blog/
- List for code-quality tools related to Python https://mail.python.org/mailman/listinfo/code-quality
- Myres , G. F. “The Art of Software Testing”. Ed. John Wiley & Sons, Inc. New Jersey, 2004.
- O que é e o que não é refatoração – de acordo com Kent Beck e Martin Fowler
https://dzone.com/articles/what-refactoring-and-what-it-0
- Os 10 princípios dos Testes de Software http://gtsw.blogspot.com.br/2007/12/os-princpios-dos-testes-de-software.html
- Refactoring Patterns https://dzone.com/refcardz/refactoring-patterns
- Review of Python Static Analysis Tools http://blog.codacy.com/2016/01/08/review-of-python-static-analysis-tools/
- Start Here: Introductions to Python Testing Frameworks http://pythontesting.net/start-here/
- Testes e Refatoração http://pt.slideshare.net/jeveaux/testes-e-refatorao-presentation-622966
- Writing unit tests in Python: How do I start?
http://stackoverflow.com/questions/3371255/writing-unit-tests-in-python-how-do-i-start