సూచనలు: అసలైన పాత్రలను ఎలా పరీక్షించాలి మరియు ఉత్పత్తికి ముందు సమస్యల గురించి తెలుసుకోవడం

హలో అందరికీ!

నేను హోటల్ బుకింగ్ సర్వీస్‌లో DevOps ఇంజనీర్‌గా పని చేస్తున్నాను. Ostrovok.ru. ఈ ఆర్టికల్‌లో, యోగ్యమైన పాత్రలను పరీక్షించడంలో మా అనుభవం గురించి నేను మాట్లాడాలనుకుంటున్నాను.

Ostrovok.ru వద్ద, మేము ansibleని కాన్ఫిగరేషన్ మేనేజర్‌గా ఉపయోగిస్తాము. ఇటీవల, మేము పాత్రలను పరీక్షించాల్సిన అవసరానికి వచ్చాము, కానీ అది ముగిసినప్పుడు, దీని కోసం చాలా సాధనాలు లేవు - అత్యంత ప్రజాదరణ పొందినది, బహుశా, మాలిక్యూల్ ఫ్రేమ్‌వర్క్, కాబట్టి మేము దానిని ఉపయోగించాలని నిర్ణయించుకున్నాము. కానీ అతని డాక్యుమెంటేషన్ చాలా ఆపదల గురించి మౌనంగా ఉందని తేలింది. మేము రష్యన్ భాషలో తగినంత వివరణాత్మక మాన్యువల్‌ను కనుగొనలేకపోయాము, కాబట్టి మేము ఈ కథనాన్ని వ్రాయాలని నిర్ణయించుకున్నాము.

సూచనలు: అసలైన పాత్రలను ఎలా పరీక్షించాలి మరియు ఉత్పత్తికి ముందు సమస్యల గురించి తెలుసుకోవడం

మాలిక్యూల్

అణువు - అసాన్సిబుల్ పాత్రలను పరీక్షించడంలో సహాయపడే ఫ్రేమ్‌వర్క్.

సరళీకృత వివరణ: మీరు పేర్కొన్న ప్లాట్‌ఫారమ్‌లో అణువు ఒక ఉదాహరణను సృష్టిస్తుంది (క్లౌడ్, వర్చువల్ మెషీన్, కంటైనర్; మరిన్ని వివరాల కోసం, విభాగాన్ని చూడండి డ్రైవర్), దానిపై మీ పాత్రను అమలు చేసి, ఆపై పరీక్షలను అమలు చేసి, ఉదాహరణను తొలగిస్తుంది. దశల్లో ఒకదానిలో విఫలమైతే, మాలిక్యూల్ దాని గురించి మీకు తెలియజేస్తుంది.

ఇప్పుడు మరింత.

సిద్ధాంతం యొక్క బిట్

అణువు యొక్క రెండు కీలక అంశాలను పరిగణించండి: దృశ్యం మరియు డ్రైవర్.

దృష్టాంతంలో

స్క్రిప్ట్‌లో ఏమి, ఎక్కడ, ఎలా మరియు ఏ క్రమంలో ప్రదర్శించబడుతుందనే వివరణ ఉంటుంది. ఒక పాత్ర అనేక స్క్రిప్ట్‌లను కలిగి ఉంటుంది మరియు ప్రతి ఒక్కటి మార్గం వెంట డైరెక్టరీగా ఉంటుంది <role>/molecule/<scenario>, ఇది పరీక్షకు అవసరమైన చర్యల వివరణలను కలిగి ఉంటుంది. స్క్రిప్ట్ తప్పనిసరిగా చేర్చబడాలి default, మీరు మాలిక్యూల్‌తో పాత్రను ప్రారంభించినట్లయితే ఇది స్వయంచాలకంగా సృష్టించబడుతుంది. కింది స్క్రిప్ట్‌ల పేర్లు మీ ఇష్టం.

