adding more functionality test rate v2
This commit is contained in:
parent
39c930f6ae
commit
17705e459e
|
@ -23,7 +23,7 @@ We define 5 categories to measure:
|
||||||
|
|
||||||
• Functionality (F). Answers to “does the machine work well?” Condition tests fall in here.
|
• Functionality (F). Answers to “does the machine work well?” Condition tests fall in here.
|
||||||
• Appearance (A). Aesthetic evaluation, surface deterioration.
|
• Appearance (A). Aesthetic evaluation, surface deterioration.
|
||||||
• Quality (Q). How good is the machine, in terms of performance. Benchmarks, power, and characteristics fall here. The quality score, that represents the performance of the device, the functionality score, that based on the correct working of the buttons, audio and connectivity aspects, and the appaerance score, that focused on the aesthetics and cosmetics aspects like visual damage on screen, buttons or cabinet.
|
• Performance (Q). How good is the machine, in terms of performance. Benchmarks, power, and characteristics fall here. The quality score, that represents the performance of the device, the functionality score, that based on the correct working of the buttons, audio and connectivity aspects, and the appaerance score, that focused on the aesthetics and cosmetics aspects like visual damage on screen, buttons or cabinet.
|
||||||
• Market value (MV). Perceived value, brand recognition, selling value.
|
• Market value (MV). Perceived value, brand recognition, selling value.
|
||||||
• Cost of repair, refurbish and manufacture. ( C )
|
• Cost of repair, refurbish and manufacture. ( C )
|
||||||
|
|
||||||
|
@ -111,6 +111,8 @@ Elements of effective testing include the following:
|
||||||
|
|
||||||
• Test results must be retained after unit shipment or sale.
|
• Test results must be retained after unit shipment or sale.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Example of Theorical Normals**
|
**Example of Theorical Normals**
|
||||||
|
|
||||||
Characteristics xMin xMax xMax-xMin
|
Characteristics xMin xMax xMax-xMin
|
||||||
|
@ -135,4 +137,3 @@ Characteristics xMin xMax xMax-xMin
|
||||||
|
|
||||||
- Camera Resolution 8 64 56
|
- Camera Resolution 8 64 56
|
||||||
|
|
||||||
// end
|
|
|
@ -546,6 +546,7 @@ class SnapshotRequest(db.Model):
|
||||||
id = Column(UUID(as_uuid=True), ForeignKey(Snapshot.id), primary_key=True)
|
id = Column(UUID(as_uuid=True), ForeignKey(Snapshot.id), primary_key=True)
|
||||||
request = Column(JSON, nullable=False)
|
request = Column(JSON, nullable=False)
|
||||||
snapshot = relationship(Snapshot,
|
snapshot = relationship(Snapshot,
|
||||||
|
|
||||||
backref=backref('request',
|
backref=backref('request',
|
||||||
lazy=True,
|
lazy=True,
|
||||||
uselist=False,
|
uselist=False,
|
||||||
|
@ -708,7 +709,7 @@ class TestAudio(Test):
|
||||||
Test to check all this aspects related with audio functions, Manual Tests??
|
Test to check all this aspects related with audio functions, Manual Tests??
|
||||||
"""
|
"""
|
||||||
loudspeaker = Column(BDEnum(LoudspeakerRange))
|
loudspeaker = Column(BDEnum(LoudspeakerRange))
|
||||||
loudspeaker.comment = 'Range to determine if the speaker is working properly and what sound quality it has.'
|
loudspeaker.comment = 'Test to determine if the speaker is working properly and what sound quality it has.'
|
||||||
microphone = Column(Boolean)
|
microphone = Column(Boolean)
|
||||||
microphone.comment = 'This evaluate if microphone works correctly'
|
microphone.comment = 'This evaluate if microphone works correctly'
|
||||||
|
|
||||||
|
@ -726,7 +727,8 @@ class TestConnectivity(Test):
|
||||||
bluetooth.comment = 'Evaluate if bluetooth works'
|
bluetooth.comment = 'Evaluate if bluetooth works'
|
||||||
usb_port = Column(Boolean())
|
usb_port = Column(Boolean())
|
||||||
usb_port.comment = 'Evaluate if usb port was detected and charger plug works'
|
usb_port.comment = 'Evaluate if usb port was detected and charger plug works'
|
||||||
|
locked = Column(Boolean)
|
||||||
|
locked.comment = 'Test to check if devices is locked'
|
||||||
|
|
||||||
class TestBattery(Test):
|
class TestBattery(Test):
|
||||||
"""
|
"""
|
||||||
|
@ -747,6 +749,21 @@ class TestCamera(Test):
|
||||||
# TODO define when test FAIL
|
# TODO define when test FAIL
|
||||||
"""
|
"""
|
||||||
camera = Column(Boolean)
|
camera = Column(Boolean)
|
||||||
|
camera.comment = ""
|
||||||
|
|
||||||
|
|
||||||
|
class TestKeyboard(Test):
|
||||||
|
"""
|
||||||
|
Test to determinate if keyboard layout are and works correctly
|
||||||
|
"""
|
||||||
|
keyboard = Column(Boolean)
|
||||||
|
keyboard.comment = ""
|
||||||
|
|
||||||
|
|
||||||
|
class TestTrackpad(Test):
|
||||||
|
"""Test trackpad works correctly"""
|
||||||
|
trackpad = Column(Boolean)
|
||||||
|
trackpad.comment = ""
|
||||||
|
|
||||||
|
|
||||||
class TestBios(Test):
|
class TestBios(Test):
|
||||||
|
@ -880,13 +897,7 @@ class RateComputer(Rate):
|
||||||
# self.network_adapter = device.network_adapter.rate
|
# self.network_adapter = device.network_adapter.rate
|
||||||
...
|
...
|
||||||
|
|
||||||
COMPONENTS_WEIGHTS = [
|
COMPONENTS_WEIGHTS..
|
||||||
PROCESSOR_WEIGHT = 0.1,
|
|
||||||
RAM_WEIGHT = 0.25,
|
|
||||||
DATA_STORAGE_WEIGHT = 0.05,
|
|
||||||
GRAPHIC_CARD_WEIGHT = 0.1,
|
|
||||||
...
|
|
||||||
]
|
|
||||||
|
|
||||||
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, ..., COMPONENTS_WEIGHTS)
|
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, ..., COMPONENTS_WEIGHTS)
|
||||||
|
|
||||||
|
@ -972,14 +983,14 @@ class RateLaptop(RateComputer):
|
||||||
...
|
...
|
||||||
|
|
||||||
COMPONENTS_WEIGHTS = [
|
COMPONENTS_WEIGHTS = [
|
||||||
PROCESSOR_WEIGHT = 0.1,
|
PROCESSOR_WEIGHT: 0.1,
|
||||||
RAM_WEIGHT = 0.25,
|
RAM_WEIGHT: 0.25,
|
||||||
DATA_STORAGE_WEIGHT = 0.05,
|
DATA_STORAGE_WEIGHT: 0.05,
|
||||||
GRAPHIC_CARD_WEIGHT = 0.1,
|
GRAPHIC_CARD_WEIGHT: 0.1,
|
||||||
DISPLAY_WEIGHT = 0.3,
|
DISPLAY_WEIGHT: 0.3,
|
||||||
BATTERY_WEIGHT = 0.25,
|
BATTERY_WEIGHT: 0.25,
|
||||||
CAMERA_WEIGHT = 0.1,
|
CAMERA_WEIGHT: 0.1,
|
||||||
...
|
... ...
|
||||||
]
|
]
|
||||||
|
|
||||||
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, self.display,
|
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, self.display,
|
||||||
|
@ -1074,10 +1085,10 @@ class RateMobile(Rate):
|
||||||
|
|
||||||
CHARACTERISTIC_WEIGHTS = [
|
CHARACTERISTIC_WEIGHTS = [
|
||||||
PROCESSOR_CHAR_WEIGHTS = 0.2, 0.4, 0.4 # cores, speed, benchmark
|
PROCESSOR_CHAR_WEIGHTS = 0.2, 0.4, 0.4 # cores, speed, benchmark
|
||||||
RAM_CHAR_WEIGHT = 0.3, 0.3, 0.4 # size, benchmark
|
RAM_CHAR_WEIGHT = 0.3, 0.3, 0.4 # size, benchmark
|
||||||
DATA_STORAGE_CHAR_WEIGHT = 0.2, 0.4, 0.4 # size, speed, benchmark
|
DATA_STORAGE_CHAR_WEIGHT = 0.2, 0.4, 0.4 # size, speed, benchmark
|
||||||
GRAPHIC_CARD_CHAR_WEIGHT = 0.5, 0.5 # size, benchmark
|
GRAPHIC_CARD_CHAR_WEIGHT = 0.5, 0.5 # size, benchmark
|
||||||
DISPLAY_CHAR_WEIGHT = 0.4, 0.6 # size, resolution
|
DISPLAY_CHAR_WEIGHT = 0.4, 0.6 # size, resolution
|
||||||
...
|
...
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1093,14 +1104,14 @@ class RateMobile(Rate):
|
||||||
...
|
...
|
||||||
|
|
||||||
COMPONENTS_WEIGHTS = [
|
COMPONENTS_WEIGHTS = [
|
||||||
PROCESSOR_WEIGHT = 0.1,
|
PROCESSOR_WEIGHT: 0.1,
|
||||||
RAM_WEIGHT = 0.25,
|
RAM_WEIGHT: 0.25,
|
||||||
DATA_STORAGE_WEIGHT = 0.05,
|
DATA_STORAGE_WEIGHT: 0.05,
|
||||||
GRAPHIC_CARD_WEIGHT = 0.1,
|
GRAPHIC_CARD_WEIGHT: 0.1,
|
||||||
DISPLAY_WEIGHT = 0.3,
|
DISPLAY_WEIGHT: 0.3,
|
||||||
BATTERY_WEIGHT = 0.25,
|
BATTERY_WEIGHT: 0.25,
|
||||||
CAMERA_WEIGHT = 0.1,
|
CAMERA_WEIGHT: 0.1,
|
||||||
...
|
...
|
||||||
]
|
]
|
||||||
|
|
||||||
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, self.display,
|
return harmonic_mean(self.processor, self.ram, self.data_storage, self.graphic_card, self.display,
|
||||||
|
@ -1162,6 +1173,7 @@ class RateMonitor(Rate):
|
||||||
Main class to group by device type: Monitor
|
Main class to group by device type: Monitor
|
||||||
Computer is broadly extended by ``ComputerMonitor``, ``TelevisionSet``, and
|
Computer is broadly extended by ``ComputerMonitor``, ``TelevisionSet``, and
|
||||||
`` Projector``.
|
`` Projector``.
|
||||||
|
Important: Aspect ratio is an important variable in screen features
|
||||||
"""
|
"""
|
||||||
id = Column(UUID(as_uuid=True), ForeignKey(Rate.id), primary_key=True)
|
id = Column(UUID(as_uuid=True), ForeignKey(Rate.id), primary_key=True)
|
||||||
|
|
||||||
|
|
|
@ -92,12 +92,26 @@ class FunctionalityRate(BaseRate):
|
||||||
LOUDSPEAKER_WEIGHT = 0.15
|
LOUDSPEAKER_WEIGHT = 0.15
|
||||||
MICROPHONE_WEIGHT = 0.15
|
MICROPHONE_WEIGHT = 0.15
|
||||||
|
|
||||||
def compute(self, FunctionalityRate: FunctionalityRate):
|
@classmethod
|
||||||
|
def compute(cls, device: Device):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
:param FunctionalityDevice: List[Boolean]
|
:param FunctionalityDevice: List[Boolean]
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
test_bios_power_on = device.last_event_of(TestBios).bios_power_on # type: bool
|
||||||
|
test_bios_power_on = int(test_bios_power_on)
|
||||||
|
|
||||||
|
|
||||||
|
test_battery = device.last_event_of(TestBattery)
|
||||||
|
test_audio
|
||||||
|
test_data_storage
|
||||||
|
|
||||||
|
functionality = test_bios.bios_power_on * self.BIOS_WEIGHT + ...
|
||||||
|
return cls(funcionality=functionality)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO Check if funcionality aspect is != NULL
|
# TODO Check if funcionality aspect is != NULL
|
||||||
sim = FunctionalityDevice.sim * self.SIM_WEIGHT
|
sim = FunctionalityDevice.sim * self.SIM_WEIGHT
|
||||||
usb = FunctionalityDevice.usb * self.USB_WEIGHT
|
usb = FunctionalityDevice.usb * self.USB_WEIGHT
|
||||||
|
@ -127,110 +141,6 @@ class Appearance(Range):
|
||||||
NONE = -0.3
|
NONE = -0.3
|
||||||
|
|
||||||
|
|
||||||
class FinalRate(Rate):
|
|
||||||
"""The act of grading the appearance, quality (performance), and functionality
|
|
||||||
of a device.
|
|
||||||
|
|
||||||
There are five categories of ``Rate``:
|
|
||||||
1. ``Quality``. How good is the machine, in terms of performance.
|
|
||||||
2. ``Functionality``.
|
|
||||||
3. ``Appearance``.
|
|
||||||
4. ``Market value``.
|
|
||||||
5. ``Cost of repair``.
|
|
||||||
|
|
||||||
There are types of rating a device:
|
|
||||||
|
|
||||||
1. Rate Quality
|
|
||||||
2. Rate Functionality
|
|
||||||
3. Rate Final
|
|
||||||
"""
|
|
||||||
quality_rate = QualityRate()
|
|
||||||
functionality_rate = FunctionalityRate()
|
|
||||||
appearance_rate = Appearance()
|
|
||||||
|
|
||||||
final_rate = None
|
|
||||||
|
|
||||||
# TODO Develop merge rate aspects (categories)
|
|
||||||
|
|
||||||
""" MANUAL INPUT """
|
|
||||||
manual_id = Column(UUID(as_uuid=True), ForeignKey(ManualRate.id))
|
|
||||||
manual_id.comment = """The ManualEvent used to generate this
|
|
||||||
aggregation, or None if none used.
|
|
||||||
|
|
||||||
An example of ManualEvent is using the web or the Android app
|
|
||||||
to rate a device.
|
|
||||||
"""
|
|
||||||
manual = relationship(ManualRate,
|
|
||||||
backref=backref('aggregate_rate_manual',
|
|
||||||
lazy=True,
|
|
||||||
order_by=lambda: ResultRate.created,
|
|
||||||
collection_class=OrderedSet),
|
|
||||||
primaryjoin=manual_id == ManualRate.id)
|
|
||||||
|
|
||||||
""" WORKBENCH COMPUTER """
|
|
||||||
workbench_computer_id = Column(UUID(as_uuid=True), ForeignKey(QualityRateComputer.id))
|
|
||||||
workbench_computer_id.comment = """The WorkbenchRate used to generate
|
|
||||||
this aggregation, or None if none used.
|
|
||||||
"""
|
|
||||||
workbench_computer = relationship(QualityRateComputer,
|
|
||||||
backref=backref('aggregate_rate_workbench',
|
|
||||||
lazy=True,
|
|
||||||
order_by=lambda: ResultRate.created,
|
|
||||||
collection_class=OrderedSet),
|
|
||||||
primaryjoin=workbench_computer_id == QualityRateComputer.id)
|
|
||||||
|
|
||||||
""" WORKBENCH MOBILE """
|
|
||||||
|
|
||||||
workbench_mobile_id = Column(UUID(as_uuid=True), ForeignKey(QualityRateMobile.id))
|
|
||||||
workbench_mobile_id.comment = """The WorkbenchRate used to generate
|
|
||||||
this aggregation, or None if none used.
|
|
||||||
"""
|
|
||||||
workbench_mobile = relationship(QualityRateMobile,
|
|
||||||
backref=backref('aggregate_rate_workbench',
|
|
||||||
lazy=True,
|
|
||||||
order_by=lambda: ResultRate.created,
|
|
||||||
collection_class=OrderedSet),
|
|
||||||
primaryjoin=workbench_mobile_id == QualityRateMobile.id)
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs) -> None:
|
|
||||||
kwargs.setdefault('version', StrictVersion('1.0'))
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def quality_rate(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def functionality_rate(cls, func: FunctionalityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def final_rate(cls, rate: Rate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Categories
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def quality_category(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def functionality_category(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def appearance_category(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def maket_value_category(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def cost_of_repair_category(cls, quality: QualityRate):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class DisplayRate(QualityRate):
|
class DisplayRate(QualityRate):
|
||||||
"""
|
"""
|
||||||
Calculate a DisplayRate
|
Calculate a DisplayRate
|
||||||
|
|
|
@ -119,13 +119,24 @@ def test_functionality_rate():
|
||||||
def test_functionality_rate_miss_tests():
|
def test_functionality_rate_miss_tests():
|
||||||
"""
|
"""
|
||||||
Functionality Rate Test
|
Functionality Rate Test
|
||||||
Test to check if functionality rate compute correctly without complete information of test.
|
Test to check if functionality rate compute correctly with some test without any information.
|
||||||
"""
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail(reason='Develop')
|
@pytest.mark.xfail(reason='Discuss')
|
||||||
|
def test_appearance_rate():
|
||||||
|
"""
|
||||||
|
Test to check if compute correctly a new rate of a device, only with visual test
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.xfail(reason='Discuss')
|
||||||
def test_update_rate_with_manual_rate():
|
def test_update_rate_with_manual_rate():
|
||||||
"""
|
"""
|
||||||
Test to check if compute correctly a new rate of a device, if this device input after a manual rate (like visual test)
|
Test to check if compute correctly a new rate of a device, if this device input after a manual rate (like visual test)
|
||||||
Computing a new rate with old snapshot information score and aggregate a new test information score.
|
Computing a new rate with old snapshot information score and aggregate a new test information score.
|
||||||
"""
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
Reference in New Issue