a) #lapp
Scenario: Matricular disciplinas com choque de horário Given eu estou na página de matrícula
And eu estou com a disciplina “A” adicionada na grade de horário no horário “15-17h”
And A disciplina “B” está na lista de disciplinas disponíveis com horário “15-17h” When eu tento adicionar a disciplina “B” na grade de horário
Then eu vejo uma mensagem relacionada ao choque de horário And a disciplina “B” não aparece na grade de horário
b) #lapp
Given a disciplina “B” não está na grade de horário da matrícula And a disciplina “A” está na grade de horário
When é adicionada a disciplina “B” na grade Then a disciplina “B” não é cadastrada na grade c) sim
d) Pois é necessário verificar se tudo está ocorrendo como desejado nos métodos de controllers e na GUI, caso contrário os testes mostrarão onde as modificações deverão ser feitas para que os testes passem.
a) Testes de regressão são feitos antes de lançar novas versões do projeto original, tendo certeza que os testes anteriores continuem funcionando.
b) Testes de aceitação são feitos entregando o programa completo para alguns usuários finais a fim de saber sua corretude.
a) Epics são usados para agrupar histórias que fazem sentidos estarem juntas. A epics seria uma grande história que dentro tem histórias menores que a compõem
a) Decorator e Abstract Factory
b) Decorator é um padrão de projeto que serve para adicionar um comportamento a um objeto em tempo de execução. Funciona como uma alternativa às subclasses como método para adicionar funcionalidade a uma classe.
Abstract Factory permite a criação de famílias de objetos relacionados ou dependentes por meio de uma única interface, sem que a classe concreta seja especificada.
Será que é essa resposta de baixo?
a) O continue dentro do if quebra o fluxo do programa.
b) Debug (?)//O analyze code tem uma ferramenta que detecta if desnecessário ou if errado(mas não sei o nome dessa merda)
c) Colocar todo o código abaixo do if dentro dele, porém tirando a ! da condição. d) Rodando testes para esse código.
e) f)
void prepareListsOfSourceAndSinks(Collection<SDGClass> classes,...) {
for (SDGClass sdgClass : classes) {
if (mapClassFeatures.containsKey(sdgClass.toString())) { for (SDGAttribute sdgAttribute :
sdgClass.getAttributes()) { … // 8 lines of code
}
for (SDGMethod sdgMethod : sdgClass.getMethods()) { … // 20 lines of code
} } } }
a) O cenário declarativo é mais simples em relação aos cenários imperativos. Os cenários imperativos são mais detalhados em seus passos enquanto os declarativo usam de uma maior abstração para descrever seus passos.
b) As desvantagens de um cenário imperativo é que este é mais custoso para manutenção, pois quaisquer modificações acarretariam em mudanças detalhadas nesse tipo de cenário, o que acaba sendo complexo, e esse cenário costuma ser muito extenso. Já o cenário declarativo tem uma vantagem em questão de usar um nível mais alto de abstração maior em seus passos para que fique mais fácil de se discutir sobre os testes com os stakeholders (tanto o cliente quanto os
desenvolvedores), além de ser menos custoso para manutenção. c)
a) Testes de unidade servem para testar um componente de um projeto (ou seja, testar um módulo - classe ou método - individualmente, caso dependa de outros módulos, eles serão simulados). Seu objetivo é verificar corretude funcional dos módulos independentes.
b) Testes de integração consistem nos teste realizados entre os conjuntos dos módulos e as interfaces entre eles. O propósito principal é verificar a funcionalidade,
performance e confiabilidade dos módulos que são integrados.
c) Testes de aceitação servem para determinar se o sistemas estão de acordo com as especificações. O propósito principal é avaliar se o sistema está complacente com os requerimentos e se ele entrega para o usuário final os requisitos.
a) Uma branch é um ponteiro que marca um commit. Inicialmente o usuário tem a branch inicial do git, que é chamada de master. O usuário pode criar novas branches, que irão funcionar como uma ramificação da branch master.
b) É interessante, em um projeto, a criação de diferentes branches para que códigos de implementações diferentes não se misture, pois um bug em um implementação pode causar problemas em outra. No caso de branches separadas esse problema é evitado.
c) O merge tem o proposito de juntar duas branches diferentes. Para que isso ocorra é necessário que os conflitos no códigos entre elas sejam resolvidos. Após a
resolução dos conflitos um commit é lançado e as informações para finalizar o merge.
d) Os conflitos podem ser detectados caso novos códigos de uma branch A sejam inseridos em posição de uma branch B onde outros códigos foram adicionado ou mexidos. Outro caso é o das mesmas variáveis serem mexidas nas branches do merge
a) Os dois if’s estão com códigos repetidos, sendo assim uma forma de “mau cheiro” b) Análise do código (?) -> No IntelliJ, por exemplo, usa-se Analyze/Locate Duplicate c) (Confiram pls)
def newMethod(TechnicalReport trInstance, String x){ trInstance.discardMembers()
flash.message = x
render(view: “create”, model: [trInstance: trInstance]) }
def save() {
def trInstance = new TechnicalReport(params)
if(!PublicationController.newUpload(trInstance, flash, request)){ newMethod(trInstance, ‘technicalReport.filesaving.failure’) return } if(!technicalReportInstance.save(flush: true)){ newMethod(trInstance, ‘technicalReport.saving.failure’) return
}
flash.message = message(code: ‘default.created.message’, ...) redirect(action: “show”, id: trInstance.id)
}
http://refactoring.com/catalog/extractClass.html
a) Está relacionado ao excesso de métodos em uma classe, tornando a mesma sobrecarregada.
b) Extrair métodos e/ou dados dessa classe e mover os mesmos para uma nova classe e renomear, se necessário, a classe antiga.
c) Porque na classe antiga, haverá um método/atributo que retornará as informações retiradas da classe.
d) Realizando testes sobre os módulos alterados para garantir a manutenção da corretude após a refatoração
#lapp
variavel - “([^”]*)”
And(~’^I select the new article option at the article page$’) {-> to ArticlesPage
at ArticlesPage
page.selectNewArticle() }
Then(~’^I can fill the article details$’) { at ArticlesCreatePage
assert page.fillArticleDetailsAndCheck(“title”, “journal”) }
import geb.Page
class ArticlesCreatePage extends Page { static url = “/article/create” static at = {
title ==~ /Create Article/ }
boolean fillArticleDetailsAndCheck(String title, String journal) { $(“form”).title = title $(“form”).journal = journal return ($(“form”).title.equals(title) && $(“form”).journal.equals(journal)) } } import geb.Page
class ArticlesPage extends Page { static url = “/article/index/” static at = {
title ==~ /Article List/ }
boolean selectNewArticle () { $(“a.create”).click() }
}
Velocity é a média de pontos em stories alcançada por um predeterminado número de iterações. Serve para determinar o que pode ser planejado para futuras iterações, mostrando o quanto a equipe pode desenvolver (produtividade).
Questão extra por Walber
Quais são os conceitos de qualidade de software? - Corretude, - Completude - Robustez - Adaptabilidade - Portabilidade - Escalabilidade