స్క్రిప్ట్‌లో చర్యలను పరీక్షించే క్రమాన్ని అంటారు మాత్రిక, మరియు డిఫాల్ట్‌గా ఇది:

(దశలు లేబుల్ చేయబడ్డాయి ?, వినియోగదారు పేర్కొనకపోతే డిఫాల్ట్‌గా దాటవేయబడుతుంది)

  • lint - నడుస్తున్న లింటర్లు. డిఫాల్ట్‌గా ఉపయోగించబడతాయి yamllint и flake8,
  • destroy - మాలిక్యూల్ చివరి ప్రయోగానికి సంబంధించిన సందర్భాలను తొలగించడం (ఏదైనా ఉంటే),
  • dependency? - పరీక్షించిన పాత్ర యొక్క అసలైన డిపెండెన్సీ యొక్క సంస్థాపన,
  • syntax - ఉపయోగించి పాత్ర యొక్క వాక్యనిర్మాణాన్ని తనిఖీ చేస్తోంది ansible-playbook --syntax-check,
  • create - ఒక ఉదాహరణను సృష్టించడం,
  • prepare? - ఉదాహరణ తయారీ; ఉదా. python2ని చెక్/ఇన్‌స్టాల్ చేయండి
  • converge - పరీక్షిస్తున్న ప్లేబుక్ ప్రారంభం,
  • idempotence - ఐడెంపోటెన్సీ పరీక్ష కోసం ప్లేబుక్‌ని పునఃప్రారంభించడం,
  • side_effect? - చర్యలు నేరుగా పాత్రకు సంబంధించినవి కావు, కానీ పరీక్షలకు అవసరమైనవి,
  • verify - ఉపయోగించి ఫలిత కాన్ఫిగరేషన్ యొక్క పరీక్షలను అమలు చేయడం testinfra(డిఫాల్ట్) /goss/inspec,
  • cleanup? - (కొత్త సంస్కరణల్లో) - స్థూలంగా చెప్పాలంటే, మాలిక్యూల్ ద్వారా ప్రభావితమైన బాహ్య మౌలిక సదుపాయాలను "శుభ్రపరచడం",
  • destroy - ఒక ఉదాహరణను తొలగిస్తోంది.

ఈ క్రమం చాలా సందర్భాలలో వర్తిస్తుంది, అయితే అవసరమైతే మార్చవచ్చు.

పైన పేర్కొన్న ప్రతి దశలను విడిగా అమలు చేయవచ్చు molecule <command>. కానీ అలాంటి ప్రతి క్లై-కమాండ్‌కు దాని స్వంత చర్యల క్రమం ఉండవచ్చు, దానిని మీరు అమలు చేయడం ద్వారా కనుగొనవచ్చు. molecule matrix <command>. ఉదాహరణకు, ఆదేశాన్ని అమలు చేస్తున్నప్పుడు converge (పరీక్షలో ప్లేబుక్‌ని అమలు చేయడం), కింది చర్యలు నిర్వహించబడతాయి:

$ molecule matrix converge
...
└── default         # название сценария
    ├── dependency  # установка зависимостей
    ├── create      # создание инстанса
    ├── prepare     # преднастройка инстанса
    └── converge    # прогон плейбука

ఈ చర్యల క్రమాన్ని సవరించవచ్చు. జాబితా నుండి ఏదైనా ఇప్పటికే పూర్తి చేసినట్లయితే, అది దాటవేయబడుతుంది. ప్రస్తుత స్థితి, అలాగే ఉదాహరణల కాన్ఫిగరేషన్, మాలిక్యూల్ డైరెక్టరీలో నిల్వ చేస్తుంది $TMPDIR/molecule/<role>/<scenario>.

తో దశలను జోడించండి ? మీరు కావలసిన చర్యలను ansible-playbook ఆకృతిలో వివరించవచ్చు మరియు దశ ప్రకారం ఫైల్ పేరును తయారు చేయవచ్చు: prepare.yml/side_effect.yml. ఈ ఫైల్‌లను ఆశించండి అణువు స్క్రిప్ట్ ఫోల్డర్‌లో ఉంటుంది.

