LINUX.ORG.RU

Тестовое задание, где я ошибся?


0

2

Добрый день. Решил я тут отправить резюме в компанию N и выполнить их тестовое задание. Само задание

Есть интерфейс:

public interface Rtriangle {
int getApexX1();
int getApexY1();
int getApexX2();
int getApexY2();
int getApexX3();
int getApexY3();
}

Методы возвращают 6 чисел — координаты трех вершин прямоугольного треугольника в декартовой системе координат.

Есть метод, возвращающий прямоугольный треугольник:

public final class RtriangleProvider {
public static Rtriangle getRtriangle() {
...
}
}

Напишите код junit теста, который будет проверять, действительно ли метод 
getRtriangle возвращает прямоугольный треугольник.
А вот jUnit тест
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mariarti.Rtriangle;
import org.mariarti.RtriangleProvider;

import java.util.*;

public class T_Rtriangle {
    private Rtriangle rtriangle = RtriangleProvider.getRtriangle();
    private int
            x1 = rtriangle.getApexX1(),
            y1 = rtriangle.getApexY1(),
            x2 = rtriangle.getApexX2(),
            y2 = rtriangle.getApexY2(),
            x3 = rtriangle.getApexX3(),
            y3 = rtriangle.getApexY3();
    private double
            sideTriangleA,
            sideTriangleB,
            sideTriangleC;
    private final static double delta = 0.0000000001;
    private List<Double> legs = new ArrayList<>();

    @Before
    public void initTest(){
        legs.add(getLength(x1, y1, x2, y2));
        legs.add(getLength(x2, y2, x3, y3));
        legs.add(getLength(x3, y3, x1, y1));
        Collections.sort(legs);
        sideTriangleA = legs.get(0);
        sideTriangleB = legs.get(1);
        sideTriangleC = legs.get(2);
    }

    public double getLength(int x1, int y1, int x2, int y2){
        return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));
    }

    @Test
    public void ACosTest(){
        double angleA = Math.acos(
                (Math.pow(sideTriangleB, 2) + Math.pow(sideTriangleC, 2) - Math.pow(sideTriangleA, 2))
                    / (2 * sideTriangleB * sideTriangleC));
        double angleB = Math.acos(
                (Math.pow(sideTriangleA, 2) + Math.pow(sideTriangleC, 2) - Math.pow(sideTriangleB, 2))
                    / (2 * sideTriangleA * sideTriangleC));
        double angleC = Math.acos(-1) - (angleA + angleB);
        Assert.assertEquals(Math.acos(0), angleC, delta);
    }

}
И меня слили. Господа, в чем я ошибся? Не могу ни спать ни есть пока не найду объяснений.



Последнее исправление: dr_mariarti (всего исправлений: 2)
Ответ на: комментарий от UVV

lol, так вон оно как компетентность то проверяют. По твоей логике 90-% ЛОРа - это некомпетентное быдло.

Так оно и есть же!

anonymous
()
Ответ на: комментарий от UVV

90% ЛОРа ещё не окончили школу/ВУЗ. А ещё есть клинические, вроде Царя (мог бы быть из него толк, если бы он понял, что ему ещё учиться надо и K&R всё поумнее него в СИшке были). Хотя и умных людей тут тоже предостаточно (в том числе и среди младшей возрастной группы, против которой я ничего не имею). Но почему некомпетентные обязательно быдло? Я могу сказать, что я некомпетентен в строительстве и ремонте, но я и не строитель, хотя и приходится вести большой ремонт дома (нанимать узбеков не хочу, да и дорого и некачественно они работают (положили мне плитку на кухне, не подождав, когда высохнет штукатурка, в результате плитка отвалилась вместе со штукатуркой)). Да, за 5 лет прерывающегося ремонта я стал лучше разбираться в том, как правильно делать пол и потолки (никогда не сажай деревянные и фанерные потолки на гвозди, используй только шурупы и клей), как штукатурить и класть плитку, но я далеко не строитель и не компетентен в этом, потому я и не работаю строителем.

А так да, задача то не выполнена. А представь себе, что ТС писал бы программу для управления чем-то опасным, вроде АЭС. Что бы было? Компетентный от некомпетентного, кроме скорости работы, отличается внимательностью и меньшим количеством очевидных ошибок (сложные и нетривиальные ошибки делают все). ТС тоже станет компетентным, со временем и опытом. Пока ему ИМХО немного не хватает практики/собранности.

peregrine ★★★★★
()
Ответ на: комментарий от UVV

Да ладно вам... Тут грамотно умеющих излагать свои мысли - кот наплакал. Спеллчекер хотя бы включить даже не в состоянии.

anonymous
()

Ну я могу замечания перечислить.

Во-первых поименовано коряво: надо

