UNIVERSIDADE DE LISBOA INSTITUTO SUPERIOR TÉCNICO Engenharia de Software LEIC/LETI, 3 o Ano, 2 o Semestre 1 o Teste, 4 de Abril de 2017 Duração: 60 minutos Nome: Número: Este teste tem um conjunto de 8 perguntas de escolha múltipla, e um conjunto de 2 perguntas de resposta aberta. Escreva o seu número em todas as folhas da prova. O tamanho das respostas deve ser limitado ao espaço fornecido para cada questão. Pode responder a lápis. Em cima da mesa devem estar apenas: enunciado, material de escrita e cartão de aluno. Apenas são permitidas folhas de rascunho fornecidas pelos docentes que devem ser devolvidas no final. A utilização de de qualquer aparelho electrónico (tais como telemóveis, calculadoras, etc) implica a anulação imediata do teste. Leia cuidadosamente as perguntas de escolha múltipla e coloque na grelha a letra correspondente à resposta correta para cada pergunta. Por favor, use apenas letras maiúsculas. Se não responder a uma determinada pergunta, marque a resposta com um X. A classificação das perguntas de escolha múltipla é feita da seguinte forma: uma resposta correta vale 0,6; uma resposta errada vale -0,2; uma pergunta não respondida vale 0. Por isso, no caso de não saber responder a uma determinada pergunta é preferível deixar a pergunta por responder. Para cada pergunta deve escolher a que considera mais correta. Respostas às questões de escolha múltipla (componente teórica): 1. 2. 3. 4. 5. 6. 7. 8. Não preencher. Reservado para a correcção. 9: 10: 11:
Número: Pág. 2/?? Perguntas de escolha múltipla 1. Qual das seguintes opções não está relacionada com white-box texting: A) Statement testing. B) Path testing. C) Boundary value analysis. D) Branch testing. 2. Integração Contínua (Continuous Integration, CI) A) Tem como objetivo integrar o trabalho desenvolvido pelos programadores diversas vezes ao dia, assegurando através de testes que a base de código permanece consistente após cada integração. B) Visa reduzir a colaboração entre os programadores. C) Apesar de ser um método bastante usado na prática, aumenta os problemas de integração (por exemplo, aumenta o número de conflitos). D) Não tem como objetivo a redução de problemas de integração do código desenvolvido. 3. A Ana e o Bernardo estão a colaborar num trabalho usando Git e um servidor remoto. O Bernardo tenta fazer pull das últimas alterações da Ana e recebe uma mensagem de erro de conflito; como devem resolver a situação? A) A Ana deve fazer pull do servidor remoto, editar os ficheiro em conflito e adicionar um novo commit de resolução. B) O Bernardo deve editar os ficheiros em conflito e adicionar um novo commit de resolução. C) O Bernardo deve fazer um novo clone do repositório, copiar os ficheiros em conflito e adicionar um commit de resolução. D) A Ana deve fazer um novo clone do repositório, copiar os ficheiros em conflito e adicionar um commit de resolução. 4. Qual das seguintes opções é uma vantagem quando se opta por implementar primeiro os testes (test-first)? A) Faz com que não seja necessária a utilização de técnicas de inspeção e revisão. B) Torna mais fácil a implementação dos testes. C) Os testes podem ser utilizados como especificação e documentação. D) Irá permitir encontrar todos os problemas durante o desenvolvimento.
Número: Pág. 3/?? 5. Sobre revisão (reviews), qual das seguintes afirmações é verdadeira? A) Reviews são a forma menos eficaz de testar software. B) Reviews não podem ser usadas para analisar documentos de requisitos. C) É pouco provável que reviews ajudem a encontrar problemas em planos de testes. D) Reviews é uma técnica que pode e deve ser utilizada nas diversas fases do ciclo de desenvolvimento de software (levantamento de requisitos, desenho, implementação e teste). 6. Cobertura... A) Só pode ser obtida durante a execução de testes de unidade (unit testing), e não para testes de integração ou sistema. B) É uma métrica que permite medir, ainda que parcialmente, a exaustividade dos testes. C) É uma métrica apenas utilizada em testes de caixa preta (black-box testing). D) Não tem nenhuma relação com teste de software. 7. Para o desenho de casos de testes pressupõe-se que A) Existe um simulador do sistema que permite verificar os resultados dos testes. B) Os testes, antes de executados, são revistos por programadores experientes. C) A equipa responsável pelo desenvolvimento dos testes tem conhecimento total sobre o comportamento do sistema a ser testado. D) O programador responsável pela implementação do teste é capaz de identificar o (output) esperado. 8. Um dos Padrões em Aplicações Empresariais (Patterns of Enterprise Application Architecture) estudados é o Data Mapper. A) Este padrão separa o código SQL da lógica de domínio. B) Apenas permite um mapeamento entre a estrutura de objectos e a estrutura da base de dados. C) Não contém a lógica de negócio. D) Apesar de oferecer uma interface orientada a objectos, não separa o código SQL da lógica do domínio.
Número: Pág. 4/?? Perguntas sobre a componente prática O projeto ADVENTURE BUILDER que está a ser desenvolvido na disciplina de Engenharia de Software tem como funcionalidade principal a integração de diversos fornecedores de serviços com vista à oferta de atividades de lazer. Considere que o seguinte requisito é adicionado à especificação do projeto: um cliente não pode ter mais de 5 contas; a excepção BankException deve ser lançada quando se tenta criar uma conta para um cliente que viole esta condição. Para auxilio à implementação deste novo requisito, a equipa de desenvolvimento decidiu implementar, paralelamente, um método int getnumberaccounts(client c) da class Bank que devolve o número de contas do cliente.
Número: Pág. 5/?? 9. (2.0) Considerando o requisito adicionado à especificação do projeto, para além daqueles que já foram introduzidos no trabalho prático, indique os vários casos de teste do construtor da classe Account que devem ser desenvolvidos para testar a implementação dessa funcionalidade utilizando as técnicas de partição de equivalência e análise de valores de fronteira. Implemente esses casos utilizando JUnit. Solução: sucesso : Criar uma conta para um cliente que não esteja no limite máximo. número de contas excedidas : Uma excepção é lançada quando se tenta criar uma conta para um cliente que já possui 5 contas. valor de fronteira Criar uma conta para um cliente com 4 contas. private Bank bank; private Client client; @Before public void setup() { bank = new Bank(BANK_NAME, BANK_CODE); client = new Client(bank, "ES_TESTE"); @Test public void success() { assert(1, this.bank.getnumberofaccounts(this.client)) @Test(expected = BankException.class) public void max() { for(int i = 0; i < 5; i++) { @Test public void maxminusone() { for(int i = 0; i < 4; i++) { assert(5, this.bank.getnumberofaccounts(this.client))
Número: Pág. 6/?? 10. (1.7) Implemente o caso de teste de sucesso que definiu na alínea anterior, recorrendo à framework JMockit considerando que o objecto Bank é mocked e que após a invocação do construtor se fazem as verificações abaixo. Considere ainda que para a validação da criação de uma conta é necessário que o cliente pertença ao banco, método boolean hasclient(client c) na classe Bank. Assert.assertEquals(this.bank, account.getbank()); Assert.assertTrue(account.getIBAN().startsWith(this.bank.getCode())); Assert.assertEquals(this.client, account.getclient()); Assert.assertEquals(0, account.getbalance()); Solução: @Test public void success(@mocked Bank bank) { new Expectations() { { bank.hasclient(accountcontructormethodtest.this.client); this.result = true; ; bank.getnumberofaccounts(accountcontructormethodtest.this.client); this.result = 2; bank.getcode(); this.result = "BK01"; Account account = new Account(this.bank, this.client); Assert.assertEquals(this.bank, account.getbank()); Assert.assertTrue(account.getIBAN().startsWith(this.bank.getCode())); Assert.assertEquals(this.client, account.getclient()); Assert.assertEquals(0, account.getbalance());
Número: Pág. 7/?? 11. (1.5) Altere o domínio da aplicação do módulo Bank do ADVENTURE BUILDER, com recurso à Fénix Framework, de forma a que a informação seja adequadamente persistida. Modele a especificação do domínio usando a Domain Modeling Language (DML). NOTA: Necessita de modelar a relação das seguintes classes: Bank e Client. Não precisa de modelar operações (transações) por parte dos clientes nas contas. Solução: class Bank { String code; String name; class Client { String ID; String name; relation BankHasClient { Bank playsrole bank { multiplicity 1..1; Client playsrole client { multiplicity 0..*;