డ్రైవర్

డ్రైవర్ అనేది పరీక్షా సందర్భాలు సృష్టించబడిన ఒక సంస్థ.
Molecule సిద్ధంగా ఉన్న టెంప్లేట్‌లను కలిగి ఉన్న ప్రామాణిక డ్రైవర్‌ల జాబితా క్రింది విధంగా ఉంది: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Deligated.

చాలా సందర్భాలలో, టెంప్లేట్‌లు ఫైల్‌లు create.yml и destroy.yml స్క్రిప్ట్ ఫోల్డర్‌లో వరుసగా ఒక ఉదాహరణ యొక్క సృష్టి మరియు తొలగింపును వివరిస్తుంది.
మినహాయింపులు డాకర్ మరియు వాగ్రాంట్, ఎందుకంటే వాటి మాడ్యూల్‌లతో పరస్పర చర్యలు పైన పేర్కొన్న ఫైల్‌లు లేకుండానే జరుగుతాయి.

డెలిగేటెడ్ డ్రైవర్‌ను హైలైట్ చేయడం విలువైనది, ఎందుకంటే ఇది ఒక ఉదాహరణను సృష్టించడం మరియు తొలగించడం కోసం ఫైల్‌లలో ఉపయోగించినట్లయితే, ఉదాహరణల కాన్ఫిగరేషన్‌తో మాత్రమే పని వివరించబడుతుంది, మిగిలిన వాటిని ఇంజనీర్ వివరించాలి.

డిఫాల్ట్ డ్రైవర్ డాకర్.

ఇప్పుడు అభ్యాసానికి వెళ్దాం మరియు అక్కడ మరిన్ని లక్షణాలను పరిశీలిద్దాం.

ప్రారంభ విధానం

"హలో వరల్డ్"గా, ఒక సాధారణ nginx ఇన్‌స్టాలేషన్ పాత్రను పరీక్షిద్దాం. మేము డాకర్‌ని డ్రైవర్‌గా ఎంచుకుంటాము - మీలో చాలామంది దీన్ని ఇన్‌స్టాల్ చేశారని నేను భావిస్తున్నాను (మరియు డాకర్ డిఫాల్ట్ డ్రైవర్ అని గుర్తుంచుకోండి).

సిద్ధం చేద్దాం virtualenv మరియు దానిలో ఇన్స్టాల్ చేయండి molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule установит ansible как зависимость; docker для драйвера

తదుపరి దశ కొత్త పాత్రను ప్రారంభించడం.
కొత్త పాత్రను ప్రారంభించడం, అలాగే కొత్త స్క్రిప్ట్, ఆదేశాన్ని ఉపయోగించి నిర్వహించబడుతుంది molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars

6 directories, 1 file

ఇది ఒక సాధారణ పాత్ర-పాత్రగా మారింది. ఇంకా, CLI అణువులతో అన్ని పరస్పర చర్యలు పాత్ర యొక్క మూలం నుండి తయారు చేయబడతాయి.

పాత్ర డైరెక్టరీలో ఏముందో చూద్దాం:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-шаблон для Dockerfile
├── INSTALL.rst.   # Немного информации об установке зависимостей сценария
├── molecule.yml   # Файл конфигурации
├── playbook.yml   # Плейбук запуска роли
└── tests          # Директория с тестами стадии verify
    └── test_default.py

1 directory, 6 files

కాన్ఫిగరేషన్‌ను విశ్లేషిద్దాం molecule/default/molecule.yml (డాకర్ చిత్రాన్ని మాత్రమే భర్తీ చేయండి):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

డిపెండెన్సీ

ఈ విభాగం డిపెండెన్సీల మూలాన్ని వివరిస్తుంది.

