LINUX.ORG.RU

Тестирование «C» кода.

 , , ,


4

4

Всем привет ::) Господа, вы наверное будете в голос ржать, но я в жизни не занимался тестированием кода, вот прям сосем никогда, от того прошу советов как тестировать чем тестировать и что по теме почитать/поучить как это дело автоматизируется и прочее. Да есть google, но я как всегда иду туда в последнюю очередь. Ну и смею себе позволить позвать людей (кого с ходу вспомню) плотно работающий с «С». Cast DELIRIUM, i-rinat, beastie, ncrmnt, theNamelessOne, Murg, Iron_Bug. Всем добра и улыбашек ::)

По просьбе i-rinat пример кода (просто рандомный код из закромов откопанный/заброшенный/недописанный, в общем то что нужно)

#include <stddef.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

struct $struct_neuron
{
    size_t  id;
    struct  $struct_neuron ** sinapses_connections;
    size_t  sinapses_connections_size;
    float * sinapses_weight;
    struct  $struct_neuron ** acsons_connections;
    size_t  acsons_connections_size;
    float   acsons_result_signals;
    void   (*finp)();
    void   (*fmid)();
    void   (*fout)();
};typedef struct $struct_neuron struct_neuron;

struct $struct_network
{
    size_t id;
    size_t network_size;
    struct_neuron * neurons;
    struct $struct_network ** network_connections;
    size_t network_connections_size;;
};typedef struct $struct_network struct_network;


struct $struct_net_union
{
    size_t id;
    struct_network ** networks;
    size_t net_union_size;

};typedef struct $struct_net_union struct_net_union;


struct_neuron neuro_neuron_new(void);
void neuro_neuron_connect(struct_neuron* acson, struct_neuron * sinaps);

struct_network neuro_network_new(size_t neurons);
void neuro_network_connect(struct_network* net1, struct_network* net2);



#include "neuro.h"




struct_neuron neuro_neuron_new(void)
{
    static size_t id=0;
    struct_neuron neuron;
    neuron.id=id++;
    neuron.sinapses_connections      = NULL;
    neuron.sinapses_connections_size = 0;
    neuron.sinapses_weight           = NULL;
    neuron.acsons_connections        = NULL;
    neuron.acsons_connections_size   = 0;
    neuron.acsons_result_signals     = 0.0;
    return neuron;
}

void neuro_neuron_connect(struct_neuron * acson, struct_neuron * sinaps)
{
    sinaps->sinapses_weight = realloc(sinaps->sinapses_weight,sizeof(float)*sinaps->sinapses_connections_size+1);
    srand(clock());
    sinaps->sinapses_weight[sinaps->sinapses_connections_size] = (float)(rand()/100000009);
    sinaps->sinapses_connections = realloc(sinaps->sinapses_connections,sizeof(struct_neuron)*(sinaps->sinapses_connections_size+1));
    sinaps->sinapses_connections[sinaps->sinapses_connections_size++] = acson;
    acson->acsons_connections = realloc(acson->acsons_connections,sizeof(struct_neuron)*(acson->acsons_connections_size+1));
    acson->acsons_connections[acson->acsons_connections_size++] = sinaps;
}



struct_network neuro_network_new(size_t neurons)
{
    static size_t id = 0;
    struct_network network;
    network.id = id++;
    network.network_size = neurons;
    network.neurons = NULL;
    network.network_connections = NULL;
    network.network_connections_size = 0;
    network.neurons = malloc(sizeof(struct_neuron)*neurons);
    for(size_t i = 0; i < neurons; i++)
    {
        network.neurons[i] = neuro_neuron_new();
    };
    return network;
};

void neuro_network_connect(struct_network * net1, struct_network *net2)
{
    net1->network_connections = realloc(net1->network_connections,sizeof(struct_network)*(net1->network_connections_size+1));
    net1->network_connections[net1->network_connections_size++] = net2;
    net2->network_connections = realloc(net2->network_connections,sizeof(struct_network)*(net2->network_connections_size+1));
    net2->network_connections[net2->network_connections_size++] = net1;
    for(size_t i = 0; i < net1->network_size; i++)
    {
        for(size_t p = 0; p < net2->network_size; p++)
        {
            neuro_neuron_connect(&net1->neurons[i],&net2->neurons[p]);
        };
    };
};


struct_net_union neuro_net_union_new()
{
    static size_t id=0;
    struct_net_union net_union;
    net_union.id=id++;
    net_union.networks=NULL;
    net_union.net_union_size=0;
    return net_union;
}