public class RtriangleTest {
 @Test
 public void testGetRtriangle() {
   // тут вся проверка и assert....
   // потому что когда тест отвалится, ты должен знать где 
   // и это должно быть не acos а "testGetRrrignale test failed"
 }
}
Во-вторых у тебя нету теста этой функции вообще, зато есть тест какой-то функции которая вообще не имеет отношения к классу Rtriangle.

В общем, слили правильно, imho.

С точки зрения проверяющего ты даже не оформил тест, наверное он даже по существу не смотрел после этого.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)

Весь тестируемый код нужно было засунуть в один метод, а не распихивать по разным местам. Собственно задание показало, что junit-ом ты не пользовался никогда и прочитал про него минут за 30 до выполнения задания и, судя по отказу, цели своей достигло.

Теорема пифагора vs косинус это уже частности, хотя, может, и они не понравились.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Если бы он всё нормально сделал, кроме теоремы Пифагора, то на это, скорее всего, закрыли бы глаза (если ТС не в гейм-дев (3D) пошёл устраиваться).

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Люди разные бывают, может какой-нибудь математический фрик принимал решение и он даже представить себе не может работу с человеком, который на такой простой задаче не применяет скалярное произведение или хотя бы теорему Пифагора. Но скорее всего да, конкретный алгоритм большого значения не имел.

Legioner ★★★★★
()

Итак, последняя версия на суд общественности. Вдруг кому то будет интересно. Да и ваше мнение мне дорого.

import org.junit.*;
import static org.junit.Assert.*;

import java.math.BigDecimal;
import java.util.*;

import org.mariarti.Rtriangle;
import org.mariarti.RtriangleProvider;


public class RtriangleTest {

    public BigDecimal getLengthPow2(int x1, int y1, int x2, int y2){
        return new BigDecimal(x1 - x2).pow(2).add(new BigDecimal(y1 - y2).pow(2));
    }

    private List<Rtriangle> rtriangleList;

    @Before
    public void setUp(){
        rtriangleList = new ArrayList<Rtriangle>();
        for(int i = 0; i < 10; i++){
            rtriangleList.add(RtriangleProvider.getRtriangle());
        }
    }

    @Test
    public void right_angledTriangleTest(){
        rtriangleList.forEach(
                x -> assertNotNull(x)
        );

        List<BigDecimal> triangleSide = new ArrayList<>();
        BigDecimal sideAB, sideBC, sideCA, nullSide = new BigDecimal(0.);

        for (Rtriangle rtriangle: rtriangleList){

            triangleSide.add(getLengthPow2(
                            rtriangle.getApexX1(), rtriangle.getApexY1(),
                            rtriangle.getApexX2(), rtriangle.getApexY2()
                    )
            );
            triangleSide.add(getLengthPow2(
                            rtriangle.getApexX2(), rtriangle.getApexY2(),
                            rtriangle.getApexX3(), rtriangle.getApexY3()
                    )
            );
            triangleSide.add(getLengthPow2(
                            rtriangle.getApexX3(), rtriangle.getApexY3(),
                            rtriangle.getApexX1(), rtriangle.getApexY1()
                    )
            );

            Collections.sort(triangleSide);

            triangleSide.forEach(
                    x -> assertTrue(x.compareTo(nullSide) != 0)
            );

            sideAB = triangleSide.get(0);
            sideBC = triangleSide.get(1);
            sideCA = triangleSide.get(2);

            assertTrue(sideCA.compareTo(sideAB.add(sideBC)) == 0);

            triangleSide.clear();
        }
    }
}

dr_mariarti
() автор топика
Ответ на: Потому что от peacelove

Вобщем согласен, но есть нюансы. Если в компании юзается общеизвестный ЯП (не свои костыли), то для жуниоров хорошо делать тесты, чтобы отсеять тех, кто даже строку на сях не отбаблсортит. А иначе что ты с ним делать будешь, когда он(а) в миллионострочный продакшен полезет?

Про массовое завлекание тоже согласен. Сам один раз был на таком «собеседовании». Пригласили студентоту из ближайшего техвуза, заказали 50 пиц+кокакол и попросили принести с собой проект, над которым школоло работал в свободное время. Затем по порядку подзывали, смотрели код и засирали своим высокостоящим мнением.
Так я спецом недорассказал про неожиданные тонкости работы софтины, на глаз отличающиеся от ожидаемого дефолтного поведения и смотрел как эти иксперты городили аргументы. Попросив на месте переписать «как надо» естественно услышал отсылы к книгам типа «чистый код» или «надо дорабатывать, код сырой». Тут да, быдло дорвалось до оформления своей шараги и блещет шпорами.

anonymous
()
Ответ на: Потому что от peacelove

А тесты у эйчаров так вообще курам на смех. Эйчар - по определению сущность убогая и ненужная. Годится разве что имейлы отсылать и информацию предоставлять когда у людей времени на это нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.