Metryki - 1

Proszę odpowiedzieć na poniższe pytania:

 * Czym różni się metryka statyczna od dynamicznej?

 * Podaj przykłady metryk statycznych

Metryki - 2

Proszę odpowiedzieć na poniższe pytania:

 * Jakie aspekty oprogramowania można mierzyć (lub inaczej: jakie grupy metryk oprogramowania można wyznaczyć)?

 * Podaj przykłady metryk dynamicznych (to nie jest podpowiedź do pierwszego punktu...)

Metryki - 3

Proszę odpowiedzieć na poniższe pytania:

 * Czy (i ewentualnie jak) można mierzyć jakość testu?

 * Podaj przykłady metryk kodu

Metryki - 4

Proszę odpowiedzieć na poniższe pytania:

 * Czym różni się analiza statyczna od dynamicznej (w inżynierii oprogramowania)?

 * Podaj przykłady analizy dynamicznej

Metryki - 5

Proszę odpowiedzieć na poniższe pytania:

 * W jakim celu prowadzi się analizę aplikacji?

 * Czy analiza statyczna ma przewagę nad dynamiczną?

Pokrycie - 1

Dana jest funkcja:

Item* Service::method(const Other& obj, bool x) {
if (obj.hasProperty() || x)
return obj.hasItem() ? obj.item() : nullptr;
if (obj.hasItem())
throw MalformedItem();
return Item::Default;
}

Ile przypadków testowych należy napisać, by uzyskać:

 a) 100% pokrycia linii kodu

 b) 100% pokrycia gałęzi kodu

Podaj wartości argumentów konieczne do uzyskania wspomnianych pokryć.

Pokrycie - 2

Dana jest funkcja:

Item* Service::method(const Other* obj, double b) {
if (obj != nullptr && obj->hasProperty())
return obj->hasItem() ? obj.item() : nullptr;
return this->itemCache->hasItem(b) ? this->itemCache->get(b) : Item::Default;
}

Ile przypadków testowych należy napisać, by uzyskać:

 a) 100% pokrycia linii kodu

 b) 100% pokrycia gałęzi kodu

Podaj wartości argumentów konieczne do uzyskania wspomnianych pokryć.

Pokrycie - 3

Dana jest funkcja:

std::shared_ptr<Item> Service::method(const Other* obj, double b) {
if (obj == nullptr || !obj->hasProperty())
return nullptr;
if (b > 100)
throw InvalidArgument(b);
return b > 5 ? Item::Default : std::make_shared<Item>(b);
}

Ile przypadków testowych należy napisać, by uzyskać:

 a) 100% pokrycia linii kodu

 b) 100% pokrycia gałęzi kodu

Podaj wartości argumentów konieczne do uzyskania wspomnianych pokryć.

Przykład - metryki

Proszę odpowiedzieć na poniższe pytania:

 * jak rozumieć pojęcie "metryka" w inżynierii oprogramowania?

 * podaj przykłady metryk

Przykład - refaktoring

Co jest nie tak z poniższym kodem?

// bardzo uproszczony fragment na kolokwium przykładowe
extern int x;
int fun(int a, int b, bool c) {
int tmp = a;
if (c) {
if (a > 5)
if (b < 6)
if (x > 500)
if (a > 6 && b < x << a || b + 5 >> x && tmp++)
return a;
return b;
} else {
return a + b;
}
}

Proszę opisać jak należałoby poprawić ten kod (jakie operacje i w jaki sposób wykonane)

Przykłady - pokrycie

Dana jest funkcja:

int fun(int a, int b) {
if (a < 5 || b > 10)
return a * b;
return a + b;
}

Ile przypadków testowych należy napisać, by uzyskać:

 a) 100% pokrycia linii kodu

 b) 100% pokrycia gałęzi kodu

Podaj wartości argumentów konieczne do uzyskania wspomnianych pokryć.

Refaktoring - 1

Co jest nie tak z poniższym kodem?

int Service::handler(const Request& r, Type t) {
// sprawdzamy, czy usługa działa
if (!(isConfigured() && registry->isEnabled(this) && subservice != nullptr && subservice->isConfigured() && subservice->isActive() && registry->isEnabled(subservice))
return -1;

if (!r.header.topic.items.contain(Request::Header::Type::Active))
return -2;

auto tmp = r.body.items[3].data;
if (tmp > 5) {
tmp = 15 * itemCount();
switch (t) {
case Type::Responding: return sendResponse(r, tmp);
case Type::Blocked: return -3;
default: return 0;
}
} else {
switch (t) {
case Type::Responding: return sendResponse(r, itemCount() - 2);
case Type::Blocked: return -3;
default: return 0;
}
}
return -4;
}

Proszę opisać jak należałoby poprawić ten kod (jakie operacje i w jaki sposób wykonane)

Refaktoring - 2

Co jest nie tak z poniższym kodem?

int Service::process(const Request& r, bool ignored) {
// sprawdzamy, czy usługa działa
if (isConfigured() && registry->isEnabled(this) && subservice != nullptr && subservice->isConfigured() && subservice->isActive() && registry->isEnabled(subservice))
{
if (!r.header.topic.items.contain(Request::Header::Type::Active))
return -2;
auto tmp = r.body.items[3].data;

if (tmp > 5) {
tmp = 15 * itemCount();
if (ignored)
throw IncorrectRequest(r);
tmp = sendResponse(r, tmp);
if (tmp != 0)
return tmp;
return 0;
} else {
if (ignored)
throw IncorrectRequest(r);
tmp = sendResponse(r, itemCount() - 2);
if (tmp != 0)
return tmp;
return 0;
}
}
else
{
return -4;
}
return -5;
}

Proszę opisać jak należałoby poprawić ten kod (jakie operacje i w jaki sposób wykonane)