Gerenciamento de Configuração Adriano J. Holanda 17/10/2016 Gerenciamento de Configuração Definição Gerenciamento de Configuração se refere a um conjunto de procedimentos para controlar a evolução de um sistema/software. Tipicamente inclui as seguintes tarefas: ▶ Controle de versão; ▶ Automação da montagem do sistema; ▶ Automação dos testes e rastreio de bugs (bug-tracking); ▶ Controle do lançamento de versões. Controle de Versão Sistema de Controle de Versão Vantagens ▶ Permite mais de um desenvolvedor trabalhar no mesmo código; ▶ Versões mais antigas são facilmente recuperáveis; ▶ Mantém registro das modificações; ▶ Permite comparação das diferenças entre as versões; ▶ Permite ramificações (branches) e versões múltiplas do mesmo projeto. Sistema de Controle de Versão Centralizado Exemplos: Subversion, CVS, Bazaar, Computador A Arquivo Servidor Versão 3 Versão 2 Computador B Arquivo Versão 1 Fonte: Vídeo do youtube: “Introduction to Git with Scott Chacon of GitHub.” Sistema de Controle de Versão Distribuído Exemplos: Git, Mercurial, Servidor Computador A Computador B Versão 3 Versão 3 Versão 3 Versão 2 Versão 2 Versão 2 Versão 1 Versão 1 Versão 1 Arquivo Arquivo Fonte: Vídeo do youtube: “Introduction to Git with Scott Chacon of GitHub.” Sistema de Controle de Versão Distribuído Vantagens ▶ Cada desenvolvedor pode ter sua cópia do projeto de software. ▶ Não sobrecarrega a rede a cada alteração e consolidação do código modificado. ▶ As ramificações (branches) são locais e podem ser fundidas com o repositório central. ▶ Os desenvolvedores podem compartilhar código entre si antes de transferir para o repositório central. Automação da Montagem do Sistema Automação da Montagem do Sistema A automação da montagem do sistema permite que tarefas como compilação e vinculação de bibliotecas dinâmicas, instalação do software e até mesmo implantação sejam realizadas sem a intervenção do desenvolvedor, seguindo regras de execução e ordem de dependências. As ferramentas mais comuns para a realização destas tarefas são: ▶ GNU make ▶ CMake ▶ Apache Ant ▶ Microsoft.Build GNU make Exemplo de arquivo de configuração para o GNU make. Makefile objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) $(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h Fonte: https://www.gnu.org/software/make/ Apache Ant Utilizado principalmente em projetos na linguagem Java. Segue exemplo de arquivo de configuração:build.xml <project> <target name="clean"> <delete dir="build"/> </target> <target name="compile"> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes"/> </target> <target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="oata.HelloWorld"/> </manifest> </jar> </target> <target name="run"> <java jar="build/jar/HelloWorld.jar" fork="true"/> </target> </project> Fonte: http://ant.apache.org/ Automação de testes Testes de Unidade ▶ Testes são uma forma antiga de assegurar que algumas alterações no código não tenham modificado a saída esperada para determinadas funcionalidades. ▶ O Teste de Unidade (Unit Testing) foi definido para ser parte integrante da metodologia ágil Extreme Programming (XP), com o objetivo de verificar se as unidades selecionadas para teste, sejam elas módulos, classes ou métodos, retornam os resultados esperados após alteração no código. Caso contrário, a construção do software irá falhar, indicando que houve inserção de bug. Exemplo de Teste usando JUnit 1 2 3 4 5 6 7 8 9 public class Calculadora { public int somar(int x, int y) { return x + y; } public int dividir (int num, int den) { return num/den; } } Para compilar: $ javac Calculadora.java Exemplo de Teste usando JUnit, cont. 1 2 import static org. junit .Assert.assertEquals; import org.junit .Test; 3 4 5 public class TesteCalculadora { Calculadora calc = new Calculadora(); 6 @Test public void testeSoma() { int esperado = 7; int res = calc.somar(3, 4); assertEquals(”somando␣3␣+␣4”, esperado, res); } 7 8 9 10 11 12 13 @Test public void testeDivisao() { int esperado = 4; int res = calc. dividir (8, 2); assertEquals(”dividindo␣8␣/␣2”, esperado, res); } 14 15 16 17 18 19 20 } Para compilar:$ javac -cp .:junit-4.12.jar TesteCalculadora.java Calculadora.java Para executar: $ java -cp .:junit-4.12.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore TesteCalculadora