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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.