Silv
2019-08-07 04:36

Moja aplikacja bracket-string-validator nabiera piór i kształtów nie, kształtów nie.

Mięśni raczej nie. Nadal dwie funkcjonalności: sprawdzanie poprawności wyrażenia nawiasowego oraz testowanie wydajności (benchmarking). (Co by tu można dodać?)

Ale za to część odpowiedzialną za sprawdzanie poprawności wyrażenia nawiasowego mam już napisaną (zbyt dużo powiedziane) w Angularze. (Jeszcze muszę dodać testowanie wydajności.) To raz. Dwa, że planuję przepisać część logiki na Javę, nadto dodać GUI w C oraz bazę danych obsługującą SQL.

Kłopot trochę z testami jednostkowymi i integracyjnymi. Same testy pisze się w miarę zwyczajnie, przynajmniej w JavaScripcie. Oby tylko w innych technologiach nie było innych podejść (?). W Javie to jeszcze mogę sobie to jakoś wyobrazić, "zekstrapolować" z JavaScriptu, ale w C i w Bashu nie... będę musiał się nauczyć. Nie ma rady! Też testowanie na różnych środowiskach – trzeba mi ogarnąć Travisa i jego konfigurację. Nie wiem, czy da się ustawić konkretną dystrybucję Linuksa. Zresztą, czego ja oczekuję za darmo? Przy czym jest też plan, z początków tworzenia aplikacji, by postarać się o większą generyczność implementacji, co bym nie musiał martwić się dystrybucją. Jednak to mniej ważna sprawa, dodatek w zasadzie. Aplikacja ma działać na jednym środowisku bezbłędnie; inne – opcjonalnie i w nieokreślonej przyszłości.

W tym świetle na dalszy plan schodzi rozbudowa obecnego interfejsu CLI. Planuję m.in. dodać debug mode. I tyle. Miałbym pewnie więcej pomysłów, ale w sumie nie ma sensu, dopóki (eee... albo "skoro") nikt tego nie używa.

Z bardziej operacyjnych spraw: nadal nie wiem, jak powinien u mnie wyglądać deployment (zob. też wątek na naszym forum). Przy tylu technologiach robi się skomplikowanie... ale przy tym fajnie. :) (W teorii. Najprzyjemniej rozmyślać o tym, czego to ja nie zaimplementuję.)

Myślę też... nad PHP (tak ostrożnie). Ale prawie go nie znam. Nie wiem, czy chce mi się uczyć na tę imprezę. Ale jakby... byłby przyczynek dla mnie do ruszenia Coyote. Ale to znów... Docker. A Dockera nie mam w planach. (Jeszcze?)

Dla chętnych: planowanych jest parę innych, mniej "przebojowych" spraw – można rzucić okiem: https://github.com/silvuss/si[...]acket-string-validator/issues


Nie jest to celem tego wpisu, ale – jeśli ktoś chciałby pomóc (wiedzą), to bardzo chętnie. :) Tutaj wątek, w którym proszę o ocenę: Ocena małego projektu JS (Node.js) + Bash

#bracket-string-validator #javascript #c #bash #cli #gui #web #angular #java #sql #database #deployment #php #recenzja #nodejs

baant

pierwsze co rzuca się w oczy po kliknięciu to labelka [build | error] :c

vpiotr

TL;DR. Nie wiem co jest celem tego projektu? EGSS (Enterprajs-Grejd Spoj Solution)? Czy coś w rodzaju JIT Brainf**ka?

Jeśli to drugie to można jeszcze dodać: 1) analizator gdzie brakuje nawiasów
2) generator losowego poprawnego (lub nie) ciągu
3) generatora danych testowych - czyli to co w 2 tylko cały zestaw np. wszystkich kombinacji 10-znakowych wraz z flagą czy poprawny czy nie.
4) kross-kompilator z wyrażenia nawiasowego do Whitespace

Proponowałbym się skupić na razie na jednej technologii. Na razie build ma error.
Ew. po opisaniu co to robi zachęcić innych programistów do implementacji w innych technologiach. Najłatwiej to będzie zrobić z CLI.

Shizzer

CMocka to dość przyjemny framework do testów jednostkowych w C - > https://cmocka.org/ Polecam

Silv

@baant: prawda. Rzuciłem wczoraj okiem na błąd, ale uznałem, że jego rozwiązanie leży w gestii Travisa. Jeśli będzie się przedłużać, spróbuję sam coś zrobić.
@danek: rozwiń się. ;)
@vpiotr: celem jest pokazanie, co umiem. Zresztą opisałem cele tutaj: https://silvuss.github.io/201[...]ml#ambitions-and-expectations. Hm: 1) dobre, spróbuję; 2) dobre, spróbuję; w zasadzie już mam/miałem napisany w wewnętrznym kodzie; 3) myślę, że wystarczy nr 2; 4) dobre! spróbuję; nie znałem Whitespace. Build error – napisałem wyżej. Ostatnia porada też nie od parady, ale myślę, że ten projekt będzie moim prywatnym. Niech każdy robi z nim, co chce (zgodnie z licencją, która obowiązuje/będzie obowiązywać), ale ja robię swoje.