సాధ్యమైన ఎంపికలు: గెలాక్సీ, వర్తిస్తుంది, షెల్.

షెల్ అనేది గెలాక్సీ మరియు గిల్ట్ మీ అవసరాలను కవర్ చేయని సందర్భంలో ఉపయోగించే కమాండ్ షెల్ మాత్రమే.

నేను ఎక్కువ కాలం ఇక్కడ నివసించను, అది తగినంతగా వివరించబడింది డాక్యుమెంటేషన్.

డ్రైవర్

డ్రైవర్ పేరు. మాది డాకర్.

మెత్తటి

లింటర్ యమ్లింట్.

config యొక్క ఈ భాగంలో ఉపయోగకరమైన ఎంపికలు yamllint, ఫార్వర్డ్ ఎన్విరాన్మెంట్ వేరియబుల్స్ కోసం కాన్ఫిగరేషన్ ఫైల్‌ను పేర్కొనడం లేదా లింటర్‌ను నిలిపివేయడం:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

వేదికల

ఉదంతాల కాన్ఫిగరేషన్‌ను వివరిస్తుంది.
డ్రైవర్‌గా డాకర్ విషయంలో, మాలిక్యూల్ ఈ విభాగంపై పునరావృతమవుతుంది మరియు జాబితాలోని ప్రతి మూలకం దీనిలో అందుబాటులో ఉంటుంది Dockerfile.j2 వేరియబుల్ గా item.

అవసరమైన డ్రైవర్ విషయంలో create.yml и destroy.yml, విభాగం వాటిలో అందుబాటులో ఉంది molecule_yml.platforms, మరియు దానిపై పునరావృత్తులు ఇప్పటికే ఈ ఫైల్‌లలో వివరించబడ్డాయి.

మాలిక్యూల్ అన్సిబుల్ మాడ్యూల్‌లకు ఉదాహరణల నియంత్రణను అందిస్తుంది కాబట్టి, సాధ్యమయ్యే సెట్టింగ్‌ల జాబితా కూడా అక్కడ వెతకాలి. డాకర్ కోసం, ఉదాహరణకు, మాడ్యూల్ ఉపయోగించబడుతుంది డాకర్_కంటైనర్_మాడ్యూల్. ఇతర డ్రైవర్లలో ఏ మాడ్యూల్స్ ఉపయోగించబడుతున్నాయో కనుగొనవచ్చు డాక్యుమెంటేషన్.

అలాగే వివిధ డ్రైవర్ల ఉపయోగం యొక్క ఉదాహరణలు చూడవచ్చు అణువు యొక్క పరీక్షలలోనే.

ఇక్కడ భర్తీ చేయండి సెంటోస్:7ఉబుంటు.

ప్రొవిజనర్

"సప్లయర్" - సందర్భాలను నిర్వహించే ఒక సంస్థ. మాలిక్యూల్ విషయంలో, ఇది అసంబద్ధమైనది, ఇతరులకు మద్దతు ప్రణాళిక చేయబడదు, కాబట్టి ఈ విభాగాన్ని ఒక మినహాయింపుతో అన్సిబుల్ పొడిగించిన కాన్ఫిగరేషన్ అని పిలుస్తారు.
ఇక్కడ మీరు చాలా విషయాలను పేర్కొనవచ్చు, నా అభిప్రాయం ప్రకారం నేను ప్రధాన అంశాలను హైలైట్ చేస్తాను:

  • ప్లేబుక్స్: నిర్దిష్ట దశల్లో ఏ ప్లేబుక్స్ ఉపయోగించాలో మీరు పేర్కొనవచ్చు.

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • ఎంపికలు: అన్సిబుల్ ఎంపికలు మరియు ఎన్విరాన్మెంట్ వేరియబుల్స్

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

దృష్టాంతంలో

