UNIVERSIDADE DE LISBOA INSTITUTO SUPERIOR TÉCNICO Engenharia de Software LEIC/LETI, 3 o Ano, 2 o Semestre 2 o Teste, 16 de Junho de 2018 Duração: 90 minutos Nome: Número: Este teste tem um conjunto de 8 perguntas de escolha múltipla, e um conjunto de 3 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/10 Perguntas de escolha múltipla 1. Considera a técnica da inversão do controlo. A) Esta técnica permite a implementação de bibliotecas de código. B) Esta técnica é fundamental para se desenvolver software seguindo o modelo de processo Reuse-oriented Software Engineering. C) Esta técnica não é usada na framework JUnit. D) Esta técnica reduz o tempo de aprendizagem necessário para se usar corretamente um elemento de software que a utilize. 2. Considere os padrões de organização da lógica de domínio. A) O padrão Transaction script é aquele que permite haver maior reutilização de código. B) O padrão Domain object permite identificar claramente o contexto transacional associado à execução de cada pedido. C) O padrão Service Layer não foi aplicado no projeto. D) O padrão Transaction script permite otimizar os acessos à base de dados. 3. Qual das seguintes afirmações é falsa relativamente à tecnologia utilizada no projeto para apresentação web, Spring-boot e Thymeleaf? A) O padrão Template view é utilizado. B) O padrão Front controller não é utilizado. C) O padrão Transform view não é utilizado. D) O padrão Page controller não é utilizado. 4. Os padrões de Offline locking utilizados pela Fénix Framework são: A) Pessimista, com a granularidade do atributo e explícito. B) Optimista, com a granularidade do objeto e explícito. C) Optimista, com a granularidade do atributo e implícito. D) Optimista, com a granularidade do atributo e explícito. 5. Qual das seguintes estratégias de guardar o estado da sessão numa aplicação web necessita de afinidade de sessão quando existem diversos servidores replicados a responder aos pedidos? A) Guardar no cliente. B) Guardar no servidor. C) Guardar na base de dados. D) Todas as indicadas nas restantes opções.
Número: Pág. 3/10 6. O código em baixo, em Dafny, calcula o n-ésimo (N) número triangular. Qual das seguintes opções é uma invariante válida para o ciclo no programa? method TriangleNumber (N: i n t ) r e t u r n s ( t : i n t ) r e q u i r e s 0 <= N; ensures t = N * (N+1) / 2; { t := 0; var n := 0; while n<n i n v a r i a n t... ; { n := n + 1; t := t + n ; A) 0 n N t = N B) 0 n N t > n (n + 1)/2 C) 0 n N t < n (n + 1)/2 D) 0 n N t = n (n + 1)/2 7. Qual dos seguintes modelos de processo de desenvolvimento não divide as atividades de levantamento de requisitos por diversas etapas (stages)? A) Cascata. B) Incremental. C) Unificado. D) Nenhum dos indicados nas restantes opções. 8. Qual das seguintes afirmação acerca de Behavior Driven Development (BDD) é falsa? A) BDD torna os requisitos automaticamente verificáveis. B) BDD incentiva a integração entre as pessoas de negócio, os responsáveis pelos testes do sistema e a equipa de desenvolvimento. C) BDD permite descrever o comportamento do sistema a diversos níveis de abstração, por exemplo, pode-se descrever o comportamento de negócio independentemente da sequência de interfaces utilizador que o implementam. D) Os custo associados à utilização de BDD são muito reduzidos, sendo o esforço de implementar um caso de teste em BDD semelhante ao esforço de implementar um caso de teste usando JUnit.
Número: Pág. 4/10 Perguntas sobre a componente prática 9. (2.0) Considere o código abaixo que modela uma ventoinha de teto, antes e depois duma refatorização. Considere ainda o código intermédio que representa um estado intermédio da refatorização. Que passos de refatorização efetuaria, a partir do código intermédio, com vista a alcançar o estado final. Justifique, indicando os passos necessários considerando que existe um conjunto de testes que verificam a correção da funcionalidade. ANTES: class CeilingFanPullChain { private i n t c u r r e n t S t a t e ; public CeilingFanPullChain ( ) { c u r r e n t S t a t e = 0; public void p u l l ( ) { i f ( c u r r e n t S t a t e == 0) { c u r r e n t S t a t e = 1; else i f ( c u r r e n t S t a t e == 1) { c u r r e n t S t a t e = 2; else { c u r r e n t S t a t e = 0; INTERMÉDIO: abstract class State { abstract i n t getcurrentstate ( ) ; class CeilingFanPullChain { private State c u r r e n t S t a t e ; public CeilingFanPullChain ( ) { setstateonint ( 0 ) ; public void setstateonint ( i n t s t a t e ) { i f ( s t a t e == 0) { this. c u r r e n t S t a t e = new Off ( ) ; else i f ( s t a t e == 1) { this. c u r r e n t S t a t e = new Low ( ) ; else { this. c u r r e n t S t a t e = new High ( ) ; public i n t getcurrentstate ( ) { return this. c u r r e n t S t a t e. getcurrentstate ( ) ; public void p u l l ( ) { i f ( getcurrentstate ( ) == 0) { setstateonint ( 1 ) ; else i f ( getcurrentstate ( ) == 1) { setstateonint ( 2 ) ; else { setstateonint ( 0 ) ; class Off extends State { public i n t getcurrentstate ( ) { return 0; class Low extends State { public i n t getcurrentstate ( ) { return 1; class High extends State { public i n t getcurrentstate ( ) { return 2; DEPOIS: abstract class State { abstract void p u l l ( CeilingFanPullChain wrapper ) ; class CeilingFanPullChain { private State c u r r e n t S t a t e ; public CeilingFanPullChain ( ) { c u r r e n t S t a t e = new Off ( ) ; public void s e tcurrentstate ( State s ) { c u r r e n t S t a t e = s ; public void p u l l ( ) { c u r r e n t S t a t e. p u l l ( this ) ; class Off extends State { public void p u l l ( CeilingFanPullChain wrapper ) { wrapper. setcurrentstate (new Low ( ) ) ; class Low extends State { public void p u l l ( CeilingFanPullChain wrapper ) { wrapper. setcurrentstate (new High ( ) ) ; class High extends State { public void p u l l ( CeilingFanPullChain wrapper ) { wrapper. setcurrentstate (new Off ( ) ) ;
Número: Pág. 5/10
Número: Pág. 6/10 10. (2.0) Considere os fragmentos de código abaixo, relativos ao módulo Hotel Controlador: @RequestMapping ( value = " / h o t e l s ", method = RequestMethod.POST) public S t r i n g hotelsubmit ( Model model, @ModelAttribute HotelData hoteldata ) { t r y { H o t e l I n t e r f a c e. createhotel ( hoteldata ) ; catch ( HotelException be ) { model. a d d A t t r i b u t e ( " e r r o r ", " E r r o r : i t was not p o s s i b l e to create the h o t e l " ) ; model. a d d A t t r i b u t e ( " h o t e l ", hoteldata ) ; model. a d d A t t r i b u t e ( " h o t e l s ", H o t e l I n t e r f a c e. gethotels ( ) ) ; return " h o t e l s " ; return " r e d i r e c t : / h o t e l s " ; Vista: <h3>create Hotel </ h3> <p class= " t e x t danger " th : t e x t = " $ { e r r o r " >Error </ p> <form th : a c t i o n = "@{ / h o t e l s " th : o b j e c t = " $ { h o t e l " method= " post " > <label >Name: </ label > < i n p u t type= " t e x t " th : f i e l d = " * { name " / > <label >Code : </ label > < i n p u t type= " t e x t " size="7" th : f i e l d = " * { code " / > <label >NIF : </ label > < i n p u t type= " t e x t " size="9" th : f i e l d = " * { n i f " / > <label >IBAN : </ label > < i n p u t type= " t e x t " size=" 20 " th : f i e l d = " * { iban " / > <label > Single : </ label > < i n p u t type= " number " th : f i e l d = " * { p r i c e S i n g l e " / > <label >Double : </ label > < i n p u t type= " number " th : f i e l d = " * { pricedouble " / > < i n p u t type= " submit " value= " Submit " / > </ form > Interface: @Atomic ( mode = TxMode. WRITE) public s t a t i c void createhotel ( HotelData hoteldata ) { new Hotel ( hoteldata. getcode ( ), hoteldata. getname ( ), hoteldata. g e t N i f ( ), hoteldata. getiban ( ), hoteldata. g e t P r i c e S i n g l e ( ), hoteldata. getpricedouble ( ) ) ; Indique as alterações que deve efetuar por forma a que o módulo Hotel passe a suportar quartos triplos, deste a interface utilizador à persistência. Note que os fragmentos de código apresentados podem não corresponder a todos as partes de código que devem ser modificadas. Considere a ordem de alterações por forma a que os testes continuem a funcionar.
Número: Pág. 7/10
Número: Pág. 8/10 11. (1.2) Considere os resultados de uma simulação efetuada usando a ferramenta JMeter, descritos na tabela abaixo, para o teste de integração de sucesso sem reserva de hotel e carro. Analise os dados e responda às seguintes questões sabendo que foram simulados 10 utilizadores simultâneos em que cada um deles executa uma vez a mesma sequência de pedidos. Considere que também se usou o JMeter para inicializar sequencialmente a base de dados antes de se proceder à simulação dos 10 utilizadores, operações de carregamento de dados, e após a simulação dos utilizadores são limpas as bases de dados. 1. Qual o setup necessário para que não seja necessário alugar um quarto nem reservar um veículo? Em que fase do carregamento é que essa informação é carregada? 2. Quantos pedidos de Process Adventure são feitos por cada utilizador? Justifique a resposta ilustrando os potenciais estados da aplicação em cada pedido. 3. Tendo em consideração que o comportamento transacional é assegurado através da Fénix Framework, justifique a discrepância nos valores de latência observados.
Número: Pág. 9/10