void neuro_net_union_add(struct_net_union * net_union, struct_network * network)
{
    net_union->networks = realloc(net_union->networks,sizeof(struct_network)*(net_union->net_union_size+1));
    net_union->networks[net_union->net_union_size] = network;
    net_union->net_union_size++;
}




#include "neuro.h"


int main(int argc, char const *argv[])
{

	struct_network  net1 = neuro_network_new(100);

	struct_network  net2 = neuro_network_new(100);

	neuro_network_connect(&net1,&net2);

	
	return 0;
}
gcc -g neuro.c main.c -o neuro
★★★★★

Последнее исправление: Dron (всего исправлений: 3)
Ответ на: комментарий от yoghurt

Да, это кусок старого заброшенного когда for fun как говорится, мне нравилась идея что я руками задаю явно соединения между «нейронами» а после создания каждому нейрону или блоку нейронов указываю обрабатывающие функции тела и после создания сети каждое тело сети распаралеливается на десятки тысячи нитей процессов и начинает жить своей жизнью создавая новые связи и разрывая старые...отжирая всю память с процессорным времением и ложа систему на плечи :D Эксперименты короче =)

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

Пасиба) Пищи для ума с этого треда и от тебя конкретно уже гора, осталось только не лениться

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

только TDD - не классика никакая ни для чего, что связано с тестированием. как методика, помогающая научиться писать тестируемый код - да. как методика, помогающая писать self-documented код - да. как методика, помогающая проверять код - нет и быть им не может по определению.

написанный по TDD код в любом случае будет нуждаться в дополнительном покрытии тестами, и тут уже всплывают совсем другие вещи.

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

Ты просто два разных сообщения зачем-то слил в одно. Господи, неужели люди разучились читать, что написано? O_O

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

в который коммитит всякая пионерия

бить по результатам ревью по рукам - не в духе опенсорса

в нормально организованном процессе, а не опенсорсном бардаке

Феноменальная толстота

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

Моё мнение: нужны и unit-тесты и функциональные/интеграционные, причём отчёт по покрытию я бы делал и анализировал отдельно по каждой группе. Если ресурсов мало, то да, функциональщина в приоритете, но только если реальный дефицит времени, ибо глубоко там не копнёшь, все кейсы не покроешь и м.б., напр., ситуация, когда ошибка на ошибку даёт OK.

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

Ещё из интересного заметил, что очень часто люди после перехода на TDD бывают искренне согласны, что весь их предыдущий код можно смело выбросить на помойку. Однако введение TDD - ОООООЧЕНЬ нелёгкий вид спорта, особенно в уже сложившихся коллективах, тем более в различных «оборонных ящиках».

illy
()

Ну во-первых ты перепутал си и С/С++-химеру.

struct $struct_network//оно итак в отдельном неймспейсе
{
    size_t id;
    size_t network_size;
    struct_neuron * neurons;
    struct $struct_network ** network_connections;
    size_t network_connections_size;;
};typedef struct $struct_network struct_network;//это можно писать сразу

    void   (*fout)();//это так же С/С++

По поводу тестов, если ты пишешь для себя, либо тебя не заставляют упарываться дерьмом - просто сделай:

#ifndef NDEBUG
#define decltest __attribute__((constructor)) static inline
#else
#define decltest __attribute__((unused)) static inline
#endif

uint64_t add(uint64_t a, uint64_t b) {return a - b;}

decltest void add_test() {
  assert(add(2, 2) == 4);
}

А далее уже прикручивай что хочешь. Тут есть и приоритеты. Таким образом можно тестировать всё что угодно и как угодно. Можно собирать/тестировать отдельные части. Просто впихнул куда угодно void main(void){} и у тебя всё запуститься.

По сравнению со всей это парашей на макросне - это просто прекрасно.

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

Касаемо кода, я уже не помню почему писал именно так, ну это дело бородатое уже, не помню нужно это было так или хотелось просто )

Касаемо тестов, как вариант, один из, спасибо =)

Dron ★★★★★
() автор топика
Последнее исправление: Dron (всего исправлений: 1)
Ответ на: комментарий от anonymous

сделайте уже редактирование для анонов, сколько можно

Так сделали уже. Регистрируешься на LOR и редактируешь.

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

Ну, я ещё не определился с понятием вменяемость в тестах, так что пока что один из =)

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