no_solution_found

a tak z innej beczki - po co ten projekt jest potrzebny? Jaki problem to rozwiązuje?

no_solution_found

o matko, ale on skacze po wszystkim. Mam wrażenie, że dłużej pisałeś readme niż sam projekt :) Co do dockera to IMO i tak i tak Cię to czeka. Przynajmniej podstawy. Poza tym, jeśli jest dobrze skonfigurowany, to nie musisz go w ogóle znać - wystarczy docker-compose. Co do testów integracyjnych, to jakie konkretnie testy masz na myśli?

Silv

@no_solution_found: sensowne pytanie! Rozwiązuje problem braku moich projektów, w których nie ma niczego ciekawego od strony technologicznej.

Ile pisałem README? Nie wiem, ale całą dokumentację porównywalnie z kodem, myślę.

Czemu Docker mnie czeka?

Testy integracyjne – zauważyłem, że w internecie, w tym u nas na forum, panuje tendencja do nazywania tak różnych rodzajów testów. Spodobała mi się definicja @jarekr000000 z tego postu. Robię je analogicznie do jednostkowych. Jednostkowe u mnie sprawdzają, czy każda z funkcji/metod danego modułu zwraca dane wyjście dla danego wejścia lub rzuca wyjątkiem; w przypadku zależności zewnętrznych – robię ich atrapy (mówiąc oględnie; nie znam się na nazewnictwie jeszcze). Integracyjne sprawdzają to samo, przy czym w przypadku zależności zewnętrznych nie robię ich atrap. I tak, na przykład, odwołując się do innego modułu w testach jednostkowych robiłbym jego atrapę, a w testach integracyjnych nie (rozumując, że ten moduł został przetestowany przez swoje testy jednostkowe).

no_solution_found

jednostka to nie pojedyczna metoda w klasie czy nawet klasa. Raczej to jakaś grupa elementów, która łącznie daje jakąś logiczną całość. Testy integracyjne integrują jakieś elementy ze sobą. Np Aplikację z bazą danych czy zewnętrzną usługą. Dlatego się zastanawiam między jakimi elementami Ty testujesz integrację :)

Silv

@no_solution_found: rozumiem, a skąd taka definicja jednostki? Moim zdaniem jednostka to funkcja/metoda/klasa/moduł, tak jest napisane np. w Wikipedii: In procedural programming, a unit could be an entire module, but it is more commonly an individual function or procedure. (https://en.wikipedia.org/wiki/Unit_testing#Description) Wybrałem akurat metody/funkcje – tak jakoś najłatwiej mi było testować; np. klasa nie ma wejścia i wyjścia.

Testuję integrację między dwoma modułami. Jak napisałem, z informacji w internecie odniosłem wrażenie, że testy integracyjne mogą być zdefiniowane różnie. Wybrałem akurat taką definicję, myślę, że jest w porządku.

Ale dzięki za inny punkt widzenia, na pewno poszerza to moje spojrzenie. :)

no_solution_found

@Silv to jest właśnie mylne spostrzerzenie :) oczywiście zależy od tego jak wygląda nasza domena, Kiedyś pisałem artykuł na ten ten temat. Muszą go w końcu dokończyć! Tu masz opisane mniej więcej to o czym ja mówię: http://softwaretestingfundamentals.com/unit-testing/ `Definition by ISTQB