స్క్రిప్ట్ సీక్వెన్స్‌ల పేరు మరియు వివరణ.
మీరు కీని జోడించడం ద్వారా ఏదైనా కమాండ్ యొక్క డిఫాల్ట్ యాక్షన్ మ్యాట్రిక్స్‌ని మార్చవచ్చు <command>_sequence మరియు మనకు అవసరమైన దశల జాబితాను నిర్వచించడం ద్వారా దానికి విలువగా.
ప్లేబుక్ రన్ ఆదేశాన్ని అమలు చేస్తున్నప్పుడు మేము చర్యల క్రమాన్ని మార్చాలనుకుంటున్నాము: molecule converge

# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

తనిఖీ

పరీక్షల కోసం ఒక ఫ్రేమ్‌వర్క్‌ను మరియు దానికి ఒక లిన్టర్‌ను ఏర్పాటు చేయడం. డిఫాల్ట్ లింటర్ testinfra и flake8. సాధ్యమయ్యే ఎంపికలు పైన పేర్కొన్న విధంగానే ఉంటాయి:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

మన పాత్రకు తిరిగి వద్దాం. ఫైల్‌ని ఎడిట్ చేద్దాం tasks/main.yml ఈ రకానికి:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

మరియు పరీక్షలను జోడించండి molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

పూర్తయింది, ఇది అమలు చేయడానికి మాత్రమే మిగిలి ఉంది (పాత్ర యొక్క మూలం నుండి, నేను మీకు గుర్తు చేస్తాను):

> molecule test

స్పాయిలర్ కింద పొడవైన ఎగ్జాస్ట్:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

మా సాధారణ పాత్ర సమస్యలు లేకుండా పరీక్షించబడింది.
పని సమయంలో సమస్యలు ఉంటే గుర్తుంచుకోవడం విలువ molecule test, మీరు డిఫాల్ట్ క్రమాన్ని మార్చకుంటే, మాలిక్యూల్ ఉదాహరణను తొలగిస్తుంది.

కింది ఆదేశాలు డీబగ్గింగ్ కోసం ఉపయోగపడతాయి:

> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge          # Оставляет инстанс после прогона тестируемой роли.
> molecule login             # Зайти в созданный инстанс.
> molecule --help            # Полный список команд.

ఇప్పటికే ఉన్న పాత్ర

ఇప్పటికే ఉన్న పాత్రకు కొత్త స్క్రిప్ట్‌ని జోడించడం పాత్ర డైరెక్టరీ నుండి కింది ఆదేశాలతో:

# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>

ఇది పాత్రలో మొదటి దృష్టాంతం అయితే, అప్పుడు పరామితి -s ఇది స్క్రిప్ట్‌ని సృష్టిస్తుంది కాబట్టి విస్మరించవచ్చు default.

తీర్మానం

మీరు చూడగలిగినట్లుగా, మాలిక్యూల్ చాలా క్లిష్టంగా లేదు మరియు మీ స్వంత టెంప్లేట్‌లను ఉపయోగించడం ద్వారా, కొత్త స్క్రిప్ట్‌ని అమలు చేయడం ద్వారా ఇన్‌స్టాన్స్ క్రియేషన్ మరియు ప్లేబుక్‌లలో వేరియబుల్‌లను సవరించడం వరకు తగ్గించవచ్చు. అణువు CI సిస్టమ్‌లతో సజావుగా కలిసిపోతుంది, ఇది ప్లేబుక్‌ల మాన్యువల్ పరీక్ష కోసం సమయాన్ని తగ్గించడం ద్వారా అభివృద్ధి వేగాన్ని పెంచడానికి మిమ్మల్ని అనుమతిస్తుంది.

మీరు ఆసక్తి చూపినందుకు ధన్యవాదములు. మీకు అసలైన పాత్రలను పరీక్షించడంలో అనుభవం ఉంటే మరియు అది మాలిక్యూల్‌కి సంబంధించినది కాకపోతే, దాని గురించి వ్యాఖ్యలలో మాకు తెలియజేయండి!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి