From 65cc5c6c102e9133c94c4c0e20e749c82aea2b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Huard?= <63874667+ChezJe@users.noreply.github.com> Date: Tue, 16 Jun 2026 23:48:01 +0200 Subject: [PATCH 1/4] Added Peripheral compartment --- code/TMDD.sbproj | Bin 32540 -> 37058 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/code/TMDD.sbproj b/code/TMDD.sbproj index 9b089974cdcb640bb36a4b6d8eb067f8a49b08b1..ed455acf509386fe87bd729ba037dad163e99aab 100644 GIT binary patch delta 34351 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�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 OCV#6_VDsq(DFFa#@AF~+ delta 29815 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 z zMpg#va^{k1vPmhEK&}b*Lc(X$2E z>ulJpT)_*_I}!#Iz@oKkAd>ca2F7@FGz%@=Pe=BH3C|?O-(9il*g_FjP`YPfeLuh| zd%PzDft0Jx^D}pFRp<*GyL7-)?mA~j|4SOIY|G#22;gvu#55pC8*uy3gjGjZrr~?4 zEc{!SHe?bC-!HwXT?AX~N1okMzFJAk-z7DHJlg!`m~)K?sJgqN;{NPd{pRuXc&6GJ^G+?a9Ai~BKH^Wv-hExVr6UF zg+NI3o#76^EGsil@SRIu0jdH4hRokK8SKxKIyNz*-I_~PCYB_JGcWqXnyzs9l6wrD z;cz4Z%IRo;-`@?cEUt=y&2 zl83MSt0^@`_J9E)Nb>w}%eT4t+3B8nxb_HeJ#tmqPr6Qc zW|^0p-b*Nfvv@kaE+}9g zRKC~2c`y_|kLb$FOI~HBhpu^|yJ`qFyW55OerEaPJauNXF+sh7etcR2tv>y34;9WvA~I)XbGCW3e51vlayeW?#)>e$#%u z4O*{!*bZ)|buwvD*cD)kxOcB--`SWBy}k^*>rB$k+}XuVeMqP)(zowEfk&p)S6Src z!7@#0)N5-09iIc>0{5oF@hHnPt>VPoibkcp=4d42)sjh_?Y=^xZJJL)mv(M`9P|^O5#}bs4<7>$$4X{>!&{pZhd#AD!*rx!N6jvdCps~F)ngv_K#Ffpe zC%r##`&nE5q**<$3sH~MS&p{YQK_CbmE~~fTv?dgo2hu+z4j}$3`VM9ToOC%N>#8w z>=S^F7BqF$c2W|gZ~P+?%~lKhy!P3pk3ri*9uFAUv|Sghl{(ikAF?4jq6wW=aCfKo z9oLiUA^X6eiePJT6JaN*vkOA7F%<&&66sjReeK+}iSqJ0!6NyyknOU74@XO!! zVoM`HPlX4#x>k8sr5Pp9*O|d;^1qW)45JV0q&xkab4$l}LZC)99y!kZid&FO$3$n4 zb(Keg_+U5^U+&}ke$_PLWG|oi$_Hb3JDXZ;r0taf)c@0R-@Jn6< z1Qlf=ISsu;)@^ize5$*jb}Eix9IO_Y_db+`;Bn`#O<9w0(i|{1#pEG}d_lO+`4>QSqo24}C zL*782F}7S(3i{dL1M7Q;ck33zKRGhSe)`xyR4)BaMqj^2P(?^0Mf9jhqj6B>XI;y3 zgTL}_rZk5(+h)h*_3&48E`ehc!JHPF7Vj2l_c4m+akVb(^l6Ca;j$iR19P+1wAbbJ z0>4{FP~{F>Ytx&udRR-nS|@Xo#*&7_>QrNCJsKL(sci`#nkeLnUvHf~o!&u+REcj< zVtrO;B!Oby`VWJdcW$)RI-E(;j2v%T5a6TZh1w%S)Qr+xVn zce^ghXM#-Z>4(zo@G>%IOx)3zLRy1)*dad=GI7Lg6G4KR$b9gHq+6>hYjt7}cI4S_H&eYCv%rSWuA?{@tIQGC|imfLP#t z%^PEKd<}?&R!!_nX$Z?9t)MmFGYFm&2wTY-UF_h};; zAt*ZayaYq{tRzt#K@S+)u#TDB&?QN39Qb3%aPP2Pf_l@$lHlZKRxXbz^5&gY$(M;U z+VX3umBM+IGNQDTuDkeFtyAO{Akk$}7@mI+JTUHaceSCqnoO z!aJ8A0x}7_N$i%RhJghcwlA?#X19q%LChZFg+0sS_Y^=s!GcTT;fO?l(^~;0qj+dR z+aLfuxc~;cQqZ^m`>h%hf6;76ep+gxnw89K0!N-(=Om z@v4k25C|_fT=`aKu&pvw>8@A&Ch$oxi#|NxM^S+t%kNu}1+Y>=NGqb676b7$glQjS ztUg~cBDOD}E!`oszhV$LOZ4o-argbaZ5Dp2Hb1kYe~!ur-FE&Y>gQPPt4Uq?s>u!F zCQT*XIxC{VKbf10ZV2;Ee18!q>@v*KlWmNl+ydNDQ`%BD!4BpPFNG4}sA;(+i;9ZE z;AR04$6d`mQ3ybu38B^ov@w7!k#n!Af?Z;gQghjf5#A4DvbM+w$axkU8&N1ezpPT3 zRc(=-O)Ma+&^dy4p~!|JqpZ%pLwxeA-6=oBMk zGcV2x-T4ahS7bvrxY0$$WlE2pm9aQUGXws%I05vv&V3p~ct}|z+6vKNTGh~o%8&067YEIySyU`n7b)3WZb{?(N=iBwFL%jG z*Zayl`*{<`0?ha19?b;noRa~#R{&#P7%eRb)^Ze{frO1TG+`65BaF)hI zBuWEVG2x7*XHaWz)(kNO1T4>{^2EL~z5a0O+MBWI`N_JAT zuUcQY6VwfPwd_UrJIw<8zKi_kUC*%Pp?5Vc0}%wS^9y}^ZO5OoPHM%~gXS_8> zy}eRWo=6)k^dP|iico&(M^fsEpJI9n$3wN<>O zu7yXgzFA~Pa59s;{W@h^L#8SMRq0L6LFxefbdCG0tdrPS7Ov~Ehv*Kir{w&oRnuN+Oy1@5`5*^PW40luj88U)d+XCv0@;dQ|!%+5Ka2 z7gXBIMD{n2pz-?0_juj9hY=m9v*0W-`>d}g>zYGc42dV18WL3-SN@#fC1@b@c+^#) zC41se3(M>1p3(AGx@(LH1>H&|ijD%>Z2d7%QiEjK@js*xq_}Rw&Y$kESLv-VtGU_? z)sL`Su2~OF;It?4eX^J?%VK9#HXS%ZhR|M!DwStGAZI6%pXf2Z{@f}qozgE7eOg0g|_MMP0n zLZlsJdG;;*L!GjUunc>3{&gy=X%1_)iFmEKOd|h*SaI_G#J&BB$@Guekw}5{_)bFb znQt#UP~cn1zOBF==f%u}^`^<_i}Z6yqU%Md)}V%omjYTiX#S?ubeDUr9lUVqv9J;T z3?IUZ*m|d@gAZyhj0~ru9 z$sxIyZsT6H*5;&mnh_Ns*M>lzc}e2x+Z%2GWPZJLTzckxI2$56>j;8&(#d?oBd);r z%>DFVgFQR4OWj~bb!u5wrqvs=UGU0iGLXljTc@wFV>onGr6&9qKEj7kkBn_tKIn_D zB;!YWcFyg7MwDUK0VLQGqw^fjRK4h$d5I&6USa*o3`%00y#dAV@JD16|M0`GCIw#w zSXiO?Pp(EY4&3C#lzwS@lK(;#Mzy^0rKWZ)7V8bv-f3ONfAX9mnD)~*a=14xCKx)jU$n2{?d}1Ea{;#Z<*u4q011e%i+*)2kPR%+t0_yyeWOPq?Dr07;_n ziK<#@<}el8ybV}i)0?!tY|WNhVSkHz^$cXK*sh>k<$Y<`)Tuk}*ajt}&Y^u4-m8^? zdI~sHNv@r0DG9inJR)RzeWJuy+-WAXXc_9S_f@zo6*eiZb2SLqno0Ym}j1huP1l{+&gy`#d5Io+%leXSO= z1f#@Dg6<-rqi|vQlUIcrisz`+T%F%q_aSr=MAacQH2o7gv-AVzdDc=maBEFph@TX1 zHLkfTom_>AK!M7u#(f3uUt6b=i)Fy8rU|Ac-Sa)RP+!pM_U{N=&A1l`0wLJJHz=5y zU`5al%>utuATg?_u$S!8c^$!{22r9vF3A~VVL^}ZEG-2+z0a3Pv?^2jP8>foT^gd7 zfjAn(n%;wC7B%fxiaOp4q(ko5=Aeilju_106FJ7}{ct!GgtDa;aDc`r7PQ)GGWpixQ7q_=Be+{inoLxd z_bjon8?j0c%XO7&Yrz({4efUhNrr%f(kB;sId>2Hto5~^N;YMZBDm5)8 zyP~X35Jmu1vYY1$aHXI(1=j&)_;2_Ay|W>RCuPt#r2^8SnSy=eFvYnwd_!tT&b=yq zEOP_Yrl|3$-1Rp8Uekx{*{fn)5zN+2b*~s$*7G{I$YwMzMaFb1@UhT7?1lJ3vWb=4 zu3e~VCJEmtLez73ePKBsfF7)5Ri9*!L?M7BjJ)}S=pViVNLwM5>CM^s8}Z&j{@a7) z1#BpSGXNo2AsL3Ycv|TTa)U2F`XZ}bZb(c%l3Gq8y_X!22!S5_qHWP$1C@i{=67QM zr0-SG{7;qDg-UiL?68OJPIxB;H{4Y+DHtjInv@k-uIhC65P%ht7P(c3jQLpL(I%P7 zHLu?04PpKV*lRv0*Nh<>Ac$p7C_$z>B~=*zmWH^;J>X?&M!Jp_mCCRz{#;lo3~%^I zR_dx>cs4pN5Gs6fEpWhLjcucT2;uvE>Pw`Y&Re#z<7{cCR72Y2WWp{bZgPfPPX8MhWzr>|jEcMJ;W6b=|EE{T z{)LhbdWWUgX#Gi|dL5yme+GAInxb%+q^0$TudspSgFR_c^IsbaNKo5VC~drNo#^~? z`}2|#u(LatYZ>PkSK8l<`pKuxVQBt-1C^{36$`o9%h}D~1m?JUo#e?c<2b0| z)m6IC6&1n0TNHadw5;aARDMnW+7%#sSMd-HEQm9>;fy_qj?r`JM`D^{wjmozUrNKuk+8870w1pvWPYUc8S=rd%<{h`eVRpD+LH;%%WjY8xrV zwe8HK#`3qJ3k(s!kayQ0VwD^1btqX`ozCCVer9aDJ!q}}BbC?Lbfbsn`PtQ4OE8<=o$Qt>Tt-{>S$0Ta-5SPZ2}C+ z%h+dfs;YMPiPr5dYURfZ7Gz%`+HbKGlLcCU5V;lGT>{uF!G8r4K|c7#AE|z9{ducI zQ{}qDA#FK5QF+iO^z&3ypoT0Sh32#aQfkM(>t$0?_`dPOHl%6R1SNzZnuPx5x#Yhx zeELA$%PX(UlyfNS;9bjKHrW!xVj)2|)sw@d!TU$bO_}tLyY*koR?$%*L#jk{!!Hw^ zpeLGdCtkki9j9nZ{+1O>L^oMX)Aey4sz(s}?am_S#PWwwc>uX9ee2*7(3iCV^it{d zx_g#cx8;;1-B;G+R=n~R>Kx(?qd^udJsE_Ys+#W&lFRHRT*Vrp-8`Pb9^VU`493F* zF7ifR;Gaa*S0ZeeqvV$s1>qSL3~=)z{AmqEoOp@8b$DUrCK%yFUEEG2fPc-$$}w4G z*5o*gina#*O{uKAN{9O3^YCy3w0W26_o!VcLilL6ru|J{Vc++*V{M8rVR?jNUlmSz z*MxoHi330_fub{YG`HOm9(|7zxu90b8jr_>@S;l}!*9LZjN)3pw`4&$opzv^jcbC2 zg!tHT;$7Lp{^Vf4X3F&ebXF)sR7_uuhxlOK-!~p=FxMVr;4; z*YVN~o`oGNByA#^NOK1Ey%`@95g%RhB-ghlornE8xn|HpZa*FIS7`c!yPrNxu&6Dd zEnc6`1|>pec3WQsRxbu5M*LX`XH#vhHmJ>mS3Uz{j^nGD=FvZRACd#W1AfF^=eE;& zyjzXk2!~De!YtUl=W4|}^V99li(2x=W|&)%J#`vVb4Ek#a4-Sm_RP5KJM^kPH~oL0gxmA(4I;5yMe`>hoj5ZaJkx`&emlE$N5oJ(AEKjpOMVa@l35Mym#N;dSej6xzZ&)ptEfXOaGjrEAGw? znh6&p^+0ItpkV`$G^Outc?C>^*eD17oR935w!c$7hGzG)zkLK<{X54OUp(T_!rFQp zbkqCt2j>&<6OJZ*M(`(__MSgOcxY{}p5%$@SDw(LY|@?jcX-M5p-X$qVYSkY$4grlluNd{7%1Pk0a|DGsl4@&w|eDeqT-o=)LEkYy`LDzpo`& z*VKJgqFg){%Vd+z8`A&G`ys~E`^2S%EB?RwrT6gV|KB`wB|;S9e>p^wMv6oJFEhnB z>qt4g|KUUUFJt)MA_^5}3yB-&4uup45rvHVA1^;d@GoER{#B&^M*VBa#4$#Z;Qrsf zd;bjyinE9!#{1totA7$G#Q#40*AfzmD~Te+```Mge*ynDIs{|~fa?sfnG From 89be50d456ce8a2129ed743343f4d48d89830b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Huard?= <63874667+ChezJe@users.noreply.github.com> Date: Tue, 16 Jun 2026 23:49:51 +0200 Subject: [PATCH 2/4] Corrected qualified name of Drug in createSimFunction call --- WorkshopGuide.md | 605 ++++++------------------------- WorkshopGuide_media/image_27.png | Bin 29128 -> 95731 bytes code/generateSimFun.m | 2 +- 3 files changed, 111 insertions(+), 496 deletions(-) diff --git a/WorkshopGuide.md b/WorkshopGuide.md index 35cec81..4f5651d 100644 --- a/WorkshopGuide.md +++ b/WorkshopGuide.md @@ -1,337 +1,259 @@ - # "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" Workshop Guide This workshop provides a step\-by\-step guide to generating automated tests using the MATLAB Unit Test Framework and MATLAB Test. - In this workshop, you will: -- fork and modify your own copy of the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository on GitHub -- generate tests using your command history and MATLAB Copilot -- automatically find and run existing tests -- explore code coverage metrics for your tested code -- automate your testing using continuous integration (CI) practices with GitHub Actions and build tool +- fork and modify your own copy of the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository on GitHub +- generate tests using your command history and MATLAB Copilot +- automatically find and run existing tests +- explore code coverage metrics for your tested code +- automate your testing using continuous integration (CI) practices with GitHub Actions and build tool ## Table of Contents - [Workshop Requirements](#H_34C2FB57) + [Workshop Requirements](#H_34C2FB57) - [Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing](#TMP_1229) + [Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing](#TMP_59e6) - [Part 2: Generating your first tests](#TMP_4e93) + [Part 2: Generating your first tests](#TMP_02c5) - [Part 3: Finding existing tests and measuring coverage](#TMP_3f21) + [Part 3: Finding existing tests and measuring coverage](#TMP_885c) - [Part 4: Updating badges, committing our changes, and pushing to GitHub](#TMP_11a6) + [Part 4: Updating badges, committing our changes, and pushing to GitHub](#TMP_0713) - [Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results](#TMP_585c) + [Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results](#TMP_0a39) - [Part 6: Compile the App in the CI workflow and download the artifact](#TMP_03f8) + [Part 6: Compile the App in the CI workflow and download the artifact](#TMP_8913) - [Workshop wrap\-up and additional information](#TMP_8c61) + [Workshop wrap\-up and additional information](#TMP_6893) + # Workshop Requirements The following steps cover all of the things you will need to successfully complete the workshop: - **A) Access to MATLAB Online or a desktop MATLAB with the MATLAB Test*****™*** **product** -- Go to: [**https://matlab.mathworks.com**](https://matlab.mathworks.com/) -- *Note:* If you do not have a MathWorks account, the above link will ask you to create an account for free +- Go to: [https://matlab.mathworks.com](https://matlab.mathworks.com/) +- *Note:* If you do not have a MathWorks account, the above link will ask you to create an account for free **B) Access to MATLAB Online or a desktop MATLAB with MATLAB Copilot** -- *Note:* If you do not have a license for MATLAB Copilot, you can simply skip that part of the workshop +- *Note:* If you do not have a license for MATLAB Copilot, you can simply skip that part of the workshop **C) A GitHub account** -- The workshop leverages the free repository and CI capabilities offered by GitHub and GitHub Actions -- Go to: [**https://github.com/signup**](https://github.com/signup) +- The workshop leverages the free repository and CI capabilities offered by GitHub and GitHub Actions +- Go to: [https://github.com/signup](https://github.com/signup) - + # Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing In this section, you will: -1. Fork the workshop files to your personal GitHub account +1. Fork the workshop files to your personal GitHub account 2. Enable GitHub Actions for automated testing 3. Enable GitHub Pages for report publishing 4. Open the workshop in MATLAB - **Part 1.1: Fork the "Generating Tests for Your MATLAB Code Workshop" repository to your GitHub Account** - First, you'll start by forking the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository to our own GitHub account. - **Wait... What does it mean to "fork a repository" and why should I do it?** - Forking a repository allows you to freely experiment with and push changes to a project without affecting the original project. - GitHub provides some great information about "why" and "how" to fork a repository here: [https://docs.github.com/en/enterprise\-cloud@latest/pull\-requests/collaborating\-with\-pull\-requests/working\-with\-forks/fork\-a\-repo](https://docs.github.com/en/enterprise-cloud@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) - **However**, In our case, we will use forking as a way for everyone to have his/her own remote repository as everyone would be pushing the same changes to one single repo otherwise. - Since the forked repo is not meant to be pushed back to the original repository, we will make it standalone. - Let's get started! - -**Go to:** [**https://github.com/simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example**](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example) - +**Go to:** [https://github.com/simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example) ![image_0.png](WorkshopGuide_media/image_0.png) - **Press the "Fork" button (top right)** - ![image_1.png](WorkshopGuide_media/image_1.png) - **Create your fork** - GitHub offers the ability to rename your copy of the repository, but this guide will assume the default name. - ![image_2.png](WorkshopGuide_media/image_2.png) - ***Notes:*** -- You may need to log into your GitHub account again during this step -- There's no problem with renaming your copy of the repository, but the rest of the workshop guide and screenshots assume the default repository name - +- You may need to log into your GitHub account again during this step +- There's no problem with renaming your copy of the repository, but the rest of the workshop guide and screenshots assume the default repository name **Once you've forked the repository, you should see:** -- your GitHub username at the top of your repository -- "forked from simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example" +- your GitHub username at the top of your repository +- "forked from simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example" ![image_3.png](WorkshopGuide_media/image_3.png) - **Let's make it now standalone for the sake of the workshop.** - ![image_4.png](WorkshopGuide_media/image_4.png) - ![image_5.png](WorkshopGuide_media/image_5.png) - Now your repository is standalone and not linked to the original repository. - Before you go to MATLAB, let's enable some useful GitHub features that will be automatically triggered when we push our changes to GitHub later. - **Part 1.2: Enable GitHub Actions** - GitHub offers built\-in continuous integration (CI) services via their "GitHub Actions" feature. By default, GitHub Actions is disabled for forked repositories that contain a GitHub Actions YAML file, so you'll have to enable Actions before you can use them for the workshop. The workshop already provides a GitHub Actions YAML file to automatically test your code and publish test results so you can see them directly from your repository every time you push your code. - **Select the "Actions" tab** - ![image_6.png](WorkshopGuide_media/image_6.png) - **Click the "I understand my workflows, go ahead and enable them" button** - ![image_7.png](WorkshopGuide_media/image_7.png) - And that's it! GitHub Actions is now enabled for your repository. - **Part 1.3: Enable GitHub Pages to publish our test results** - GitHub offers a built\-in way to publish test reports and artifacts created from your CI jobs. By default, GitHub Pages is disabled for new repositories, so we'll have to enable GitHub Pages before we can publish our test reports. - **Select the "Settings" tab** - ![image_8.png](WorkshopGuide_media/image_8.png) - **Select the "Pages" entry on the left\-side navigation panel** - ![image_9.png](WorkshopGuide_media/image_9.png) - **Change the "Build and deployment > Source" dropdown and select "GitHub Actions"** - ![image_10.png](WorkshopGuide_media/image_10.png) - GitHub Pages is now enabled and your GitHub Actions will be allowed to publish test results for everyone to see. - - **Part 1.4: Open the workshop in MATLAB Online or in your MATLAB Desktop** - *Notes:* -- You may also do this workshop using a desktop MATLAB with the MATLAB Test product installed. -- If you do not have the MATLAB Test product, you will not see the right\-click menu items and buttons described below - +- You may also do this workshop using a desktop MATLAB with the MATLAB Test product installed. +- If you do not have the MATLAB Test product, you will not see the right\-click menu items and buttons described below Let's get started! +**Go to:** [https://matlab.mathworks.com](https://matlab.mathworks.com) -**Go to:** [**https://matlab.mathworks.com**](https://matlab.mathworks.com) - -- *Note:* If you do not have a MathWorks account, you will need to create one before continuing. +- *Note:* If you do not have a MathWorks account, you will need to create one before continuing. - **Get the workshop files selecting Home > New > Git Clone** - ![image_11.png](WorkshopGuide_media/image_11.png) - **Enter the URL of your GitHub repository in the dialog and hit "Clone"** - ![image_12.png](WorkshopGuide_media/image_12.png) - - -**Open the workshop project by double\-clicking on the** [**`DevOps.prj`**](./DevOps.prj) **file** - +**Open the workshop project by double\-clicking on the** [`DevOps.prj`](./DevOps.prj) **file** A MATLAB project is a useful tool that makes it easy to: -- automatically set up your path consistently across multiple users and machines -- run startup and shutdown scripts when you open or close the project -- keep one project from affecting the environment of another project +- automatically set up your path consistently across multiple users and machines +- run startup and shutdown scripts when you open or close the project +- keep one project from affecting the environment of another project ![image_13.png](WorkshopGuide_media/image_13.png) - **Give MATLAB permission to run project startup tasks** - As part of our commitment to security, MATLAB will ask you for permission before executing any code during project startup the first time you open a project. - For this workshop, the code we are executing during project startup is to automatically open the workshop guide ([`WorkshopGuide.m`](./WorkshopGuide.m)) for you when you open the project. - In the following dialog, please select "Open" to open the project and run this startup task. - ![image_14.png](WorkshopGuide_media/image_14.png) - Your MATLAB now should look something like this: - ![image_15.png](WorkshopGuide_media/image_15.png) - *Notes:* -- You will not see the "Copilot Chat" panel on the right if you do not have access to MATLAB Copilot - +- You will not see the "Copilot Chat" panel on the right if you do not have access to MATLAB Copilot **Part 1.5: Switch to a development branch** - After cloning the repo, you will be seeing the default main branch. - It is good practice to create a new branch and switch to it to make new development, push it to your remote repo and merge your branch with the main branch (more on this later...). - Let's open the branch manager from the "Project" tab: - ![image_16.png](WorkshopGuide_media/image_16.png) - And create a new `dev` branch and switch to it: - ![image_17.png](WorkshopGuide_media/image_17.png) - ![image_18.png](WorkshopGuide_media/image_18.png) - Now you're ready to work on your project and, for example, start generating tests! - **Part 1.5: Let's run the app!** - Click on the 'Run App' shortcut to start the app in MATLAB: - ![image_19.png](WorkshopGuide_media/image_19.png) - ![image_20.png](WorkshopGuide_media/image_20.png) - - + # Part 2: Generating your first tests In this section, you will: -1. Generate tests using your command history +1. Generate tests using your command history 2. Generate tests using MATLAB Copilot 3. Add generated tests to your project - **Part 2.1: Generating your first test using Command History** - -**Open the** [**`SimulationModel`**](./code/SimulationModel.m) class **(found in the code folder)** +**Open the** [`SimulationModel`](./code/SimulationModel.m) class **(found in the code folder)** ```matlab edit SimulationModel.m ``` - -**Interactively test** [**`SimulationModel`**](./code/SimulationModel.m) **using the MATLAB Command Window** - +**Interactively test** [`SimulationModel`](./code/SimulationModel.m) **using the MATLAB Command Window** Here's an example code you can run at the Command Window: @@ -345,502 +267,348 @@ all(ismember(sObj.SimData.DataNames,["Drug","Receptor","Complex","RO"])) ![image_21.png](WorkshopGuide_media/image_21.png) - -**Generate your first test for the** [**`SimulationModel`**](./code/SimulationModel.m) class **using our command history** - +**Generate your first test for the** [`SimulationModel`](./code/SimulationModel.m) class **using our command history** While we could start creating a test from scratch, wouldn't it be nice if we could reuse the interactive testing we did at the Command Window? - As of MATLAB R2025a, MATLAB Test introduced a feature to generate a test from your command history. - **Go to the Command History panel** - ![image_22.png](WorkshopGuide_media/image_22.png) - *Note:* If you don't see the Command History panel icon, you can add the icon by selecting the "`...`" option and selecting the "Command History" item. - ![image_23.png](WorkshopGuide_media/image_23.png) - ![image_24.png](WorkshopGuide_media/image_24.png) - *Note:* You can also access your command history by pressing the "up" key while at the MATLAB Command Window. - **Right\-Click one of your calls** **and select "Generate Test"** - ![image_25.png](WorkshopGuide_media/image_25.png) - - This will automatically gather all relevant code lines needed to execute that command successfully and generate a test template for you: - ![image_26.png](WorkshopGuide_media/image_26.png) - **Check that both assertions are true and rename the class and the test** - ![image_27.png](WorkshopGuide_media/image_27.png) - **Save your test to the** **`tests`** **folder** - ![image_28.png](WorkshopGuide_media/image_28.png) - **Run your test using the "Run Tests" button in the Editor toolstrip** - ![image_29.png](WorkshopGuide_media/image_29.png) - As of MATLAB R2023a, running tests from the Editor toolstrip will automatically open the MATLAB Test Browser. - The MATLAB Test Browser makes it easy to: -- rerun tests without being in the test file -- explore test failure diagnostics -- filter results based on test status (pass, fail, incomplete) -- enable code coverage -- enable parallel test execution +- rerun tests without being in the test file +- explore test failure diagnostics +- filter results based on test status (pass, fail, incomplete) +- enable code coverage +- enable parallel test execution ![image_30.png](WorkshopGuide_media/image_30.png) - After your tests are done running, you will be able to to quickly see that your tests have passed. Yay! - - **Part 2.2: Generate tests using MATLAB Copilot** - As of MATLAB R2025a, MATLAB now offers MATLAB Copilot (requires a separate license) that enables GenAI capabilities optimized for MATLAB code. As with most platforms, we have a MATLAB Copilot chat panel to use AI in a conversational way. - To make testing even easier, MATLAB Test enables 1\-click buttons to automatically generate tests for the code you are looking at. - *Note:* Only the "Generate test for the current file using Copilot" option uses MATLAB Copilot. All other test generation options do not use any LLM technology and create tests using templates and static code analysis. - - -**Go back to** [**`SimulationModel.m`**](./code/SimulationModel.m) +**Go back to** [`SimulationModel.m`](./code/SimulationModel.m) ```matlab edit SimulationModel.m ``` - **In the Editor toolstrip, expand the "Generate Test" drop down menu and select "Generate test for the current file using MATLAB Copilot"** - ![image_31.png](WorkshopGuide_media/image_31.png) - - MATLAB Copilot will generate multiple ready\-to\-run tests. - ![image_32.png](WorkshopGuide_media/image_32.png) - *Note:* As with all LLM\-based technologies, remember to validate the output before using it in production systems. - - **Save and run your generated tests** - Just like before, save your new tests to the `tests` folder and run your tests. - ![image_33.png](WorkshopGuide_media/image_33.png) - **Look at your test results in the MATLAB Test Browser** -- *Note:* Depending on the tests MATLAB Copilot generates, you may or may not end up with some failing tests. +- *Note:* Depending on the tests MATLAB Copilot generates, you may or may not end up with some failing tests. ![image_34.png](WorkshopGuide_media/image_34.png) - - The test done on lines 29 & 30 in `testSimulateFunction` does not seem right. Let's delete those lines and rerun the test. - ![image_35.png](WorkshopGuide_media/image_35.png) - ![image_36.png](WorkshopGuide_media/image_36.png) - - **Part 2.3: Add generated tests to your project** - When you create a new file directly from the Project side panel, the file is automatically added to the project and to source control. - However, when you create a new file in another way (e.g., "New > Function," the "+" button on the Editor's tab toolbar, or the test generation options), MATLAB leaves it up to you to decide whether or not to include the file in your project. - Let's add our 2 new test files to the project - **Find your new test files in the** **`tests`** **folder using the Project side panel** - Go back to the Project side panel. - You can identify files not in your project when the Status column is not a check mark or the Git column is an empty circle. - ![image_37.png](WorkshopGuide_media/image_37.png) - **Right\-click the test files and select "Add to Project"** - ![image_38.png](WorkshopGuide_media/image_38.png) - **Confirm your test files have been added to the project by seeing the check mark in the Status column and the "+" icon in the Git column** - ![image_39.png](WorkshopGuide_media/image_39.png) - Congratulations! You just created multiple tests for your MATLAB code! - It was easier than you thought, right? - + # Part 3: Finding existing tests and measuring coverage In this section, you will: -1. Find existing tests for [`generateSimFun.m`](./code/generateSimFun.m) +1. Find existing tests for [`generateSimFun.m`](./code/generateSimFun.m) 2. Enable and explore code coverage 3. Identify missing coverage 4. Add a test point to an existing test file - **Part 3.1: Finding existing tests for a code file** - When working with a new codebase or making changes to an existing file, you should run any existing tests that exercise that function to make sure you haven't broken anything. - But this raises several questions: -- Are there are any existing tests? -- Where are the tests? -- Should we just run all the tests? -- How do we know which tests (or if any tests) actually exercise the code we are working on? - +- Are there are any existing tests? +- Where are the tests? +- Should we just run all the tests? +- How do we know which tests (or if any tests) actually exercise the code we are working on? In MATLAB R2025a, MATLAB Test introduced a "Find Tests" feature that automatically finds any tests related to the file you are looking at and ignores any tests that are not related to this file. - Let's see how this works using the [`generateSimFun`](./code/generateSimFun.m) function: ```matlab edit generateSimFun.m ``` - **Press the "Find Tests" button in the Editor toolstrip** - ![image_40.png](WorkshopGuide_media/image_40.png) - **Select the root of your project to identify all tests in your project** -- *Note:* This root of your project is the default location, so you can just choose "OK" +- *Note:* This root of your project is the default location, so you can just choose "OK" MATLAB automatically will perform a dependency analysis on `generateSimFun`. - ![image_41.png](WorkshopGuide_media/image_41.png) - After the dependency analysis, you will see several tests that are related to `generateSimFun` open in the MATLAB Test Browser. - ![image_42.png](WorkshopGuide_media/image_42.png) - **Run the tests in the MATLAB Test Browser using the MATLAB Test Browser's "Run" button** - ![image_43.png](WorkshopGuide_media/image_43.png) - It looks like all the tests passed! Yay! - ![image_44.png](WorkshopGuide_media/image_44.png) - - **Part 3.2: Using code coverage to understand how much of your code is being exercised by your tests** - It was great that we already had tests for [`generateSimFun`](./code/generateSimFun.m), but how much of [`generateSimFun`](./code/generateSimFun.m) is being exercised by those tests? - "Code coverage" is a way to measure how much and which parts of your code have been exercised by tests. - There are several types of code coverage metrics: -- Statement coverage: Measure which statements have been executed -- Decision coverage: Measures whether both `true` and `false` conditions have been exercised for logical branches (e.g., `if`, `switch/case`) -- Condition coverage: When logical branches are composed of multiple logical conditions (e.g., `x > 5 && x < 10`), this measures whether each logical statement that is part of the `if` statement has been exercised for both `true` and `false` values -- Modified Condition/Decision Coverage (MC/DC): A modified set of decision + condition coverage metrics that is primarily used in code certification processes +- Statement coverage: Measure which statements have been executed +- Decision coverage: Measures whether both `true` and `false` conditions have been exercised for logical branches (e.g., `if`, `switch/case`) +- Condition coverage: When logical branches are composed of multiple logical conditions (e.g., `x > 5 && x < 10`), this measures whether each logical statement that is part of the `if` statement has been exercised for both `true` and `false` values +- Modified Condition/Decision Coverage (MC/DC): A modified set of decision + condition coverage metrics that is primarily used in code certification processes *Note:* Decision, Condition, and MC/DC metrics require MATLAB Test. - The MATLAB Unit Test Framework can automatically measure code coverage, but it is off by default, so let's enable code coverage! - **Open code coverage settings** - ![image_45.png](WorkshopGuide_media/image_45.png) - **Enable coverage reporting** - ![image_46.png](WorkshopGuide_media/image_46.png) - - **Select the "Condition" coverage metric** - ![image_47.png](WorkshopGuide_media/image_47.png) - *Note:* For this workshop, we will skip MC/DC since it is a significantly more advanced topic and primarily used in certification workflows. - - **Add the** **`code`** **folder to the "Source" list** - By selecting specific files or folders, we can focus our code coverage measurements on only the files and folders you select and avoid complicating our code coverage reports with code that is less critical for our application. - ![image_48.png](WorkshopGuide_media/image_48.png) - - **Deselect "Open coverage report after run"** - While this option can conveniently open the coverage report after every test run, it can sometimes be distracting when you are rerunning tests frequently. - ![image_49.png](WorkshopGuide_media/image_49.png) - **Close the Coverage Settings** - ![image_50.png](WorkshopGuide_media/image_50.png) - **Rerun your tests** - ![image_51.png](WorkshopGuide_media/image_51.png) - **Click the link in the Command Window to open the code coverage report** - ![image_52.png](WorkshopGuide_media/image_52.png) - You should see a Code Coverage Report very similar to the one below. - ![image_53.png](WorkshopGuide_media/image_53.png) - The top of the report gives you an overall summary of the coverage metrics for all of the code in the folders you have chosen, while the "Breakdown by Source" table gives you a breakdown of the coverage metrics by file. - For this workshop, we will focus on the "Breakdown by Source" and the detailed coverage inside the code files. - - **Part 3.3: Identifying testing gaps (and potential bugs) for** [`generateSimFun`](./code/generateSimFun.m) **using code coverage** - Let's look at the detailed coverage metrics for the [`generateSimFun`](./code/generateSimFun.m) file and and see which parts of the code have been exercised. - **Select the** [`generateSimFun.m`](./code/generateSimFun.m) **row in the "Breakdown by Source" table** - ![image_54.png](WorkshopGuide_media/image_54.png) - - **Scroll down to see the detailed source code and coverage metrics** - ![image_55.png](WorkshopGuide_media/image_55.png) - Well, that seems like a rather boring detailed report, right? - The reason you don't really see any interesting data in Source Details is because you are looking at the "Condition" coverage metric, but [`generateSimFun`](./code/generateSimFun.m) is a very simple code with no conditions in its logical branches. You can also see that the "Condition" column is empty, which is another clue for why the source details look empty. - However, you can see that the Statement and Decision columns have data in them, so let's take a look at those coverage metrics. - **Select "Decision" coverage in the "Currently viewing" overlay at the top of the page** - Now the coverage report looks much more interesting! - ![image_56.png](WorkshopGuide_media/image_56.png) - There are several kinds of highlights you can see in the source code: -- Green: Both `true` and `false` decisions have been exercised -- Yellow: Only one of the `true` or `false` decisions have been exercised -- Red: None of the `true` or `false` decisions have been exercised +- Green: Both `true` and `false` decisions have been exercised +- Yellow: Only one of the `true` or `false` decisions have been exercised +- Red: None of the `true` or `false` decisions have been exercised *Note:* The coverage report does not have any red because all of the decision branches have been at least partially exercised by at least one test - In addition to the source code highlights, the "Decision" column shows how many times each decision outcome (`true` and `false`) has been exercised by your tests. You can use these numbers to identify which condition outcome you did not exercise or help you decide whether you want to exercise a specific code branch more times. - We can also take a look at the "Statement" coverage metrics to see which statements in our code have and have not been exercised by our tests. - **Select "Statement" coverage in the "Currently viewing" overlay at the top of the page** - ![image_57.png](WorkshopGuide_media/image_57.png) - From the highlights, we can see that line 4 of our code has never been exercised by our tests. - Now you can ask the questions: -- Do I just need an extra test to exercise this piece of the code? -- Is this code unreachable (i.e., is it "dead code") and can be removed? -- Or is this a symptom of a bug in our code? - +- Do I just need an extra test to exercise this piece of the code? +- Is this code unreachable (i.e., is it "dead code") and can be removed? +- Or is this a symptom of a bug in our code? **Part 3.4: Add an additional automated test point for** [`generateSimFun`](./code/generateSimFun.m) - **Open the test file for** [`generateSimFun`](./code/generateSimFun.m) **and add another test point** - Wait... Where is the test file for [`generateSimFun`](./code/generateSimFun.m) ? You never actually saw the test file because you found the tests using "Find Tests." - Luckily, the MATLAB Test Browser makes it easy to open the test files related to each test by simply clicking on the test file name. In this case, all of the test points are located in the [`tgenerateSimFun.m`](./tests/tgenerateSimFun.m) file. - ![image_58.png](WorkshopGuide_media/image_58.png) - - This is what the test file looks like: - ![image_59.png](WorkshopGuide_media/image_59.png) - Hm... This seems a bit different than the tests we saw before. The MATLAB Test Browser showed 5 tests, but this test file looks like it only has 3 tests in it. - What's going on here? - The answer: The second test in [`tgenerateSimFun.m`](./tests/tgenerateSimFun.m) is a parameterized test. - - **Understanding parameterized tests** - A parameterized test is a kind of test that enables you to reuse a single test function across multiple test points (i.e., across multiple inputs). - Parameterized tests are extremely useful when: -- you need to test a code multiple times with multiple inputs -- the calling syntax is the same across multiple tests -- the verifications are the same across multiple tests - +- you need to test a code multiple times with multiple inputs +- the calling syntax is the same across multiple tests +- the verifications are the same across multiple tests The way a parameterized test works is by defining a test parameter (or multiple test parameters) that contain the inputs you want to pass into your code, and passing that test parameter to your test function. - ![image_60.png](WorkshopGuide_media/image_60.png) - Looking at the second test function, you can see it takes this test parameter as an additional input. This test parameter will have a different value every time the function is called. - ![image_61.png](WorkshopGuide_media/image_61.png) - *Note:* You can learn more about parameterized testing here: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) - Similarly, parameters can be used in other methods such as `classSetup`, which is a method that is called once before running all tests. - ![image_62.png](WorkshopGuide_media/image_62.png) - ![image_63.png](WorkshopGuide_media/image_63.png) - **Add another test point** - To add another test point, you need to add another value to the `MATfilename` ClassSetupParameter cell array. - To do this, you can replace the following code: ``` @@ -855,461 +623,317 @@ MATfilename = {"test_generateSimFun.mat", string.empty} **Rerun your tests and look at the coverage report** - *Note:* You must use the "Run Tests" button in the Editor toolstrip to to pick up the new test point we added. The "Run" button in the MATLAB Test Browser will only run the tests that are loaded in the panel. It will not automatically pick up new tests in the files. - ![image_64.png](WorkshopGuide_media/image_64.png) - It looks like we've achieved full statement coverage for [`generateSimFun`](./code/generateSimFun.m). Yay! - ![image_65.png](WorkshopGuide_media/image_65.png) - - + # Part 4: Updating badges, committing our changes, and pushing to GitHub In this section, you will: -1. Update the repository badges in [`README.md`](./README.md) +1. Update the repository badges in [`README.md`](./README.md) 2. Commit our changes to source control 3. Generate a GitHub Personal Access Token 4. Push our changes to GitHub - **Part 4.1: Update repository badges** - ![image_66.png](WorkshopGuide_media/image_66.png) - Repository badges are great ways to showcase and allow exploration of the quality of your code. Badges are defined in a repository's [`README.md`](./README.md). - One unfortunate aspect of badges is that they are always hardcoded to a specific repository's URL. Since you forked these badges from another repository, you will need to update the badge so they point to your repository instead. - To make this easy, the workshop provides a useful project shortcut that will automatically update the links in your [`README.md`](./README.md) file. - **Update the badges by single\-clicking the "Update README Link" item in the "Shortcuts" section of the Project toolstrip** - ![image_67.png](WorkshopGuide_media/image_67.png) - *Note*: If you want to manually update the links, you will need to make the following changes to all of the links in the [`README.md`](./README.md) file: -- replace the "simkaryote" GitHub username with your GitHub username -- if you renamed the repository during the fork process in [Part 1.1](#H_DB2C80D4), replace "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" repository name with your GitHub repository name - +- replace the "simkaryote" GitHub username with your GitHub username +- if you renamed the repository during the fork process in [Part 1.1](#H_DB2C80D4), replace "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" repository name with your GitHub repository name Your badges will now be up\-to\-date and point to your personal repository once you commit and push your changes. - - **Part 4.2: Commit our changes to source control** - Now that you've added tests, and updated your badges, it's time to commit your changes ! - **In the "Project" toolstrip, press "Commit"** - ![image_68.png](WorkshopGuide_media/image_68.png) - **Type in a useful commit message and press "Commit"** - ![image_69.png](WorkshopGuide_media/image_69.png) - - You have now committed your changes. - Usually, the next step is to push our changes back to GitHub. This is really easy and straightforward when using Git from a desktop application (e.g., the desktop version of MATLAB). If we are pushing our changes from an online application like MATLAB Online, or if you don't have the Git Credential Manager on your machine, GitHub requires a personal access token to allow MATLAB Online to make changes to your GitHub repository. - - **Part 4.3: Generating a GitHub Personal Access token to enable MATLAB Online to push our changes to our GitHub repository** - **(only needed if you use MATLAB Online, SKIP if you use a desktop MATLAB installation !)** - ![image_70.png](WorkshopGuide_media/image_70.png) - Over the last few years, GitHub has increased its focus on security. One of the major user\-facing ways GitHub is enforcing some of these better security practices is by [moving away from the use of passwords](https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/), and recommending that people use personal access tokens instead. - Personal access tokens are meant to be treated like passwords: -- They are supposed to be difficult or impossible to memorize or guess -- They are not meant to be written down -- They are not meant to be shared with others - +- They are supposed to be difficult or impossible to memorize or guess +- They are not meant to be written down +- They are not meant to be shared with others When you install Git on your desktop, it comes with the Git Credential Manager. The Git Credential Manager will accept a username/password combination, it will securely get and store a personal access token for you, and it will make it very easy to push and pull changes without manually generating a personal access token. - For a MATLAB Online session or other situations, you will need to manually create a personal access token to give MATLAB Online permission to push changes to your GitHub repository. GitHub provides directions for [how to create a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token), but this part of the workshop will give you a step\-by\-step guide to creating your own personal access token. - - **On GitHub, press your profile picture (top right of the page) and select "Settings"** - ![image_71.png](WorkshopGuide_media/image_71.png) - **Select "Developer settings" at the bottom of the left\-hand navigation menu** - ![image_72.png](WorkshopGuide_media/image_72.png) - **Select "Personal access tokens > Fine\-grained tokens"** - ![image_73.png](WorkshopGuide_media/image_73.png) - **Press "Generate new token"** - ![image_74.png](WorkshopGuide_media/image_74.png) - ***Note:*** You may need to log into GitHub again to complete this action. - - **Name your token** - ![image_75.png](WorkshopGuide_media/image_75.png) - - **Limit token access to only the workshop repo** - ![image_76.png](WorkshopGuide_media/image_76.png) - - **Select "Add Permissions > Contents + Workflows" to enable pushing changes to your repository** - ![image_77.png](WorkshopGuide_media/image_77.png) - ![image_78.png](WorkshopGuide_media/image_78.png) - **Change "Contents" access permissions to "Read and write"** - ![image_79.png](WorkshopGuide_media/image_79.png) - - **Press "Generate token"** - ![image_80.png](WorkshopGuide_media/image_80.png) - - **Confirm the creation of the token** - ![image_81.png](WorkshopGuide_media/image_81.png) - **Copy your personal access token to your clipboard** - ***WARNING:*** -- You only have 1 chance to copy the personal access token, so do not navigate away from the page until you have used the token wherever you need it -- If you forget to copy your token string or you need to give another service access to your repository at a later time, you will need to create a new token - +- You only have 1 chance to copy the personal access token, so do not navigate away from the page until you have used the token wherever you need it +- If you forget to copy your token string or you need to give another service access to your repository at a later time, you will need to create a new token Any service that generates access token strings will only allow you to see or copy the token string the moment the token is created. As soon as you refresh the page or navigate away, the token string will be hidden forever. This protects you from having your token stolen or copied if someone breaks into your account. - ![image_82.png](WorkshopGuide_media/image_82.png) - Your personal access token should start with "`github_pat_`" followed by many alphanumeric characters. - - **Part 4.4: Pushing your changes to GitHub** - Now let's push your changes to GitHub! - **In the Projects tab, press the "Push" button** - ![image_83.png](WorkshopGuide_media/image_83.png) - **Enter your username and paste your personal access token into the MATLAB Online Git dialog and press "OK"** - ![image_84.svg](WorkshopGuide_media/image_84.svg) - - At this point, all of your changes will be pushed to GitHub. - ![image_85.png](WorkshopGuide_media/image_85.png) - - + # Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results In this section, you will: -1. Create a pull request +1. Create a pull request 2. Explore GitHub Actions as it automatically tests your changes and publishes test results 3. View your published test and code coverage results **Part 5.1: Create a pull request to merge your new code into the main branch** - After pushing your new branch to the remote repo, it will automatically suggest to create a pull request: - ![image_86.png](WorkshopGuide_media/image_86.png) - You can follow this suggestion and click on the 'compare & pull request" button: - ![image_87.png](WorkshopGuide_media/image_87.png) - You can now add a description and press "Create pull request". - This will trigger a CI workflow to run our tests on the dev branch: - ![image_88.png](WorkshopGuide_media/image_88.png) - - **Part 5.2: Watch GitHub Actions automatically test your code** - Once you start the pull request, GitHub Actions will automatically test your code. - To make this possible, the workshop provides you a pre\-written [GitHub Actions YAML file](..github/workflows/ci.yml) that tells GitHub Actions how to get MATLAB and what to do with your code as soon as changes are pushed. -- You can learn more about GitHub Actions YAML files here: [https://docs.github.com/en/actions/reference/workflows\-and\-actions/workflow\-syntax](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax) - +- You can learn more about GitHub Actions YAML files here: [https://docs.github.com/en/actions/reference/workflows\-and\-actions/workflow\-syntax](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax) *Notes:* -- We are using the MATLAB build tool to automate some of the build actions, but all of these actions can be accomplished with simple MATLAB code, as well. -- You can learn more about the MATLAB build tool here: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) - +- We are using the MATLAB build tool to automate some of the build actions, but all of these actions can be accomplished with simple MATLAB code, as well. +- You can learn more about the MATLAB build tool here: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) **Click on the check to open the corresponding job run in the Action tab:** - ![image_89.png](WorkshopGuide_media/image_89.png) - You will see the different steps included in this job: - ![image_90.png](WorkshopGuide_media/image_90.png) - Once the tests ran successfully in the dev branch, you can merge the pull request: - ![image_91.png](WorkshopGuide_media/image_91.png) - In the Actions Tab, we will see the list of all job runs including the current one: - ![image_92.png](WorkshopGuide_media/image_92.png) - **Dive deeper by selecting the listed workflow item and Select the "build" box** - ![image_93.png](WorkshopGuide_media/image_93.png) - - **Observe the GitHub Actions log as your build is running** - ![image_94.png](WorkshopGuide_media/image_94.png) - - The icon next to the build reflects the result of the build. A green check mark means the build ran successfully. - ![image_95.png](WorkshopGuide_media/image_95.png) - - Another place you can see an indication of your passing build is on your repository home page. - ![image_96.png](WorkshopGuide_media/image_96.png) - *Note:* You may need to refresh your browser a few times or use "Shift+F5" for the status to update - - You now have a repository that will automatically test your code every time you push any changes! - - **Part 5.3: Viewing your test and coverage results directly in GitHub** - Once your build completes, anyone that can see your repository will be able to explore your published test and code coverage results. - The badges on your repository's home page offer an easy way to: -- See whether your last build passed or failed -- Open the published test report -- Open the published code coverage report - +- See whether your last build passed or failed +- Open the published test report +- Open the published code coverage report *Note:* Badge links will navigate your current browser tab to the link destination, so you will need to navigate back to the main repository page to select a different badge or report - - **View your test report by selecting the "Open Test Report" badge** - ![image_97.png](WorkshopGuide_media/image_97.png) - The test report looks like this: - ![image_98.png](WorkshopGuide_media/image_98.png) - - **View your code coverage report by selecting the "Open Code Coverage Report" badge** - ![image_99.png](WorkshopGuide_media/image_99.png) - The code coverage report looks like this: - ![image_100.png](WorkshopGuide_media/image_100.png) - - Now anyone that visits your repository can immediately see the quality of your code, explore your test and code coverage results, and will have more confidence in the code you are writing! - + # Part 6: Compile the App in the CI workflow and download the artifact So far, we have only triggered tests and generated reports/badges. We were able to use free GitHub runner and licensing in our public repo. - However, our final goal is to compile our app into a web app. For this we will need a license of MATLAB Compiler. This will be provided by a BATCH TOKEN. - In this section, you will: -1. Add a batch token to your repository +1. Add a batch token to your repository 2. Modify the CI workflow to include a compilation step 3. Download the resulting CTF file **Part 6.1: Add a batch token to your repository** - Open the settings tab - ![image_101.png](WorkshopGuide_media/image_101.png) - On the left side, choose "Secrets and variables" \-> Actions - ![image_102.png](WorkshopGuide_media/image_102.png) - Let's add a new repository secret: - ![image_103.png](WorkshopGuide_media/image_103.png) - Create now a new secret named MLM\_LICENSE\_TOKEN by pasting the secret we provided for this workshop: - ![image_104.png](WorkshopGuide_media/image_104.png) - It should now look like this: - ![image_105.png](WorkshopGuide_media/image_105.png) - **Part 6.2: Modify the CI workflow to include a compilation step** - Let's now activate the compilation step in our CI workflow. - For this, go back to MATLAB and open the ci.yml file using the project shortcut: - ![image_106.png](WorkshopGuide_media/image_106.png) - Change line 94 from ``` @@ -1335,58 +959,49 @@ And uncomment line 109 to 113: Let's now commit these changes and push to your remote repo. - There, start a pull request! - **Part 6.3: Download the resulting CTF file** - Once the `Deploy/ Release (main)` job is done, a new artifact is available at the bottom of the run page: - ![image_107.png](WorkshopGuide_media/image_107.png) - You can now download the CTF file and upload it to your Web App Server! - + # Workshop wrap\-up and additional information Congratulations! You've completed the Workshop! - **During this workshop, you have successfully:** -- generated tests using your command history and MATLAB Copilot -- automatically found and ran existing tests -- explored code coverage metrics for your tested code -- identified bugs based on your testing and code coverage -- automated your testing using GitHub Actions -- published your test and code coverage results to GitHub Pages - +- generated tests using your command history and MATLAB Copilot +- automatically found and ran existing tests +- explored code coverage metrics for your tested code +- identified bugs based on your testing and code coverage +- automated your testing using GitHub Actions +- published your test and code coverage results to GitHub Pages We hope this workshop has shown you the value of software testing, how approachable software testing is with MATLAB and MATLAB Test, and how to automate testing using continuous integration (CI) practices. - **Check out these links for more information about features we discussed and additional features that may help as you test your code:** -- Software testing video series: [https://www.mathworks.com/videos/series/software\-testing.html](https://www.mathworks.com/videos/series/software-testing.html) -- Generating tests with MATLAB Test: [https://www.mathworks.com/help/matlab\-test/ug/generate\-tests\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/generate-tests-for-matlab-source-code.html) -- Generating equivalence tests for automated C/C++ code generation: [https://www.mathworks.com/help/matlab\-test/ug/generate\-c\-code\-and\-test\-for\-equivalence.html](https://www.mathworks.com/help/matlab-test/ug/generate-c-code-and-test-for-equivalence.html) -- Parameterized testing: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) -- Property\-based testing: [https://en.wikipedia.org/wiki/Software\_testing\#Property\_testing]() -- Finding existing tests using "Find Tests": [https://www.mathworks.com/help/matlab\-test/ug/find\-tests\-that\-depend\-on\-files.html](https://www.mathworks.com/help/matlab-test/ug/find-tests-that-depend-on-files.html) -- MATLAB Test Browser: [https://www.mathworks.com/help/matlab/ref/testbrowser\-app.html](https://www.mathworks.com/help/matlab/ref/testbrowser-app.html) -- Code coverage: [https://www.mathworks.com/help/matlab\-test/ug/collect\-code\-coverage\-metrics\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/collect-code-coverage-metrics-for-matlab-source-code.html) -- CI Configuration Examples repository and badge examples: [https://github.com/mathworks/ci\-configuration\-examples](https://github.com/mathworks/ci-configuration-examples) -- Creating a MATLAB docker container for CI: [https://github.com/mathworks\-ref\-arch/matlab\-dockerfile/tree/main/alternates/non\-interactive](https://github.com/mathworks-ref-arch/matlab-dockerfile/tree/main/alternates/non-interactive) -- MATLAB build tool overview: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) -- MATLAB build tool introduction blog post: [https://blogs.mathworks.com/developer/2022/10/17/building\-blocks\-with\-buildtool](https://blogs.mathworks.com/developer/2022/10/17/building-blocks-with-buildtool/) -- Faster testing with MATLAB build tool blog post: [https://blogs.mathworks.com/developer/2025/07/02/test\-impact\-analysis\-intro](https://blogs.mathworks.com/developer/2025/07/02/test-impact-analysis-intro) -- Developer Zone blog: [https://blogs.mathworks.com/developer](https://blogs.mathworks.com/developer/) -- CI licensing for private repositories: [https://www.mathworks.com/support/batch\-tokens.html](https://www.mathworks.com/support/batch-tokens.html) - -Copyright 2026 The MathWorks, Inc. - +- Software testing video series: [https://www.mathworks.com/videos/series/software\-testing.html](https://www.mathworks.com/videos/series/software-testing.html) +- Generating tests with MATLAB Test: [https://www.mathworks.com/help/matlab\-test/ug/generate\-tests\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/generate-tests-for-matlab-source-code.html) +- Generating equivalence tests for automated C/C++ code generation: [https://www.mathworks.com/help/matlab\-test/ug/generate\-c\-code\-and\-test\-for\-equivalence.html](https://www.mathworks.com/help/matlab-test/ug/generate-c-code-and-test-for-equivalence.html) +- Parameterized testing: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) +- Property\-based testing: [https://en.wikipedia.org/wiki/Software\_testing\#Property\_testing]() +- Finding existing tests using "Find Tests": [https://www.mathworks.com/help/matlab\-test/ug/find\-tests\-that\-depend\-on\-files.html](https://www.mathworks.com/help/matlab-test/ug/find-tests-that-depend-on-files.html) +- MATLAB Test Browser: [https://www.mathworks.com/help/matlab/ref/testbrowser\-app.html](https://www.mathworks.com/help/matlab/ref/testbrowser-app.html) +- Code coverage: [https://www.mathworks.com/help/matlab\-test/ug/collect\-code\-coverage\-metrics\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/collect-code-coverage-metrics-for-matlab-source-code.html) +- CI Configuration Examples repository and badge examples: [https://github.com/mathworks/ci\-configuration\-examples](https://github.com/mathworks/ci-configuration-examples) +- Creating a MATLAB docker container for CI: [https://github.com/mathworks\-ref\-arch/matlab\-dockerfile/tree/main/alternates/non\-interactive](https://github.com/mathworks-ref-arch/matlab-dockerfile/tree/main/alternates/non-interactive) +- MATLAB build tool overview: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) +- MATLAB build tool introduction blog post: [https://blogs.mathworks.com/developer/2022/10/17/building\-blocks\-with\-buildtool](https://blogs.mathworks.com/developer/2022/10/17/building-blocks-with-buildtool/) +- Faster testing with MATLAB build tool blog post: [https://blogs.mathworks.com/developer/2025/07/02/test\-impact\-analysis\-intro](https://blogs.mathworks.com/developer/2025/07/02/test-impact-analysis-intro) +- Developer Zone blog: [https://blogs.mathworks.com/developer](https://blogs.mathworks.com/developer/) +- CI licensing for private repositories: [https://www.mathworks.com/support/batch\-tokens.html](https://www.mathworks.com/support/batch-tokens.html) + +Copyright 2026 The MathWorks, Inc. \ No newline at end of file diff --git a/WorkshopGuide_media/image_27.png b/WorkshopGuide_media/image_27.png index c985ea25a140682bcb2016bf061f3317fd3fc142..72e54fe6ac2b1ada32c2291e4de5f6ce621a4e4a 100644 GIT binary patch literal 95731 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 literal 29128 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 diff --git a/code/generateSimFun.m b/code/generateSimFun.m index e70fd49..7f02c99 100644 --- a/code/generateSimFun.m +++ b/code/generateSimFun.m @@ -32,7 +32,7 @@ % Create a simulation function simFun = modelObj.createSimFunction({'kel','kon','kdeg'}, ... - {'Drug','Receptor','Complex','RO'}, doseObj.TargetName, basevariantObj); + {'Plasma.Drug','Receptor','Complex','RO'}, doseObj.TargetName, basevariantObj); % Compile the simulation function for faster execution simFun.accelerate(); From f2e4509419c6dd40cc4a9fbc0d3503c34d101281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Huard?= <63874667+ChezJe@users.noreply.github.com> Date: Tue, 16 Jun 2026 23:50:57 +0200 Subject: [PATCH 3/4] Fixed units --- code/TMDD.sbproj | Bin 37058 -> 37046 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/code/TMDD.sbproj b/code/TMDD.sbproj index ed455acf509386fe87bd729ba037dad163e99aab..5415758adf6f5c130b81072f83724e80e917b06e 100644 GIT binary patch delta 34638 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%0Dfo5Oro>Ldz6_hyaN7T;RHJb=V6pN4$EQ3t)eL> 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

  • xc#-R^ty?j}_k*cm>Mx}zxI9MA4 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 From 186a604a90fd0c9201b8dfe861a39005b4ca3951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Huard?= <63874667+ChezJe@users.noreply.github.com> Date: Fri, 19 Jun 2026 10:43:20 +0200 Subject: [PATCH 4/4] Added comments to buildfile --- WorkshopGuide.md | 649 ++++++++++++++++++++++++++++++++++++----------- buildfile.m | 1 + 2 files changed, 496 insertions(+), 154 deletions(-) diff --git a/WorkshopGuide.md b/WorkshopGuide.md index 72a5c77..a10ae1b 100644 --- a/WorkshopGuide.md +++ b/WorkshopGuide.md @@ -1,283 +1,337 @@ + # "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" Workshop Guide This workshop provides a step\-by\-step guide to generating automated tests using the MATLAB Unit Test Framework and MATLAB Test. + In this workshop, you will: -- fork and modify your own copy of the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository on GitHub -- generate tests using your command history and MATLAB Copilot -- automatically find and run existing tests -- explore code coverage metrics for your tested code -- automate your testing using continuous integration (CI) practices with GitHub Actions and build tool +- fork and modify your own copy of the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository on GitHub +- generate tests using your command history and MATLAB Copilot +- automatically find and run existing tests +- explore code coverage metrics for your tested code +- automate your testing using continuous integration (CI) practices with GitHub Actions and build tool ## Table of Contents - [Workshop Requirements](#H_34C2FB57) - -<<<<<<< HEAD - [Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing](#TMP_59e6) - - [Part 2: Generating your first tests](#TMP_02c5) - - [Part 3: Finding existing tests and measuring coverage](#TMP_885c) - - [Part 4: Updating badges, committing our changes, and pushing to GitHub](#TMP_0713) - - [Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results](#TMP_0a39) + [Workshop Requirements](#H_34C2FB57) - [Part 6: Compile the App in the CI workflow and download the artifact](#TMP_8913) + [Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing](#TMP_71a3) - [Workshop wrap\-up and additional information](#TMP_6893) -======= - [Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing](#TMP_13b6) + [Part 2: Generating your first tests](#TMP_39e1) - [Part 2: Generating your first tests](#TMP_2e3d) + [Part 3: Finding existing tests and measuring coverage](#TMP_9a8b) - [Part 3: Finding existing tests and measuring coverage](#TMP_1705) + [Part 4: Updating badges, committing our changes, and pushing to GitHub](#TMP_8100) - [Part 4: Updating badges, committing our changes, and pushing to GitHub](#TMP_6bc5) + [Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results](#TMP_8979) - [Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results](#TMP_179e) + [Part 6: Compile the App in the CI workflow and download the artifact](#TMP_720e) - [Part 6: Compile the App in the CI workflow and download the artifact](#TMP_7706) - - [Workshop wrap\-up and additional information](#TMP_5ff9) ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + [Workshop wrap\-up and additional information](#TMP_3054) - # Workshop Requirements The following steps cover all of the things you will need to successfully complete the workshop: + **A) Access to MATLAB Online or a desktop MATLAB with the MATLAB Test*****™*** **product** -- Go to: [https://matlab.mathworks.com](https://matlab.mathworks.com/) -- *Note:* If you do not have a MathWorks account, the above link will ask you to create an account for free +- Go to: [**https://matlab.mathworks.com**](https://matlab.mathworks.com/) +- *Note:* If you do not have a MathWorks account, the above link will ask you to create an account for free **B) Access to MATLAB Online or a desktop MATLAB with MATLAB Copilot** -- *Note:* If you do not have a license for MATLAB Copilot, you can simply skip that part of the workshop +- *Note:* If you do not have a license for MATLAB Copilot, you can simply skip that part of the workshop **C) A GitHub account** -- The workshop leverages the free repository and CI capabilities offered by GitHub and GitHub Actions -- Go to: [https://github.com/signup](https://github.com/signup) +- The workshop leverages the free repository and CI capabilities offered by GitHub and GitHub Actions +- Go to: [**https://github.com/signup**](https://github.com/signup) -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + # Part 1: Getting the workshop files and configuring GitHub for automated testing and results publishing In this section, you will: -1. Fork the workshop files to your personal GitHub account +1. Fork the workshop files to your personal GitHub account 2. Enable GitHub Actions for automated testing 3. Enable GitHub Pages for report publishing 4. Open the workshop in MATLAB + **Part 1.1: Fork the "Generating Tests for Your MATLAB Code Workshop" repository to your GitHub Account** + First, you'll start by forking the "[MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example)" repository to our own GitHub account. + **Wait... What does it mean to "fork a repository" and why should I do it?** + Forking a repository allows you to freely experiment with and push changes to a project without affecting the original project. + GitHub provides some great information about "why" and "how" to fork a repository here: [https://docs.github.com/en/enterprise\-cloud@latest/pull\-requests/collaborating\-with\-pull\-requests/working\-with\-forks/fork\-a\-repo](https://docs.github.com/en/enterprise-cloud@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) + **However**, In our case, we will use forking as a way for everyone to have his/her own remote repository as everyone would be pushing the same changes to one single repo otherwise. + Since the forked repo is not meant to be pushed back to the original repository, we will make it standalone. + Let's get started! -**Go to:** [https://github.com/simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example) + +**Go to:** [**https://github.com/simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example**](https://github.com/simkaryote/MATLAB-SimBiology-DevOps-Workflow-Example) + ![image_0.png](WorkshopGuide_media/image_0.png) + **Press the "Fork" button (top right)** + ![image_1.png](WorkshopGuide_media/image_1.png) + **Create your fork** + GitHub offers the ability to rename your copy of the repository, but this guide will assume the default name. + ![image_2.png](WorkshopGuide_media/image_2.png) + ***Notes:*** -- You may need to log into your GitHub account again during this step -- There's no problem with renaming your copy of the repository, but the rest of the workshop guide and screenshots assume the default repository name +- You may need to log into your GitHub account again during this step +- There's no problem with renaming your copy of the repository, but the rest of the workshop guide and screenshots assume the default repository name + **Once you've forked the repository, you should see:** -- your GitHub username at the top of your repository -- "forked from simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example" +- your GitHub username at the top of your repository +- "forked from simkaryote/MATLAB\-SimBiology\-DevOps\-Workflow\-Example" ![image_3.png](WorkshopGuide_media/image_3.png) + **Let's make it now standalone for the sake of the workshop.** + ![image_4.png](WorkshopGuide_media/image_4.png) + ![image_5.png](WorkshopGuide_media/image_5.png) + Now your repository is standalone and not linked to the original repository. + Before you go to MATLAB, let's enable some useful GitHub features that will be automatically triggered when we push our changes to GitHub later. + **Part 1.2: Enable GitHub Actions** + GitHub offers built\-in continuous integration (CI) services via their "GitHub Actions" feature. By default, GitHub Actions is disabled for forked repositories that contain a GitHub Actions YAML file, so you'll have to enable Actions before you can use them for the workshop. The workshop already provides a GitHub Actions YAML file to automatically test your code and publish test results so you can see them directly from your repository every time you push your code. + **Select the "Actions" tab** + ![image_6.png](WorkshopGuide_media/image_6.png) + **Click the "I understand my workflows, go ahead and enable them" button** + ![image_7.png](WorkshopGuide_media/image_7.png) + And that's it! GitHub Actions is now enabled for your repository. + **Part 1.3: Enable GitHub Pages to publish our test results** + GitHub offers a built\-in way to publish test reports and artifacts created from your CI jobs. By default, GitHub Pages is disabled for new repositories, so we'll have to enable GitHub Pages before we can publish our test reports. + **Select the "Settings" tab** + ![image_8.png](WorkshopGuide_media/image_8.png) + **Select the "Pages" entry on the left\-side navigation panel** + ![image_9.png](WorkshopGuide_media/image_9.png) + **Change the "Build and deployment > Source" dropdown and select "GitHub Actions"** + ![image_10.png](WorkshopGuide_media/image_10.png) + GitHub Pages is now enabled and your GitHub Actions will be allowed to publish test results for everyone to see. + + **Part 1.4: Open the workshop in MATLAB Online or in your MATLAB Desktop** + *Notes:* -- You may also do this workshop using a desktop MATLAB with the MATLAB Test product installed. -- If you do not have the MATLAB Test product, you will not see the right\-click menu items and buttons described below +- You may also do this workshop using a desktop MATLAB with the MATLAB Test product installed. +- If you do not have the MATLAB Test product, you will not see the right\-click menu items and buttons described below + Let's get started! -**Go to:** [https://matlab.mathworks.com](https://matlab.mathworks.com) -- *Note:* If you do not have a MathWorks account, you will need to create one before continuing. +**Go to:** [**https://matlab.mathworks.com**](https://matlab.mathworks.com) + +- *Note:* If you do not have a MathWorks account, you will need to create one before continuing. + **Get the workshop files selecting Home > New > Git Clone** + ![image_11.png](WorkshopGuide_media/image_11.png) + **Enter the URL of your GitHub repository in the dialog and hit "Clone"** + ![image_12.png](WorkshopGuide_media/image_12.png) + -**Open the workshop project by double\-clicking on the** [`DevOps.prj`](./DevOps.prj) **file** + +**Open the workshop project by double\-clicking on the** [**`DevOps.prj`**](./DevOps.prj) **file** + A MATLAB project is a useful tool that makes it easy to: -- automatically set up your path consistently across multiple users and machines -- run startup and shutdown scripts when you open or close the project -- keep one project from affecting the environment of another project +- automatically set up your path consistently across multiple users and machines +- run startup and shutdown scripts when you open or close the project +- keep one project from affecting the environment of another project ![image_13.png](WorkshopGuide_media/image_13.png) + **Give MATLAB permission to run project startup tasks** + As part of our commitment to security, MATLAB will ask you for permission before executing any code during project startup the first time you open a project. + For this workshop, the code we are executing during project startup is to automatically open the workshop guide ([`WorkshopGuide.m`](./WorkshopGuide.m)) for you when you open the project. + In the following dialog, please select "Open" to open the project and run this startup task. + ![image_14.png](WorkshopGuide_media/image_14.png) + Your MATLAB now should look something like this: + ![image_15.png](WorkshopGuide_media/image_15.png) + *Notes:* -- You will not see the "Copilot Chat" panel on the right if you do not have access to MATLAB Copilot +- You will not see the "Copilot Chat" panel on the right if you do not have access to MATLAB Copilot + **Part 1.5: Switch to a development branch** + After cloning the repo, you will be seeing the default main branch. + It is good practice to create a new branch and switch to it to make new development, push it to your remote repo and merge your branch with the main branch (more on this later...). + Let's open the branch manager from the "Project" tab: + ![image_16.png](WorkshopGuide_media/image_16.png) + And create a new `dev` branch and switch to it: + ![image_17.png](WorkshopGuide_media/image_17.png) + ![image_18.png](WorkshopGuide_media/image_18.png) + Now you're ready to work on your project and, for example, start generating tests! + **Part 1.5: Let's run the app!** + Click on the 'Run App' shortcut to start the app in MATLAB: + ![image_19.png](WorkshopGuide_media/image_19.png) + ![image_20.png](WorkshopGuide_media/image_20.png) -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + + # Part 2: Generating your first tests In this section, you will: -1. Generate tests using your command history +1. Generate tests using your command history 2. Generate tests using MATLAB Copilot 3. Add generated tests to your project + **Part 2.1: Generating your first test using Command History** -**Open the** [`SimulationModel`](./code/SimulationModel.m) class **(found in the code folder)** + +**Open the** [**`SimulationModel`**](./code/SimulationModel.m) class **(found in the code folder)** ```matlab edit SimulationModel.m ``` -**Interactively test** [`SimulationModel`](./code/SimulationModel.m) **using the MATLAB Command Window** + +**Interactively test** [**`SimulationModel`**](./code/SimulationModel.m) **using the MATLAB Command Window** + Here's an example code you can run at the Command Window: @@ -291,352 +345,502 @@ all(ismember(sObj.SimData.DataNames,["Drug","Receptor","Complex","RO"])) ![image_21.png](WorkshopGuide_media/image_21.png) -**Generate your first test for the** [`SimulationModel`](./code/SimulationModel.m) class **using our command history** + +**Generate your first test for the** [**`SimulationModel`**](./code/SimulationModel.m) class **using our command history** + While we could start creating a test from scratch, wouldn't it be nice if we could reuse the interactive testing we did at the Command Window? + As of MATLAB R2025a, MATLAB Test introduced a feature to generate a test from your command history. + **Go to the Command History panel** + ![image_22.png](WorkshopGuide_media/image_22.png) + *Note:* If you don't see the Command History panel icon, you can add the icon by selecting the "`...`" option and selecting the "Command History" item. + ![image_23.png](WorkshopGuide_media/image_23.png) + ![image_24.png](WorkshopGuide_media/image_24.png) + *Note:* You can also access your command history by pressing the "up" key while at the MATLAB Command Window. + **Right\-Click one of your calls** **and select "Generate Test"** + ![image_25.png](WorkshopGuide_media/image_25.png) + + This will automatically gather all relevant code lines needed to execute that command successfully and generate a test template for you: + ![image_26.png](WorkshopGuide_media/image_26.png) + **Check that both assertions are true and rename the class and the test** + ![image_27.png](WorkshopGuide_media/image_27.png) + **Save your test to the** **`tests`** **folder** + ![image_28.png](WorkshopGuide_media/image_28.png) + **Run your test using the "Run Tests" button in the Editor toolstrip** + ![image_29.png](WorkshopGuide_media/image_29.png) + As of MATLAB R2023a, running tests from the Editor toolstrip will automatically open the MATLAB Test Browser. + The MATLAB Test Browser makes it easy to: -- rerun tests without being in the test file -- explore test failure diagnostics -- filter results based on test status (pass, fail, incomplete) -- enable code coverage -- enable parallel test execution +- rerun tests without being in the test file +- explore test failure diagnostics +- filter results based on test status (pass, fail, incomplete) +- enable code coverage +- enable parallel test execution ![image_30.png](WorkshopGuide_media/image_30.png) + After your tests are done running, you will be able to to quickly see that your tests have passed. Yay! + + **Part 2.2: Generate tests using MATLAB Copilot** + As of MATLAB R2025a, MATLAB now offers MATLAB Copilot (requires a separate license) that enables GenAI capabilities optimized for MATLAB code. As with most platforms, we have a MATLAB Copilot chat panel to use AI in a conversational way. + To make testing even easier, MATLAB Test enables 1\-click buttons to automatically generate tests for the code you are looking at. + *Note:* Only the "Generate test for the current file using Copilot" option uses MATLAB Copilot. All other test generation options do not use any LLM technology and create tests using templates and static code analysis. -**Go back to** [`SimulationModel.m`](./code/SimulationModel.m) + + +**Go back to** [**`SimulationModel.m`**](./code/SimulationModel.m) ```matlab edit SimulationModel.m ``` + **In the Editor toolstrip, expand the "Generate Test" drop down menu and select "Generate test for the current file using MATLAB Copilot"** + ![image_31.png](WorkshopGuide_media/image_31.png) + + MATLAB Copilot will generate multiple ready\-to\-run tests. + ![image_32.png](WorkshopGuide_media/image_32.png) + *Note:* As with all LLM\-based technologies, remember to validate the output before using it in production systems. + + **Save and run your generated tests** + Just like before, save your new tests to the `tests` folder and run your tests. + ![image_33.png](WorkshopGuide_media/image_33.png) + **Look at your test results in the MATLAB Test Browser** -- *Note:* Depending on the tests MATLAB Copilot generates, you may or may not end up with some failing tests. +- *Note:* Depending on the tests MATLAB Copilot generates, you may or may not end up with some failing tests. ![image_34.png](WorkshopGuide_media/image_34.png) + + The test done on lines 29 & 30 in `testSimulateFunction` does not seem right. Let's delete those lines and rerun the test. + ![image_35.png](WorkshopGuide_media/image_35.png) + ![image_36.png](WorkshopGuide_media/image_36.png) + + **Part 2.3: Add generated tests to your project** + When you create a new file directly from the Project side panel, the file is automatically added to the project and to source control. + However, when you create a new file in another way (e.g., "New > Function," the "+" button on the Editor's tab toolbar, or the test generation options), MATLAB leaves it up to you to decide whether or not to include the file in your project. + Let's add our 2 new test files to the project + **Find your new test files in the** **`tests`** **folder using the Project side panel** + Go back to the Project side panel. + You can identify files not in your project when the Status column is not a check mark or the Git column is an empty circle. + ![image_37.png](WorkshopGuide_media/image_37.png) + **Right\-click the test files and select "Add to Project"** + ![image_38.png](WorkshopGuide_media/image_38.png) + **Confirm your test files have been added to the project by seeing the check mark in the Status column and the "+" icon in the Git column** + ![image_39.png](WorkshopGuide_media/image_39.png) + Congratulations! You just created multiple tests for your MATLAB code! + It was easier than you thought, right? -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + # Part 3: Finding existing tests and measuring coverage In this section, you will: -1. Find existing tests for [`generateSimFun.m`](./code/generateSimFun.m) +1. Find existing tests for [`generateSimFun.m`](./code/generateSimFun.m) 2. Enable and explore code coverage 3. Identify missing coverage 4. Add a test point to an existing test file + **Part 3.1: Finding existing tests for a code file** + When working with a new codebase or making changes to an existing file, you should run any existing tests that exercise that function to make sure you haven't broken anything. + But this raises several questions: -- Are there are any existing tests? -- Where are the tests? -- Should we just run all the tests? -- How do we know which tests (or if any tests) actually exercise the code we are working on? +- Are there are any existing tests? +- Where are the tests? +- Should we just run all the tests? +- How do we know which tests (or if any tests) actually exercise the code we are working on? + In MATLAB R2025a, MATLAB Test introduced a "Find Tests" feature that automatically finds any tests related to the file you are looking at and ignores any tests that are not related to this file. + Let's see how this works using the [`generateSimFun`](./code/generateSimFun.m) function: ```matlab edit generateSimFun.m ``` + **Press the "Find Tests" button in the Editor toolstrip** + ![image_40.png](WorkshopGuide_media/image_40.png) + **Select the root of your project to identify all tests in your project** -- *Note:* This root of your project is the default location, so you can just choose "OK" +- *Note:* This root of your project is the default location, so you can just choose "OK" MATLAB automatically will perform a dependency analysis on `generateSimFun`. + ![image_41.png](WorkshopGuide_media/image_41.png) + After the dependency analysis, you will see several tests that are related to `generateSimFun` open in the MATLAB Test Browser. + ![image_42.png](WorkshopGuide_media/image_42.png) + **Run the tests in the MATLAB Test Browser using the MATLAB Test Browser's "Run" button** + ![image_43.png](WorkshopGuide_media/image_43.png) + It looks like all the tests passed! Yay! + ![image_44.png](WorkshopGuide_media/image_44.png) + + **Part 3.2: Using code coverage to understand how much of your code is being exercised by your tests** + It was great that we already had tests for [`generateSimFun`](./code/generateSimFun.m), but how much of [`generateSimFun`](./code/generateSimFun.m) is being exercised by those tests? + "Code coverage" is a way to measure how much and which parts of your code have been exercised by tests. + There are several types of code coverage metrics: -- Statement coverage: Measure which statements have been executed -- Decision coverage: Measures whether both `true` and `false` conditions have been exercised for logical branches (e.g., `if`, `switch/case`) -- Condition coverage: When logical branches are composed of multiple logical conditions (e.g., `x > 5 && x < 10`), this measures whether each logical statement that is part of the `if` statement has been exercised for both `true` and `false` values -- Modified Condition/Decision Coverage (MC/DC): A modified set of decision + condition coverage metrics that is primarily used in code certification processes +- Statement coverage: Measure which statements have been executed +- Decision coverage: Measures whether both `true` and `false` conditions have been exercised for logical branches (e.g., `if`, `switch/case`) +- Condition coverage: When logical branches are composed of multiple logical conditions (e.g., `x > 5 && x < 10`), this measures whether each logical statement that is part of the `if` statement has been exercised for both `true` and `false` values +- Modified Condition/Decision Coverage (MC/DC): A modified set of decision + condition coverage metrics that is primarily used in code certification processes *Note:* Decision, Condition, and MC/DC metrics require MATLAB Test. + The MATLAB Unit Test Framework can automatically measure code coverage, but it is off by default, so let's enable code coverage! + **Open code coverage settings** + ![image_45.png](WorkshopGuide_media/image_45.png) + **Enable coverage reporting** + ![image_46.png](WorkshopGuide_media/image_46.png) + + **Select the "Condition" coverage metric** + ![image_47.png](WorkshopGuide_media/image_47.png) + *Note:* For this workshop, we will skip MC/DC since it is a significantly more advanced topic and primarily used in certification workflows. + + **Add the** **`code`** **folder to the "Source" list** + By selecting specific files or folders, we can focus our code coverage measurements on only the files and folders you select and avoid complicating our code coverage reports with code that is less critical for our application. + ![image_48.png](WorkshopGuide_media/image_48.png) + + **Deselect "Open coverage report after run"** + While this option can conveniently open the coverage report after every test run, it can sometimes be distracting when you are rerunning tests frequently. + ![image_49.png](WorkshopGuide_media/image_49.png) + **Close the Coverage Settings** + ![image_50.png](WorkshopGuide_media/image_50.png) + **Rerun your tests** + ![image_51.png](WorkshopGuide_media/image_51.png) + **Click the link in the Command Window to open the code coverage report** + ![image_52.png](WorkshopGuide_media/image_52.png) + You should see a Code Coverage Report very similar to the one below. + ![image_53.png](WorkshopGuide_media/image_53.png) + The top of the report gives you an overall summary of the coverage metrics for all of the code in the folders you have chosen, while the "Breakdown by Source" table gives you a breakdown of the coverage metrics by file. + For this workshop, we will focus on the "Breakdown by Source" and the detailed coverage inside the code files. + + **Part 3.3: Identifying testing gaps (and potential bugs) for** [`generateSimFun`](./code/generateSimFun.m) **using code coverage** + Let's look at the detailed coverage metrics for the [`generateSimFun`](./code/generateSimFun.m) file and and see which parts of the code have been exercised. + **Select the** [`generateSimFun.m`](./code/generateSimFun.m) **row in the "Breakdown by Source" table** + ![image_54.png](WorkshopGuide_media/image_54.png) + + **Scroll down to see the detailed source code and coverage metrics** + ![image_55.png](WorkshopGuide_media/image_55.png) + Well, that seems like a rather boring detailed report, right? + The reason you don't really see any interesting data in Source Details is because you are looking at the "Condition" coverage metric, but [`generateSimFun`](./code/generateSimFun.m) is a very simple code with no conditions in its logical branches. You can also see that the "Condition" column is empty, which is another clue for why the source details look empty. + However, you can see that the Statement and Decision columns have data in them, so let's take a look at those coverage metrics. + **Select "Decision" coverage in the "Currently viewing" overlay at the top of the page** + Now the coverage report looks much more interesting! + ![image_56.png](WorkshopGuide_media/image_56.png) + There are several kinds of highlights you can see in the source code: -- Green: Both `true` and `false` decisions have been exercised -- Yellow: Only one of the `true` or `false` decisions have been exercised -- Red: None of the `true` or `false` decisions have been exercised +- Green: Both `true` and `false` decisions have been exercised +- Yellow: Only one of the `true` or `false` decisions have been exercised +- Red: None of the `true` or `false` decisions have been exercised *Note:* The coverage report does not have any red because all of the decision branches have been at least partially exercised by at least one test + In addition to the source code highlights, the "Decision" column shows how many times each decision outcome (`true` and `false`) has been exercised by your tests. You can use these numbers to identify which condition outcome you did not exercise or help you decide whether you want to exercise a specific code branch more times. + We can also take a look at the "Statement" coverage metrics to see which statements in our code have and have not been exercised by our tests. + **Select "Statement" coverage in the "Currently viewing" overlay at the top of the page** + ![image_57.png](WorkshopGuide_media/image_57.png) + From the highlights, we can see that line 4 of our code has never been exercised by our tests. + Now you can ask the questions: -- Do I just need an extra test to exercise this piece of the code? -- Is this code unreachable (i.e., is it "dead code") and can be removed? -- Or is this a symptom of a bug in our code? +- Do I just need an extra test to exercise this piece of the code? +- Is this code unreachable (i.e., is it "dead code") and can be removed? +- Or is this a symptom of a bug in our code? + **Part 3.4: Add an additional automated test point for** [`generateSimFun`](./code/generateSimFun.m) + **Open the test file for** [`generateSimFun`](./code/generateSimFun.m) **and add another test point** + Wait... Where is the test file for [`generateSimFun`](./code/generateSimFun.m) ? You never actually saw the test file because you found the tests using "Find Tests." + Luckily, the MATLAB Test Browser makes it easy to open the test files related to each test by simply clicking on the test file name. In this case, all of the test points are located in the [`tgenerateSimFun.m`](./tests/tgenerateSimFun.m) file. + ![image_58.png](WorkshopGuide_media/image_58.png) + + This is what the test file looks like: + ![image_59.png](WorkshopGuide_media/image_59.png) + Hm... This seems a bit different than the tests we saw before. The MATLAB Test Browser showed 5 tests, but this test file looks like it only has 3 tests in it. + What's going on here? + The answer: The second test in [`tgenerateSimFun.m`](./tests/tgenerateSimFun.m) is a parameterized test. + + **Understanding parameterized tests** + A parameterized test is a kind of test that enables you to reuse a single test function across multiple test points (i.e., across multiple inputs). + Parameterized tests are extremely useful when: -- you need to test a code multiple times with multiple inputs -- the calling syntax is the same across multiple tests -- the verifications are the same across multiple tests +- you need to test a code multiple times with multiple inputs +- the calling syntax is the same across multiple tests +- the verifications are the same across multiple tests + The way a parameterized test works is by defining a test parameter (or multiple test parameters) that contain the inputs you want to pass into your code, and passing that test parameter to your test function. + ![image_60.png](WorkshopGuide_media/image_60.png) + Looking at the second test function, you can see it takes this test parameter as an additional input. This test parameter will have a different value every time the function is called. + ![image_61.png](WorkshopGuide_media/image_61.png) + *Note:* You can learn more about parameterized testing here: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) + Similarly, parameters can be used in other methods such as `classSetup`, which is a method that is called once before running all tests. + ![image_62.png](WorkshopGuide_media/image_62.png) + ![image_63.png](WorkshopGuide_media/image_63.png) + **Add another test point** + To add another test point, you need to add another value to the `MATfilename` ClassSetupParameter cell array. + To do this, you can replace the following code: ``` @@ -651,329 +855,461 @@ MATfilename = {"test_generateSimFun.mat", string.empty} **Rerun your tests and look at the coverage report** + *Note:* You must use the "Run Tests" button in the Editor toolstrip to to pick up the new test point we added. The "Run" button in the MATLAB Test Browser will only run the tests that are loaded in the panel. It will not automatically pick up new tests in the files. + ![image_64.png](WorkshopGuide_media/image_64.png) + It looks like we've achieved full statement coverage for [`generateSimFun`](./code/generateSimFun.m). Yay! + ![image_65.png](WorkshopGuide_media/image_65.png) -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + + # Part 4: Updating badges, committing our changes, and pushing to GitHub In this section, you will: -1. Update the repository badges in [`README.md`](./README.md) +1. Update the repository badges in [`README.md`](./README.md) 2. Commit our changes to source control 3. Generate a GitHub Personal Access Token 4. Push our changes to GitHub + **Part 4.1: Update repository badges** + ![image_66.png](WorkshopGuide_media/image_66.png) + Repository badges are great ways to showcase and allow exploration of the quality of your code. Badges are defined in a repository's [`README.md`](./README.md). + One unfortunate aspect of badges is that they are always hardcoded to a specific repository's URL. Since you forked these badges from another repository, you will need to update the badge so they point to your repository instead. + To make this easy, the workshop provides a useful project shortcut that will automatically update the links in your [`README.md`](./README.md) file. + **Update the badges by single\-clicking the "Update README Link" item in the "Shortcuts" section of the Project toolstrip** + ![image_67.png](WorkshopGuide_media/image_67.png) + *Note*: If you want to manually update the links, you will need to make the following changes to all of the links in the [`README.md`](./README.md) file: -- replace the "simkaryote" GitHub username with your GitHub username -- if you renamed the repository during the fork process in [Part 1.1](#H_DB2C80D4), replace "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" repository name with your GitHub repository name +- replace the "simkaryote" GitHub username with your GitHub username +- if you renamed the repository during the fork process in [Part 1.1](#H_DB2C80D4), replace "MATLAB\-SimBiology\-DevOps\-Workflow\-Example" repository name with your GitHub repository name + Your badges will now be up\-to\-date and point to your personal repository once you commit and push your changes. + + **Part 4.2: Commit our changes to source control** + Now that you've added tests, and updated your badges, it's time to commit your changes ! + **In the "Project" toolstrip, press "Commit"** + ![image_68.png](WorkshopGuide_media/image_68.png) + **Type in a useful commit message and press "Commit"** + ![image_69.png](WorkshopGuide_media/image_69.png) + + You have now committed your changes. + Usually, the next step is to push our changes back to GitHub. This is really easy and straightforward when using Git from a desktop application (e.g., the desktop version of MATLAB). If we are pushing our changes from an online application like MATLAB Online, or if you don't have the Git Credential Manager on your machine, GitHub requires a personal access token to allow MATLAB Online to make changes to your GitHub repository. + + **Part 4.3: Generating a GitHub Personal Access token to enable MATLAB Online to push our changes to our GitHub repository** + **(only needed if you use MATLAB Online, SKIP if you use a desktop MATLAB installation !)** + ![image_70.png](WorkshopGuide_media/image_70.png) + Over the last few years, GitHub has increased its focus on security. One of the major user\-facing ways GitHub is enforcing some of these better security practices is by [moving away from the use of passwords](https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/), and recommending that people use personal access tokens instead. + Personal access tokens are meant to be treated like passwords: -- They are supposed to be difficult or impossible to memorize or guess -- They are not meant to be written down -- They are not meant to be shared with others +- They are supposed to be difficult or impossible to memorize or guess +- They are not meant to be written down +- They are not meant to be shared with others + When you install Git on your desktop, it comes with the Git Credential Manager. The Git Credential Manager will accept a username/password combination, it will securely get and store a personal access token for you, and it will make it very easy to push and pull changes without manually generating a personal access token. + For a MATLAB Online session or other situations, you will need to manually create a personal access token to give MATLAB Online permission to push changes to your GitHub repository. GitHub provides directions for [how to create a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token), but this part of the workshop will give you a step\-by\-step guide to creating your own personal access token. + + **On GitHub, press your profile picture (top right of the page) and select "Settings"** + ![image_71.png](WorkshopGuide_media/image_71.png) + **Select "Developer settings" at the bottom of the left\-hand navigation menu** + ![image_72.png](WorkshopGuide_media/image_72.png) + **Select "Personal access tokens > Fine\-grained tokens"** + ![image_73.png](WorkshopGuide_media/image_73.png) + **Press "Generate new token"** + ![image_74.png](WorkshopGuide_media/image_74.png) + ***Note:*** You may need to log into GitHub again to complete this action. + + **Name your token** + ![image_75.png](WorkshopGuide_media/image_75.png) + + **Limit token access to only the workshop repo** + ![image_76.png](WorkshopGuide_media/image_76.png) + + **Select "Add Permissions > Contents + Workflows" to enable pushing changes to your repository** + ![image_77.png](WorkshopGuide_media/image_77.png) + ![image_78.png](WorkshopGuide_media/image_78.png) + **Change "Contents" access permissions to "Read and write"** + ![image_79.png](WorkshopGuide_media/image_79.png) + + **Press "Generate token"** + ![image_80.png](WorkshopGuide_media/image_80.png) + + **Confirm the creation of the token** + ![image_81.png](WorkshopGuide_media/image_81.png) + **Copy your personal access token to your clipboard** + ***WARNING:*** -- You only have 1 chance to copy the personal access token, so do not navigate away from the page until you have used the token wherever you need it -- If you forget to copy your token string or you need to give another service access to your repository at a later time, you will need to create a new token +- You only have 1 chance to copy the personal access token, so do not navigate away from the page until you have used the token wherever you need it +- If you forget to copy your token string or you need to give another service access to your repository at a later time, you will need to create a new token + Any service that generates access token strings will only allow you to see or copy the token string the moment the token is created. As soon as you refresh the page or navigate away, the token string will be hidden forever. This protects you from having your token stolen or copied if someone breaks into your account. + ![image_82.png](WorkshopGuide_media/image_82.png) + Your personal access token should start with "`github_pat_`" followed by many alphanumeric characters. + + **Part 4.4: Pushing your changes to GitHub** + Now let's push your changes to GitHub! + **In the Projects tab, press the "Push" button** + ![image_83.png](WorkshopGuide_media/image_83.png) + **Enter your username and paste your personal access token into the MATLAB Online Git dialog and press "OK"** + ![image_84.svg](WorkshopGuide_media/image_84.svg) + + At this point, all of your changes will be pushed to GitHub. + ![image_85.png](WorkshopGuide_media/image_85.png) -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + + # Part 5: Create a pull request, watch GitHub Actions automatically test your changes and publish results In this section, you will: -1. Create a pull request +1. Create a pull request 2. Explore GitHub Actions as it automatically tests your changes and publishes test results 3. View your published test and code coverage results **Part 5.1: Create a pull request to merge your new code into the main branch** + After pushing your new branch to the remote repo, it will automatically suggest to create a pull request: + ![image_86.png](WorkshopGuide_media/image_86.png) + You can follow this suggestion and click on the 'compare & pull request" button: + ![image_87.png](WorkshopGuide_media/image_87.png) + You can now add a description and press "Create pull request". + This will trigger a CI workflow to run our tests on the dev branch: + ![image_88.png](WorkshopGuide_media/image_88.png) + + **Part 5.2: Watch GitHub Actions automatically test your code** + Once you start the pull request, GitHub Actions will automatically test your code. + To make this possible, the workshop provides you a pre\-written [GitHub Actions YAML file](..github/workflows/ci.yml) that tells GitHub Actions how to get MATLAB and what to do with your code as soon as changes are pushed. -- You can learn more about GitHub Actions YAML files here: [https://docs.github.com/en/actions/reference/workflows\-and\-actions/workflow\-syntax](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax) +- You can learn more about GitHub Actions YAML files here: [https://docs.github.com/en/actions/reference/workflows\-and\-actions/workflow\-syntax](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax) + *Notes:* -- We are using the MATLAB build tool to automate some of the build actions, but all of these actions can be accomplished with simple MATLAB code, as well. -- You can learn more about the MATLAB build tool here: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) +- We are using the MATLAB build tool to automate some of the build actions, but all of these actions can be accomplished with simple MATLAB code, as well. +- You can learn more about the MATLAB build tool here: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) + **Click on the check to open the corresponding job run in the Action tab:** + ![image_89.png](WorkshopGuide_media/image_89.png) + You will see the different steps included in this job: + ![image_90.png](WorkshopGuide_media/image_90.png) + Once the tests ran successfully in the dev branch, you can merge the pull request: + ![image_91.png](WorkshopGuide_media/image_91.png) + In the Actions Tab, we will see the list of all job runs including the current one: + ![image_92.png](WorkshopGuide_media/image_92.png) + **Dive deeper by selecting the listed workflow item and Select the "build" box** + ![image_93.png](WorkshopGuide_media/image_93.png) + + **Observe the GitHub Actions log as your build is running** + ![image_94.png](WorkshopGuide_media/image_94.png) + + The icon next to the build reflects the result of the build. A green check mark means the build ran successfully. + ![image_95.png](WorkshopGuide_media/image_95.png) + + Another place you can see an indication of your passing build is on your repository home page. + ![image_96.png](WorkshopGuide_media/image_96.png) + *Note:* You may need to refresh your browser a few times or use "Shift+F5" for the status to update + + You now have a repository that will automatically test your code every time you push any changes! + + **Part 5.3: Viewing your test and coverage results directly in GitHub** + Once your build completes, anyone that can see your repository will be able to explore your published test and code coverage results. + The badges on your repository's home page offer an easy way to: -- See whether your last build passed or failed -- Open the published test report -- Open the published code coverage report +- See whether your last build passed or failed +- Open the published test report +- Open the published code coverage report + *Note:* Badge links will navigate your current browser tab to the link destination, so you will need to navigate back to the main repository page to select a different badge or report + + **View your test report by selecting the "Open Test Report" badge** + ![image_97.png](WorkshopGuide_media/image_97.png) + The test report looks like this: + ![image_98.png](WorkshopGuide_media/image_98.png) + + **View your code coverage report by selecting the "Open Code Coverage Report" badge** + ![image_99.png](WorkshopGuide_media/image_99.png) + The code coverage report looks like this: + ![image_100.png](WorkshopGuide_media/image_100.png) + + Now anyone that visits your repository can immediately see the quality of your code, explore your test and code coverage results, and will have more confidence in the code you are writing! -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + # Part 6: Compile the App in the CI workflow and download the artifact So far, we have only triggered tests and generated reports/badges. We were able to use free GitHub runner and licensing in our public repo. + However, our final goal is to compile our app into a web app. For this we will need a license of MATLAB Compiler. This will be provided by a BATCH TOKEN. + In this section, you will: -1. Add a batch token to your repository +1. Add a batch token to your repository 2. Modify the CI workflow to include a compilation step 3. Download the resulting CTF file **Part 6.1: Add a batch token to your repository** + Open the settings tab + ![image_101.png](WorkshopGuide_media/image_101.png) + On the left side, choose "Secrets and variables" \-> Actions + ![image_102.png](WorkshopGuide_media/image_102.png) + Let's add a new repository secret: + ![image_103.png](WorkshopGuide_media/image_103.png) + Create now a new secret named MLM\_LICENSE\_TOKEN by pasting the secret we provided for this workshop: + ![image_104.png](WorkshopGuide_media/image_104.png) + It should now look like this: + ![image_105.png](WorkshopGuide_media/image_105.png) + **Part 6.2: Modify the CI workflow to include a compilation step** + Let's now activate the compilation step in our CI workflow. + For this, go back to MATLAB and open the ci.yml file using the project shortcut: + ![image_106.png](WorkshopGuide_media/image_106.png) + Change line 94 from ``` @@ -999,53 +1335,58 @@ And uncomment line 109 to 113: Let's now commit these changes and push to your remote repo. + There, start a pull request! + **Part 6.3: Download the resulting CTF file** + Once the `Deploy/ Release (main)` job is done, a new artifact is available at the bottom of the run page: + ![image_107.png](WorkshopGuide_media/image_107.png) + You can now download the CTF file and upload it to your Web App Server! -<<<<<<< HEAD - -======= - ->>>>>>> 6bec994c233dc2e1d162f07833d107a881e2a295 + # Workshop wrap\-up and additional information Congratulations! You've completed the Workshop! + **During this workshop, you have successfully:** -- generated tests using your command history and MATLAB Copilot -- automatically found and ran existing tests -- explored code coverage metrics for your tested code -- identified bugs based on your testing and code coverage -- automated your testing using GitHub Actions -- published your test and code coverage results to GitHub Pages +- generated tests using your command history and MATLAB Copilot +- automatically found and ran existing tests +- explored code coverage metrics for your tested code +- identified bugs based on your testing and code coverage +- automated your testing using GitHub Actions +- published your test and code coverage results to GitHub Pages + We hope this workshop has shown you the value of software testing, how approachable software testing is with MATLAB and MATLAB Test, and how to automate testing using continuous integration (CI) practices. + **Check out these links for more information about features we discussed and additional features that may help as you test your code:** -- Software testing video series: [https://www.mathworks.com/videos/series/software\-testing.html](https://www.mathworks.com/videos/series/software-testing.html) -- Generating tests with MATLAB Test: [https://www.mathworks.com/help/matlab\-test/ug/generate\-tests\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/generate-tests-for-matlab-source-code.html) -- Generating equivalence tests for automated C/C++ code generation: [https://www.mathworks.com/help/matlab\-test/ug/generate\-c\-code\-and\-test\-for\-equivalence.html](https://www.mathworks.com/help/matlab-test/ug/generate-c-code-and-test-for-equivalence.html) -- Parameterized testing: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) -- Property\-based testing: [https://en.wikipedia.org/wiki/Software\_testing\#Property\_testing]() -- Finding existing tests using "Find Tests": [https://www.mathworks.com/help/matlab\-test/ug/find\-tests\-that\-depend\-on\-files.html](https://www.mathworks.com/help/matlab-test/ug/find-tests-that-depend-on-files.html) -- MATLAB Test Browser: [https://www.mathworks.com/help/matlab/ref/testbrowser\-app.html](https://www.mathworks.com/help/matlab/ref/testbrowser-app.html) -- Code coverage: [https://www.mathworks.com/help/matlab\-test/ug/collect\-code\-coverage\-metrics\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/collect-code-coverage-metrics-for-matlab-source-code.html) -- CI Configuration Examples repository and badge examples: [https://github.com/mathworks/ci\-configuration\-examples](https://github.com/mathworks/ci-configuration-examples) -- Creating a MATLAB docker container for CI: [https://github.com/mathworks\-ref\-arch/matlab\-dockerfile/tree/main/alternates/non\-interactive](https://github.com/mathworks-ref-arch/matlab-dockerfile/tree/main/alternates/non-interactive) -- MATLAB build tool overview: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) -- MATLAB build tool introduction blog post: [https://blogs.mathworks.com/developer/2022/10/17/building\-blocks\-with\-buildtool](https://blogs.mathworks.com/developer/2022/10/17/building-blocks-with-buildtool/) -- Faster testing with MATLAB build tool blog post: [https://blogs.mathworks.com/developer/2025/07/02/test\-impact\-analysis\-intro](https://blogs.mathworks.com/developer/2025/07/02/test-impact-analysis-intro) -- Developer Zone blog: [https://blogs.mathworks.com/developer](https://blogs.mathworks.com/developer/) -- CI licensing for private repositories: [https://www.mathworks.com/support/batch\-tokens.html](https://www.mathworks.com/support/batch-tokens.html) - -Copyright 2026 The MathWorks, Inc. \ No newline at end of file +- Software testing video series: [https://www.mathworks.com/videos/series/software\-testing.html](https://www.mathworks.com/videos/series/software-testing.html) +- Generating tests with MATLAB Test: [https://www.mathworks.com/help/matlab\-test/ug/generate\-tests\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/generate-tests-for-matlab-source-code.html) +- Generating equivalence tests for automated C/C++ code generation: [https://www.mathworks.com/help/matlab\-test/ug/generate\-c\-code\-and\-test\-for\-equivalence.html](https://www.mathworks.com/help/matlab-test/ug/generate-c-code-and-test-for-equivalence.html) +- Parameterized testing: [https://www.mathworks.com/help/matlab/matlab\_prog/use\-parameters\-in\-class\-based\-tests.html](https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html) +- Property\-based testing: [https://en.wikipedia.org/wiki/Software\_testing\#Property\_testing]() +- Finding existing tests using "Find Tests": [https://www.mathworks.com/help/matlab\-test/ug/find\-tests\-that\-depend\-on\-files.html](https://www.mathworks.com/help/matlab-test/ug/find-tests-that-depend-on-files.html) +- MATLAB Test Browser: [https://www.mathworks.com/help/matlab/ref/testbrowser\-app.html](https://www.mathworks.com/help/matlab/ref/testbrowser-app.html) +- Code coverage: [https://www.mathworks.com/help/matlab\-test/ug/collect\-code\-coverage\-metrics\-for\-matlab\-source\-code.html](https://www.mathworks.com/help/matlab-test/ug/collect-code-coverage-metrics-for-matlab-source-code.html) +- CI Configuration Examples repository and badge examples: [https://github.com/mathworks/ci\-configuration\-examples](https://github.com/mathworks/ci-configuration-examples) +- Creating a MATLAB docker container for CI: [https://github.com/mathworks\-ref\-arch/matlab\-dockerfile/tree/main/alternates/non\-interactive](https://github.com/mathworks-ref-arch/matlab-dockerfile/tree/main/alternates/non-interactive) +- MATLAB build tool overview: [https://www.mathworks.com/help/matlab/matlab\_prog/overview\-of\-matlab\-build\-tool.html](https://www.mathworks.com/help/matlab/matlab_prog/overview-of-matlab-build-tool.html) +- MATLAB build tool introduction blog post: [https://blogs.mathworks.com/developer/2022/10/17/building\-blocks\-with\-buildtool](https://blogs.mathworks.com/developer/2022/10/17/building-blocks-with-buildtool/) +- Faster testing with MATLAB build tool blog post: [https://blogs.mathworks.com/developer/2025/07/02/test\-impact\-analysis\-intro](https://blogs.mathworks.com/developer/2025/07/02/test-impact-analysis-intro) +- Developer Zone blog: [https://blogs.mathworks.com/developer](https://blogs.mathworks.com/developer/) +- CI licensing for private repositories: [https://www.mathworks.com/support/batch\-tokens.html](https://www.mathworks.com/support/batch-tokens.html) + +Copyright 2026 The MathWorks, Inc. + diff --git a/buildfile.m b/buildfile.m index c8e1d26..f93fa66 100644 --- a/buildfile.m +++ b/buildfile.m @@ -44,6 +44,7 @@ end function generateMDguideTask(~) + % Export workshop guide to Markdown proj = currentProject; export("WorkshopGuide.m",fullfile(proj.RootFolder,"WorkshopGuide.md"));