unit testing: See component testing.
component testing: The testing of individual software components.`

przy czym komponent może być mały jak klasa albo cały komponent np koszyka i później możesz testować czy ten komponent integruje się z zamówieniami a zamówienia z magazynem itp

Silv

@no_solution_found: nie mogę znaleźć na podanej stronie jej autorów; może Ty znalazłeś? Jak skończysz artykuł, chętnie go przeczytam. Tylko nie zapomnij podać źródeł. ;)

somekind

@Silv: definicja jednostki znajduje się w każdym słowniku. Człowiek jest jednostką i sam niezależnie może wykonać jakąś pracę. Sama ręka jednostką nie jest, bez reszty człowieka jest bezużyteczna.

Silv

@somekind: poprzez analogię: funkcja jest jednostką, metoda nie? Teoretycznie mogę się zgodzić. Jaki słownik masz na myśli, przykładowo?

danek

@Silv: czym się różni funkcja od metody?

danek

@somekind: akurat z definicją jednostki to są problemy ;)

Silv

@danek: ja je odróżniam w ten sposób, że "funkcja" jest elementem programowania proceduralnego, a "metoda" – obiektowego. To rozróżnienie w szerszym niż mój kontekście może być błędne, ale na razie nie mam podstaw, by tak twierdzić.

somekind

Na przykład słownik języka polskiego. Ani funkcja ani metoda nie jest jednostką, ale zarówno funkcja jak i metoda może nią być. Jednostka to coś, co stanowi odrębną całość, jeśli funkcja/metoda spełnia ten warunek, to jest jednostką. Jeśli nie, to nie.

Silv

@somekind: a co jest "odrębną całością"? Mam wrażenie, że każdy może sam to zdefiniować.

somekind

Czy ręka działa bez człowieka?

Silv

Wolałbym nie porównywać programu do ciała ludzkiego, w ogóle do żadnego. Czy definicja jednostki na Wikipedii, którą podałem wyżej, jest zła?

somekind

Nie widziałem jej wcześniej. Ta definicja jest nieco zbyt subiektywna jak na encyklopedię, ale nie jest zła. Jednostką może być moduł, a może być funkcja. W programowaniu obiektowym jednostką może być jedna metoda, obiekt albo zespół obiektów. Nie ma znaczenia z ilu elementów się składa, ważne jest, czy samodzielnie jest w stanie wykonać jakieś zadanie. To jest o tyle ważne, że w toku pracy może np. najpierw powstać jednostka będąca jedną wielką metodą, można napisać do niej testy, a potem można ją zrefaktoryzować i zamienić na zestaw obiektów, bez ruszania testów - to jest produktywne. W przypadku bezsensownego podejścia jednostka == klasa, refaktoryzacja jest uciążliwa.

danek

@somekind: zamiast używać określeń "jednostkowy", "integracyjny", "akceptacyjny", "cokolwiek" bardziej bym się skłaniał ku rozdzieleniu: czy mogę je odpalić w ciągu <3s przed commitem, czy odpalają się przed release

Silv

@somekind: nie rozumiem. Przecież jeśli tę wielką metodę zmieni się na zestaw obiektów bez ruszania testów, to oznaczałoby według Twojej definicji, że żaden z tych obiektów nie jest odrębną całością. Jak "obiekt" – w rozumieniu, powiedzmy, programowania obiektowego – może nie być odrębną całością?

somekind

@danek: słyszałem o takim podziale na jakieś "pre-commit' i "post-commit" testy u swoich Hindusów, niestety w ogóle nie rozumiem o co chodzi, i jaki testy mogą w ogóle mieć związek z commitem. Nie stosuję takiego rozróżnienia, ja jedne testy odpalam częściej, inne rzadziej, ale z commitami czy releasami to nie ma związku żadnego.

@Silv: Jest odrębnym obiektem, ale nie jest odrębną jednostką, a jedynie jej częścią.

danek

chodzi mi o rozdzielenie testów które odpalasz w IDE lokalnie, a jakieś dzikie regresyjne które gdzieś na serwerze działają.

danek

inne dzielenie testów jest tylko semantyką 

Silv

@somekind: w kwestii testów – może chodzi o coś takiego? -> http://eng.wealthfront.com/2012/01/26/pre-commit-tests/ W kwestii obiektów: dla mnie "obiekt" (=klasa) z definicji jest odrębną jednostką. Może oczywiście należeć do większej jednostki – przestrzeni nazw czy modułu.

Silv

@danek: dzikie regresyjne testy pustoszące zrównujące z ziemią build na serwerze – sobie wyobraziłem. :D

somekind

@danek: ja lokalnie odpalam zarówno testy jednostkowe, jak i integracyjne testujące przepływy biznesowe (zarówno w formie wywołań pojedynczych endpointów, jak i ich sekwencji). Te pierwsze, gdy uznam za stosowne, te drugie również (ale z oczywistego powodu rzadziej). No i zawsze przed pushem. Testy też są odpalane po deploymencie na testowe środowiska. I tam też działa jeszcze więcej testów regresyjnych, ale pisanych już przez testerów, nie programistów. Tak więc, w ogóle Twoje definicje nie przystają do moich realiów.

@Silv: Ty piszesz o jednostkach organizacji kodu. Tymczasem w testach jednostkowych nie chodzi wcale o testowanie organizacji kodu, ale jego zachowania.

Silv

@somekind: nie słyszałem o takim podziale (albo mi umknął). Możesz rozwinąć?

somekind

O ile dobrze zrozumiałem te Twoje słowa: dla mnie "obiekt" (=klasa) z definicji jest odrębną jednostką. Może oczywiście należeć do większej jednostki – przestrzeni nazw czy modułu., to widzę, że skupiasz się na organizacji kodu: jego podziale na funkcje, metody, klasy, moduły, przestrzenie nazw. Tymczasem jednostki w sensie testowania, to nie są elementy organizacji kodu, tylko odrębne całości, które dostarczają jakiejś funkcjonalności. Nie ma znaczenia ile mają linii kodu, czy są funkcją, klasą czy modułem, ważne jest, czy robią coś niezależnego i wartego testowania.

Silv

Ach, to już rozumiem. Chyba. W takim razie... w takim razie odpowiada to definicji z Wikipedii (która także stara się wyjść poza organizację kodu). Ale nie wiem, jakby takie rozróżnienie miało wyglądać w praktyce... w tym programie i tak testuję jednostkowo tylko to, co ma dobrze zdefiniowane wejście i wyjście.

somekind

Tzn. ja się nie odnoszę do Twojego programu, nie zaglądałem nawet do kodu. Piszę ogólnie.